在ggplot中混合颜色并填充美学

时间:2016-08-11 10:53:42

标签: r ggplot2 colors fill

我想知道是否有可能根据分类变量

更改填充主色

这是一个可重现的例子

for

And this is the output

当然根据变量grp很容易改变圆形颜色/形状,但是我希望有一组红色和b组蓝色。 我还考虑过使用facet,但不知道是否可以为两个面板更改填充渐变。

任何人都知道如果没有gridExtra可以做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为有两种方法可以做到这一点。第一个是对alpha列使用val美学。这是实现目标的快捷方式,但可能并不完全符合您的要求:

ggplot(data = df,
       aes(x = x,
           y = y)) +
  geom_point(pch = 21,
             aes(alpha=val,
                 fill = grp,
                 size = val)) + theme_minimal()

enter image description here

第二种方法是做类似这篇文章:Vary the color gradient on a scatter plot created with ggplot2。我稍微编辑了代码,因此它不是从白色到您感兴趣的颜色的范围,而是从浅色到深色。这需要一些工作并使用scale_fill_identity函数,该函数基本上采用具有所需颜色的变量并将它们直接映射到每个点(因此它不会进行任何缩放)。

此代码为:

#Rescale val to [0,1]
df$scaled_val <- rescale(df$val)
low_cols <- c("firebrick1","deepskyblue")
high_cols <- c("darkred","deepskyblue4")

df$col <- ddply(df, .(grp), function(x)
  data.frame(col=apply(colorRamp(c(low_cols[as.numeric(x$grp)[1]], high_cols[as.numeric(x$grp)[1]]))(x$scaled_val),
                       1,function(x)rgb(x[1],x[2],x[3], max=255)))
)$col
df

ggplot(data = df,
       aes(x = x,
           y = y)) +
  geom_point(pch = 21,
             aes(
                 fill = col,
                 size = val)) + theme_minimal() +scale_fill_identity()

enter image description here

答案 1 :(得分:0)

感谢this other post我发现了一种可视化图例中填充条的方法,即使这不是我的目的。

这是ouptup

enter image description here

代码

df = data.frame(x = c(rnorm(10, mean = 0),
                      rnorm(10, mean = 3)),
                y = c(rnorm(10, mean = 0),
                      rnorm(10, mean = 3)),
                grp = factor(c(rep('a', times = 10),
                               rep('b', times = 10)),
                             levels = c('a', 'b')),
                val = rep(1:10, times = 2)) %>%
  group_by(grp) %>%
  mutate(scaledVal = rescale(val)) %>%
  ungroup %>%
  mutate(scaledValOffSet = scaledVal + 100*(as.integer(grp) - 1))

scalerange <- range(df$scaledVal)
gradientends <- scalerange + rep(c(0,100,200), each=2)

ggplot(data = df,
       aes(x = x,
           y = y)) +
  geom_point(pch = 21,
             aes(fill = scaledValOffSet,
                 size = val)) + 
  scale_fill_gradientn(colours = c('white',
                                   'darkred',
                                   'white',
                                   'deepskyblue4'),
                       values = rescale(gradientends))

基本上应该重新缩放填充值(例如在0和1之间)并使用另一个数量级将它们分开,由分类变量grp提供。 这不是我想要的:当然,可以改进代码片段,使整个事情减少手动,但仍然缺乏简单的通常离散填充图例。