我有一个b / w栅格图像数据的数据框,我用它作为背景/基础层。它有三列:x,y,z。其中x和y是相应的坐标,z是定义512 x 512图像的连续值。我将此背景填充设置为黑白渐变,并使用geom_raster()
中的ggplot2
进行绘图,然后将图像保存为PDF文件。
### MWE of base layer
# original 512x512 data is read in from a file in matrix format, so here's a mocked up example of same:
h = matrix(data = rep(c(1:512), 512), byrow = T, nrow = 512, ncol = 512)
# convert to data.frame with all the rows of z-data in first column
h = data.frame(z = as.vector(t(h)))
# create equally spaced 512x512 x and y pixel coordinate vectors
x = c(-255:256)
y = c(-255:256)
# add x and y coordinate vectors to the data.frame
h$x = rep(t(x), 512)
h$y = rep(t(-y), each=512)
# plot the data
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent")
# save to png
ggsave("testbaseplot.png", dpi=300)
这会在保存的文件中显示所需的结果。
接下来,在该基础层的顶部,我绘制一个或多个附加层。这些层也有x,y和r。其中r是连续值或离散值,具体取决于区域。例如,定义区域边界的层将标记离散区域,而定义区域中的拓扑的层将定义拓扑。
理想情况下,我希望两次使用geom_raster()
,每个图层使用一次(基础,叠加),并在每个图层上使用不同的aes(fill=)
,使用不同的scale_fill_*()
对于每一层也是如此。但是,尝试此操作会导致错误:
# MWE of mock overlay = 4 square labeled regions
# create z-data for some example shapes
r = data.frame(r = as.vector(c(rep(rep(c('a','b'),each=100),100),
rep(rep(c('c','d'),each=100),100))))
# create x and y coordinates
r$x = rep(c(-99:100),200)
r$y = rep(c(-99:100),each=200)
# plot base layer and 1 overlay layer, both as geom_raster
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent") +
geom_raster(data=r, aes(x,y,fill=r)) +
scale_fill_manual(values=c("red","white","blue","yellow"))
错误讯息:
缩放'填充'已经存在了。为“填充”添加另一个比例,这将取代现有的比例。 错误:提供给离散比例的连续值
我想也许我可以使用geom_raster()
进行一次aes(fill=z)
,使用aes(colour=r)
和scale_colour_manual
进行geom_raster()
,aes(colour=)
无法识别geom_tile(aes(colour=r))
}选项,所以我改为使用# plot looks fine
ggplot() +
coord_fixed() +
geom_raster(data=h, aes(x,y,fill=z)) +
scale_fill_gradient(low="black", high="white", na.value="transparent") +
geom_tile(data=r, aes(x,y,colour=r), fill="transparent") +
scale_colour_manual(values=c("red","white","blue","yellow"))
# saved file does not
ggsave("testlayerplot.png", dpi=300)
:
geom_tile
该图在RStudio的预览窗口中看起来很好,但是当保存为文件(pdf,png等)时,图块层上会有不需要的线条网格。
我相信这些行显示是因为geom_tile
默认填充是灰色的。这是由文件格式造成的吗?由于忽略fill="transparent"
选项的data.frame
默认灰色填充?还有其他原因吗?
我觉得我正在接近这个错误。我可能不必要地将矩阵格式的原始栅格数据转换为x,y,z data.frame
格式......并且因为我更了解ggplot
格式。
第一部分:我可以使用alpha=.5
将一个栅格绘制在另一个栅格上而不会获得不需要的线条吗?如果是这样,怎么样?我还可以在叠加层中添加data.frame
透明度吗?
第二部分:有没有一种方法可以绘制原始栅格矩阵格式而不首先转换为x,y,z DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY
格式?如果是这样,怎么样?我可以在叠加层上设置透明度吗?
答案 0 :(得分:2)
With a little work, you can use annotate
to create the background without mapping, so the fill scales remains available for the center:
h$z <- (h$z - min(h$z))/diff(range(h$z))
ggplot() +
coord_fixed() +
annotate(geom = 'raster', x = h$x, y = h$y,
fill = scales::colour_ramp(c("black", "white"))(h$z)) +
geom_raster(data = r, aes(x,y,fill=r)) +
scale_fill_manual(values=c("red","white","blue","yellow"))