包含位图的ggplot2自定义注释,具有反转的y比例

时间:2016-01-15 01:53:39

标签: r ggplot2 annotations coordinates scale

在ggplot中,我想使用自定义注释来设置位图(如本文末尾的位图)作为绘图的背景。其他要点是

  1. 背景图片应该填满整个情节
  2. 在图像上绘制的数据是其位置相对于背景图像以像素为单位的点。
  3. 理想情况下,我希望y比例反转,从最低值到最高值在底部运行。我希望y比例反转的原因是要在图像上绘制的数据的原点位于左上角。我知道我可以反映数据,但我不愿意。
  4. 我正在使用R v3.2.3和ggplot v2.0.0。
  5. 如果不改变y尺度,事情似乎很简单。这有效(例如建议here):

    require(ggplot2) ## packages png and grid are also needed.
    
    myurl <- "http://i.stack.imgur.com/pbmsi.png"
    tmp <- tempfile()
    download.file(myurl,tmp,mode="wb")
    bg <- png::readPNG(tmp)
    file.remove(tmp) # cleanup
    
    ysize <- dim(bg)[1]
    xsize <- dim(bg)[2]
    bg <- grid::rasterGrob(bg)
    
    D <- data.frame(x=seq(10, (xsize-10), length.out=10),
                  y=seq(10, (ysize-10), length.out=10))
    
    ## upright y scale  
    p <- ggplot(data=D, aes(x=x, y=y)) + geom_blank()
    p <- p + annotation_custom(bg,                      
                             xmin=0, ymin=0,
                             xmax=xsize, ymax=ysize)
    p <- p + coord_equal()
    p <- p + scale_x_continuous(limits=c(0,xsize), 
                              expand=c(0,0))
    p <- p + scale_y_continuous(limits=c(0, ysize), 
                              expand=c(0,0))
    p <- p + geom_point(size=5, color="blue", alpha=.6)
    p
    

    Figure 1

    问题在于我找到一个能够获得相反规模的解决方案时遇到了麻烦:我能得到的最接近的是以下,这绝对不是我期望的。注意annotation_custom()中的双反转y标度和负ymin。我尝试了很多变化,似乎无法想出更合理的东西。

    # reversed y  
    p <- ggplot(data=D, aes(x=x, y=y)) + geom_blank()
    p <- p + annotation_custom(bg,                      
                             xmin=0, ymin=-ysize,
                             xmax=xsize, ymax=0)
    p <- p + coord_equal()
    p <- p + scale_x_continuous(limits=c(0,xsize), 
                              expand=c(0,0))
    p <- p + scale_y_continuous(limits=c(0, ysize), 
                              expand=c(0,0), 
                              trans="reverse")
    p <- p + scale_y_reverse(expand=c(0,0))
    p <- p + geom_point(size=5, color="blue", alpha=.6)
    p
    

    Figure 2 还要注意y比例的范围似乎是关闭的(至少相对于之前的情节稍微减少)。

    我是否过多地询问ggplot,或者只是做了一些愚蠢的事情?有什么建议吗?

    Figure 3

1 个答案:

答案 0 :(得分:1)

所以这是解决方案(感谢aosmith):

require(ggplot2) ## packages png and grid are also needed.

myurl <- "http://i.stack.imgur.com/pbmsi.png"
tmp <- tempfile()
download.file(myurl,tmp,mode="wb")
bg <- png::readPNG(tmp)
file.remove(tmp) # cleanup

ysize <- dim(bg)[1]
xsize <- dim(bg)[2]
bg <- grid::rasterGrob(bg)

D <- data.frame(x=seq(10, (xsize-10), length.out=10),
          y=seq(10, (ysize-10), length.out=10))

# reversed y  
p <- ggplot(data=D, aes(x=x, y=y)) + geom_blank()
p <- p + annotation_custom(bg,                      
                     xmin=0, ymin=-ysize,
                     xmax=xsize, ymax=0)
p <- p + coord_equal()
p <- p + scale_x_continuous(limits=c(0,xsize), 
                      expand=c(0,0))
p <- p + scale_y_continuous(limits=c(0, ysize), 
                      expand=c(0,0), 
                      trans="reverse")
p <- p + geom_point(size=5, color="blue", alpha=.6)
p

结果如下:

enter image description here

似乎我应该能够找到自己,但是,你知道....