[英]Add legend to “geom_bar” using the ggplot2 package
I am a newbie to R, so please pardon my ignorance. 我是R的新手,所以请原谅我的无知。 I made a pseudo-stacked barplot in which I drew 4 sets of bars on top of each other using geom_bar.
我制作了一个伪堆叠的条形图,其中我使用geom_bar在彼此的顶部绘制了4组条形图。 There are 4 health status categories (alive, dead, infected, & sod-dead) for three species of oak trees (QUAG, QUKE, QUCH).
三种橡树(QUAG,QUKE,QUCH)有4种健康状况类别(活着,死亡,感染和死亡)。
My code is as follows: 我的代码如下:
x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), alive = c(627,208,109), infected = c(102,27,0), dead = c(133,112,12), sod.dead=c(49,8,0)))
x.plot = ggplot(x, aes(variable, alive)) + geom_bar(fill="gray85") +
geom_bar(aes(variable,dead), fill="gray65") +
geom_bar(aes(variable, infected), fill="gray38") +
geom_bar(aes(variable, sod.dead), fill="black")+
opts(panel.background = theme_rect(fill='gray100'))
x.plot
Now I want to make a legend that shows which shade of gray relates to tree status, ie, "gray65" is "dead trees", etc. I've been trying for the past hour and can't get it to work. 现在我想制作一个传说,显示哪个灰色阴影与树状态有关,即“灰色65”是“死树”等等。我一直在尝试过去一小时而无法让它工作。
I see that @Brandon Bertelsen has posted a great answer. 我看到@Brandon Bertelsen发布了一个很好的答案。 I would like to add some code that addresses additional details mentioned in the original post:
我想添加一些代码来解决原帖中提到的其他细节:
fill
, ggplot will create the legend automatically. fill
,ggplot将自动创建图例。 scale_fill_manual()
to get the exact grays mentioned in the original post. scale_fill_manual()
来获得原始帖子中提到的确切灰色。 theme_bw()
is a handy function to quickly get a black and white look to your plot. theme_bw()
是一个方便的功能,可以快速为您的情节获得黑白外观。 levels
argument of factor()
. factor()
的levels
参数指定所需的顺序来控制因子级别/颜色的绘制顺序。 library(reshape2)
library(ggplot2)
x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"),
alive=c(627, 208, 109), infected=c(102, 27, 0),
dead=c(133, 112, 12), sod.dead=c(49, 8, 0)))
# Put data into 'long form' with melt from the reshape2 package.
dat = melt(x, id.var="variable", variable.name="status")
head(dat)
# variable status value
# 1 QUAG alive 627
# 2 QUKE alive 208
# 3 QUCH alive 109
# 4 QUAG infected 102
# 5 QUKE infected 27
# 6 QUCH infected 0
# By manually specifying the levels in the factor, you can control
# the stacking order of the associated fill colors.
dat$status = factor(as.character(dat$status),
levels=c("sod.dead", "dead", "infected", "alive"))
# Create a named character vector that relates factor levels to colors.
grays = c(alive="gray85", dead="gray65", infected="gray38", sod.dead="black")
plot_1 = ggplot(dat, aes(x=variable, y=value, fill=status)) +
theme_bw() +
geom_bar(position="stack") +
scale_fill_manual(values=grays)
ggsave(plot=plot_1, filename="plot_1.png", height=5, width=5)
# You may also want to try a dodged barplot.
plot_2 = ggplot(dat, aes(x=variable, y=value, fill=status)) +
theme_bw() +
geom_bar(position="dodge") +
scale_fill_manual(values=grays)
ggsave(plot=plot_2, filename="plot_2.png", height=4, width=5)
You need to reshape your data. 您需要重塑数据。
library(reshape)
library(ggplot2)
x <- as.data.frame(list(variable=c("QUAG", "QUKE", "QUCH"), alive = c(627,208,109), infected = c(102,27,0), dead = c(133,112,12), sod.dead=c(49,8,0)))
x <- melt(x)
colnames(x) <- c("Type","Status","value")
ggplot(x, aes(Type, value, fill=Status)) + geom_bar(position="stack")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.