R - 根据条件值设置手动颜色

时间:2017-06-10 01:14:46

标签: r ggplot2

我尝试根据值是高于还是低于0.5为ggplot条形图指定颜色。

下面是可重现的代码,图中没有指定颜色。

dnow <- data.frame(x=rep(c("protected areas","wildnerness areas","private lands","multi-use lands"), each=25), y=runif(100))

ggplot(dnow,aes(x=x, y=y)) + stat_summary(fun.y=mean, geom="bar", position=position_dodge(1)) + 
  stat_summary(fun.data = mean_se,geom="errorbar", color="grey40",position=position_dodge(1), width=.2) + 
  geom_hline(yintercept = 0.5) + labs(y="Mean Agreement") + theme_bw() +
  theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank(), axis.title.y=element_blank()) + 
  coord_flip() 

enter image description here

根据以下stackoverflow问题(Setting a conditional color by stat_summary in ggplot),我尝试使用aes中的stat_summary根据阈值0.5手动分配颜色,以便值大于0.5的条形图是绿色和值小于0.5的条形图为红色。

代码和输出如下。然而,该图表看起来不正确。它创建了两个带有&#34; true&#34;或&#34;假&#34;而不是根据阈值着色单个条。不知道如何解决这个问题。

ggplot(dnow,aes(x=x, y=y)) + stat_summary(fun.y=mean, geom="bar", aes(fill = y > 0.5), position=position_dodge(1)) + 
  stat_summary(fun.data = mean_se,geom="errorbar", color="grey40",position=position_dodge(1), width=.2) + 
  geom_hline(yintercept = 0.5) + labs(y="Mean Agreement") + theme_bw() +
  theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank(), axis.title.y=element_blank()) + 
  scale_fill_manual(values = c('red', 'green')) + coord_flip()

enter image description here

2 个答案:

答案 0 :(得分:2)

您只需将y更改为..y..中的aes即可。虽然最好先手动汇总数据,然后使用与您关联的帖子类似的geom_bar。这应该有效:

ggplot(dnow,aes(x=x, y=y)) + stat_summary(fun.y=mean, geom="bar", aes(fill = ..y.. > 0.5), position=position_dodge(1)) + 
  stat_summary(fun.data = mean_se,geom="errorbar", color="grey40",position=position_dodge(1), width=.2) + 
  geom_hline(yintercept = 0.5) + labs(y="Mean Agreement") + theme_bw() +
  theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank(), axis.title.y=element_blank()) + 
  scale_fill_manual(values = c('red', 'green')) + coord_flip()

enter image description here

..y..是指来自fun.y的计算均值。

答案 1 :(得分:0)

原因是您使用数据框中的原始值进行着色,而不是使用计算的摘要统计信息。默认情况下,分组将发生在每个离散变量上:在您的情况下,x和值&gt; 0.5。因此,统计摘要功能将计算8组的均值,并根据此对颜色进行着色。我不知道根据计算方法直接着色的方法。但是,您可以预先计算每个组中的均值,并根据此预先计算的平均值进行着色:因此,每个x都有一个均值。