首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在“`ggplot2` 2”中使用多个`scale_fill_`

在“`ggplot2` 2”中使用多个`scale_fill_`
EN

Stack Overflow用户
提问于 2017-02-24 07:02:05
回答 2查看 6.4K关注 0票数 11

我试图在ggplot2中显示多个层,但我想对每个层使用不同的scale_fill_颜色方案。我似乎做不到,因为调用类似于scale_fill_gradientn的东西两次只会覆盖第一个调用和第二个调用。

代码语言:javascript
运行
复制
library( ggplot2 )
library( reshape2 )
library( RColorBrewer )
set.seed( 123 )

我将首先绘制一个tile网格(注意,我正在用scale_fill_gradientn设置颜色):

代码语言:javascript
运行
复制
foo <- matrix( data = rnorm( 100 ), ncol = 10 )
foo <- melt( foo )

plot <- ggplot() +
  geom_tile( data = foo,
             mapping = aes( x = Var1, y = Var2, fill = value ) ) +
  scale_fill_gradientn(
    colours = rev( brewer.pal( 7, "BrBG" ) )
  )
plot

现在我想把另一个情节放在那个上面,但是有一个独特的配色方案。我可以创造一个完全不同的情节:

代码语言:javascript
运行
复制
bar <- data.frame( x = rnorm( 100, 4, 1 ),
                   y = rnorm( 100, 6, 1.5 ) )

ggplot() +
  stat_density_2d( data = bar,
                   mapping = aes( x = x, y = y, fill = ..level.. ),
                   geom = "polygon" ) +
  scale_fill_gradientn(
    colours = rev( brewer.pal( 7, "Spectral" ) )
  ) + xlim( 0, 10 ) + ylim( 0, 10 )

我想做的是在第一幅上面画第二幅,但是保持上面看到的配色方案。如果我试图简单地将第二层添加到第一层的顶部,则会覆盖原始的scale_fill_gradientn,并强制这两层共享一种颜色方案(在本例中,该方案还将第二层“压缩”为完全在一种颜色内:

代码语言:javascript
运行
复制
plot <- plot +
  stat_density_2d( data = bar,
                   mapping = aes( x = x, y = y, fill = ..level.. ),
                   geom = "polygon" ) +
  scale_fill_gradientn(
    colours = rev( brewer.pal( 7, "Spectral" ) )
  ) + xlim( 0, 10 ) + ylim( 0, 10 )
plot

是否有办法为每一层指定不同的配色方案?例如,我注意到stat_density_2d理解colour的美学,但我尝试指定一个没有用(它只在图例中添加颜色作为标签,并将配色方案恢复到默认状态):

代码语言:javascript
运行
复制
ggplot() +
  stat_density_2d( data = bar,
                   mapping = aes( x = x, y = y, fill = ..level.., colour = "red" ),
                   geom = "polygon" ) +
  xlim( 0, 10 ) + ylim( 0, 10 )

我觉得一定有一种不同的方式来设定颜色方案的“每一层”的基础上,但我显然是在错误的地方。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-24 08:02:53

绕过限制的一种方法是将地图映射到颜色(正如您已经暗示的那样)。如下所示:

我们保留底层的栅格图,然后添加:

代码语言:javascript
运行
复制
plot +
  stat_density_2d( data = bar,
                   mapping = aes( x = x, y = y, col = ..level.. ),
                   geom = "path", size = 2 ) +
  scale_color_gradientn(
    colours = rev( brewer.pal( 7, "Spectral" ) )
  ) + xlim( 0, 10 ) + ylim( 0, 10 )

这使我们:

这并不完全令人满意,主要是因为音阶有相当多的感知重叠(我认为)。玩不同的比例尺肯定能给我们一个更好的结果:

代码语言:javascript
运行
复制
plot <- ggplot() +
  geom_tile( data = foo,
             mapping = aes( x = Var1, y = Var2, fill = value ) ) +
  viridis::scale_fill_viridis(option = 'A', end = 0.9)

plot +
  stat_density_2d( data = bar,
                   mapping = aes( x = x, y = y, col = ..level.. ),
                   geom = "path", size = 2 ) +
  viridis::scale_color_viridis(option = 'D', begin = 0.3) + 
  xlim( 0, 10 ) + ylim( 0, 10 )

在我看来还是不太好(使用多种颜色的尺度让我感到困惑),但更容易容忍。

票数 11
EN

Stack Overflow用户

发布于 2021-06-30 13:27:25

看起来Gggnew比例尺是最近开发出来的,它允许在一个地块中使用多个尺度--特别是颜色和填充尺度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42432611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档