使用手动指定的填充强制ggplot2绘制条形图?

时间:2014-05-10 19:32:41

标签: r ggplot2

数据:Data 数据1:Data1

代码:

CashSurDef <- ggplot(data=wdiSSA_CashSurDef.df,aes(x=Country.Name, y=avg, fill=colour))
CashSurDef <- CashSurDef + geom_bar(stat="identity",position=position_dodge(),alpha=.75) + theme_bw()
CashSurDef <- CashSurDef + scale_fill_manual(breaks = wdiSSA_CashSurDef.df$Country.Name,
                                    values = unique(as.character(wdiSSA_CashSurDef.df$colour)))
CashSurDef <- CashSurDef + scale_y_continuous(breaks=seq(-25,25,2.5)) + geom_hline(yintercept=0, linetype="dashed", colour="blue", size=1.1)
CashSurDef <- CashSurDef + labs(title="Cash surplus/deficit (% of GDP) (Average 2005-2012)", y="", x="Country") + coord_flip() 
CashSurDef <- CashSurDef + theme(plot.title=element_text(face="bold", size=rel(2), hjust=0.5, vjust=1.5),
                            axis.text.x=element_text(color="black", size=rel(1.8), hjust=0.5, vjust=0.5),
                            axis.text.y=element_text(color="black", size=rel(1.8), hjust=1),
                            axis.title.x=element_text(face="bold", color="black", size=rel(1.6), hjust=0.5, vjust=0.2),
                            axis.title.y=element_text(color="black", size=rel(1.6), hjust=0.5, vjust=0.2),
                            strip.text=element_text(face="bold", size=rel(1.8)),
                            legend.text=element_text(face="bold", size=rel(1.25)),
                            legend.title=element_blank(),
                            legend.position="bottom")
CashSurDef

代码1:

Unemploy <- ggplot(data=wdiSSA_Unemploy.df,aes(x=Country.Name, y=avg, fill=colour))
Unemploy <- Unemploy + geom_bar(stat="identity",position=position_dodge(),alpha=.75) + theme_bw()
Unemploy <- Unemploy + scale_fill_manual(breaks = wdiSSA_Unemploy.df$Country.Name,
                                    values = unique(as.character(wdiSSA_Unemploy.df$colour)))
Unemploy <- Unemploy + scale_y_continuous(breaks=seq(0,35,5)) + geom_hline(yintercept=5, linetype="dashed", colour="blue", size=1.1)
Unemploy <- Unemploy + labs(title="Average unemployment rate (2005-2012), total (%)", y="", x="Country") + coord_flip()
Unemploy <- Unemploy + theme(plot.title=element_text(face="bold", size=rel(2), hjust=0.5, vjust=1.5),
                        axis.text.x=element_text(color="black", size=rel(1.8), hjust=0.5, vjust=0.5),
                        axis.text.y=element_text(color="black", size=rel(1.8), hjust=1),
                        axis.title.x=element_text(face="bold", color="black", size=rel(1.6), hjust=0.5, vjust=0.2),
                        axis.title.y=element_text(color="black", size=rel(1.6), hjust=0.5, vjust=0.2),
                        strip.text=element_text(face="bold", size=rel(1.8)),
                        legend.text=element_text(face="bold", size=rel(1.25)),
                        legend.title=element_blank(),
                        legend.position="bottom")
Unemploy

结果:Result 结果1:Result1

问题:我正在尝试绘制数据并使用由列&#34;颜色&#34;捕获的预定义填充。在&#34; Data&#34;中,它是根据条件语句添加的:if(avg>0, tan3, grey)。当我绘制时,颜色填充会反过来,如图中所示&#34;结果&#34;。我对我的数据中的其他变量应用了相同的方法(参见&#34; Data1&#34;,&#34; Result1&#34;),它完美地运行。有什么想法,建议吗?

干杯

1 个答案:

答案 0 :(得分:2)

首先,您省略了通过avg重新排序国家/地区名称因子的代码,因此您的代码不会生成这些图。

其次,在数据框中使用颜色名称对您没有帮助。 ggplot(...,aes(fill=...))将该列解释为区分组的因素。它分配了自己的颜色,这就是为什么你需要使用scale_fill_manual(...)来实际设置你想要的颜色。

第三,在breaks=...的来电中,您不需要scale_fill_manual(...)

第四,这是您的主要问题的答案,unique(as.character(df$colours))根据它们在df中的显示时间返回订单中的颜色。在现金流量表中,首先显示tan3,首先出现在失业表grey中。解决这个问题的一种方法是更换你的电话

scale_fill_manual(breaks = df$Country.Name, values = unique(df$colour)))

scale_fill_manual(values = 
            as.character(setNames(unique(df$colour),unique(df$colour))))

df替换为数据框的名称。这将创建一个命名的矢量颜色,其中颜色名称和颜色相同,例如。

c(tan3="tan3",grey="grey",NA)

将正确关联颜色。

最后,IMO你做这样的事情要好得多(我在这里使用cash作为数据框的名称)

...
ggplot(data=cash,aes(x=Country.Name, y=avg, 
                     fill=(ifelse(avg>0,"Positive","Negative"))))+
   geom_bar(stat="identity",position=position_dodge(),
            alpha=.75) +
   scale_fill_manual(values = c(Positive="grey",Negative="tan3"))
...