ggplot2 包含位图的自定义注释,具有反转的 y 比例
ggplot2 custom annotation containing bitmap, with reversed y scale
在 ggplot 中,我想使用自定义注释来设置位图(如本 post 最后的位图)作为绘图的背景。其他要点是
- 背景图片应填满整个情节
- 绘制在图像上的数据是其位置相对于背景图像以像素为单位的点。
- 理想情况下,我希望 y 比例反转,运行 从顶部的最小值到底部的最大值。 原因 我想要反转 y 比例是因为要绘制在图像上的数据原点在左上角。我知道我可以反映数据,但我宁愿不这样做。
- 我正在使用 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
结果如下:
看来我自己应该能找到,但是,你知道....
在 ggplot 中,我想使用自定义注释来设置位图(如本 post 最后的位图)作为绘图的背景。其他要点是
- 背景图片应填满整个情节
- 绘制在图像上的数据是其位置相对于背景图像以像素为单位的点。
- 理想情况下,我希望 y 比例反转,运行 从顶部的最小值到底部的最大值。 原因 我想要反转 y 比例是因为要绘制在图像上的数据原点在左上角。我知道我可以反映数据,但我宁愿不这样做。
- 我正在使用 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
我是对 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
结果如下:
看来我自己应该能找到,但是,你知道....