使用geom_raster()或geom_tile或geom_rect()

时间:2017-04-13 14:38:50

标签: r image-processing plot ggplot2 raster

我有一个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)

这会在保存的文件中显示所需的结果。

BasePlot

接下来,在该基础层的顶部,我绘制一个或多个附加层。这些层也有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等)时,图块层上会有不需要的线条网格。
Layer Plot

我相信这些行显示是因为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格式?如果是这样,怎么样?我可以在叠加层上设置透明度吗?

1 个答案:

答案 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"))

enter image description here