Use an image as area fill in an R plot

前端 未结 1 1839
南方客
南方客 2020-12-03 02:36

How can I do a graph similar to this (the dollar image graph)? Or what packages can I do this with? I have a (gg)plot using geom_area.

Dollar graph image

相关标签:
1条回答
  • 2020-12-03 02:47

    This is purely for novelty purposes, right?

    In the code below, we cover up the portion of the dollar bill above the blue curve using geom_ribbon.

    library(jpeg)
    library(grid)
    library(ggplot2)
    library(scales)
    theme_set(theme_classic())
    
    # Load image of dollar bill and convert to raster grob
    download.file("https://2marks.files.wordpress.com/2013/07/george-washington-on-one-dollar-bill.jpg", 
                  "dollar_bill.jpg")
    db = readJPEG("dollar_bill.jpg")
    db = rasterGrob(db, interpolate=TRUE) 
    
    # Fake data
    set.seed(3)
    dat = data.frame(x=1913:2009)
    dat$y2 = seq(5,950, length=nrow(dat)) + rnorm(nrow(dat), 0, 5)
    dat$y1 = seq(100,5,length=nrow(dat)) + c(0, -0.5, rnorm(nrow(dat) - 2, 0, 2))
    
    ggplot(dat, aes(x, y1)) +
      annotation_custom(db, xmin=1913, xmax=2009, ymin=0, ymax=100) +
      geom_ribbon(aes(ymin=y1, ymax=100), fill="white") +
      geom_line(size=1, colour="blue") +
      geom_line(aes(y=y2/10), size=1, colour="red") +
      coord_fixed(ratio=1/2.5) +
      scale_y_continuous(limits=c(0,100), expand=c(0,0),
                         sec.axis=sec_axis(~.*10, name="Currency in Circulation\n(billions)", labels=dollar)) +
      scale_x_continuous(limits=c(1913,2009), expand=c(0,0)) +
      labs(x="", y="Purchasing Power\n(1913=100)") +
      theme(axis.text.y.right=element_text(colour="red"),
            axis.title.y.right=element_text(colour="red"),
            axis.text.y=element_text(colour="blue"),
            axis.title.y=element_text(colour="blue"),
            axis.title.x=element_blank())
    

    0 讨论(0)
提交回复
热议问题