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

ggplot2 custom annotation containing bitmap, with reversed y scale

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

  1. 背景图片应填满整个情节
  2. 绘制在图像上的数据是其位置相对于背景图像以像素为单位的点。
  3. 理想情况下,我希望 y 比例反转,运行 从顶部的最小值到底部的最大值。 原因 我想要反转 y 比例是因为要绘制在图像上的数据原点在左上角。我知道我可以反映数据,但我宁愿不这样做。
  4. 我正在使用 R v3.2.3 和 ggplot v2.0.0。

在不反转 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

问题是我没完没了地找到一个获得反向 y 尺度的解决方案:我能得到的最接近的是以下内容,这绝对不是我所期望的需要。注意 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

另请注意,y 刻度的范围似乎偏离了(至少,相对于之前的图略微缩小)。

我是对 ggplot 要求太多了,还是只是做了一些愚蠢的事情?有什么建议吗?

所以这是解决方案(感谢 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

结果如下:

看来我自己应该能找到,但是,你知道....