r-用不同的梯度覆盖多个geom_raster图



我想用gglotgeom_raster绘制一个有两个不同梯度的2D图,但我不知道是否有一个快速而优雅的解决方案,我被卡住了。

本质上,我希望看到的效果是多个geom_raster的叠加。此外,我需要一个可以缩放到N个不同梯度的解决方案;让我举一个N=2个梯度的例子,这更容易理解。

我首先创建一个100 x 100的位置x和Y 网格

# the domain are 100 points on each axis
domain = seq(0, 100, 1) 
# the grid with the data
grid = expand.grid(domain, domain, stringsAsFactors = FALSE)
colnames(grid) = c('x', 'y')

然后我计算每个网格点一个值;想象一下像这样愚蠢的东西

grid$val = apply(grid, 1, function(w) { w['x'] * w['y'] }

我知道如何用自定义的白到红渐变绘制这个

ggplot(grid, aes(x = x, y = y)) +
geom_raster(aes(fill = val), interpolate = TRUE) +
scale_fill_gradient(
low = "white", 
high = "red", aesthetics = 'fill')

但现在想象一下,每个网格点有另一个值

grid$second_val = apply(grid, 1, function(w) { w['x'] * w['y'] + runif(1) }

现在,我如何绘制一个网格,其中每个位置"(x,y("都用覆盖

  • 1"白到红"梯度,值由val给出
  • 1"白色到蓝色"梯度,值由second_val给出

本质上,在大多数应用中,valsecond_val将是两个2D密度函数,我希望每个梯度都表示密度值。我需要两种不同的颜色来查看值的不同分布。

我看到过类似的问题,但不知道如何在我的情况下使用这个答案。

@Axeman对我的问题的回答(您链接到该问题(直接适用于您的问题。

注意,scales::color_ramp()使用0和1之间的值,因此在绘制之前,对0和1的val和second_val进行归一化

grid$val_norm <- (grid$val-min(grid$val))/diff(range(grid$val))
grid$second_val_norm <- (grid$second_val-min(grid$second_val))/diff(range(grid$second_val))

现在使用@Axeman的答案进行绘图。您可以稍后将其中一个打印为光栅,并使用注释覆盖第二个。我添加了透明度(alpha=.5(,否则您只能看到第二层

ggplot(grid, aes(x = x, y = y)) +
geom_raster(aes(fill=val)) + 
scale_fill_gradient(low = "white", high = "red", aesthetics = 'fill') + 
annotate(geom="raster", x=grid$x, y=grid$y, alpha=.5,
fill = scales::colour_ramp(c("transparent","blue"))(grid$second_val_norm))

或者,可以使用annotate()绘制这两个图层。

# plot using annotate()
ggplot(grid, aes(x = x, y = y)) +
annotate(geom="raster", x=grid$x, y=grid$y, alpha=.5,
fill = scales::colour_ramp(c("transparent","red"))(grid$val_norm)) +
annotate(geom="raster", x=grid$x, y=grid$y, alpha=.5,
fill = scales::colour_ramp(c("transparent","blue"))(grid$second_val_norm))

相关内容

  • 没有找到相关文章

最新更新