对于计数数据 + 2个分类变量,画柱状图。
难点:怎么控制组内的柱子间宽?
模拟数据: x轴是汽化器的个数,颜色分类是自动挡/手动挡,y轴是该分类的汽车型号计数。
# 准备数据:
df1=table(mtcars$carb, mtcars$am); df1
df2=as.data.frame(df1);df2
colnames(df2)=c("carb", "am", "count")
df2
#
library(ggplot2)
# 基础版: 分类是堆叠的
ggplot(df2, aes(x=carb, y=count, fill=am))+
geom_bar(stat = "identity")+ #identity表示按照当前值画,否则还要统计个数
theme_classic()+ggtitle("Fig 1")
ggplot(mtcars, aes(x=carb))+
geom_bar( aes(fill=am))+ #identity表示按照当前值画,否则还要统计个数
theme_classic() +ggtitle("Fig 1b")
ggplot(df2, aes(x=carb, y=count, fill=am))+
geom_bar(stat = "identity", position = "dodge")+
theme_classic()+ggtitle("Fig 2")
ggplot(df2, aes(x=carb, y=count, fill=am))+
geom_bar(stat = "identity", position = "dodge", width=0.4)+
theme_classic()+ggtitle("Fig 3")
ggplot(df2, aes(x=carb, y=count, fill=am))+
geom_bar(stat = "identity",
width=0.4, #柱子实际宽度
position = position_dodge(width=0.6))+ #每个柱子占的宽度
theme_classic()+ggtitle("Fig 4")
# 两个的差,就是组内柱子的间距: position_dodge(width=0.5) - (width=0.4) = 0.1
设置颜色: am Transmission (0 = automatic, 1 = manual)
ggplot(df2, aes(x=carb, y=count, fill=am))+
geom_bar(stat = "identity",
width=0.6, #柱子显示宽度
position = position_dodge(width=0.75))+ #每个柱子占用的宽度,即便不显示内容
theme_classic(base_size = 12)+
scale_fill_manual( name="Type", #图例标题
breaks=c("1", "0"), #规定图例顺序:从上到下
labels=c("manual", "automatic"), #图例的新标签,与breaks一一对应
values=c("#1874B7", "#E3B338"), # 颜色,按照 breaks 规定的顺序
)+
labs(x="Number of carburetors", y="Count", title="Car types")+
theme(
plot.title = element_text(hjust=0.5, face="bold"), #标题居中、黑体
legend.position = c("top"), #方位: 上下左右共4个
legend.justification = "left", #靠左对齐
legend.key.height = unit(2, "mm"), #控制图例 小图的高度
legend.key.width = unit(5, "mm"), #控制图例 小图的宽度
)
怎么加 error bar? https://github.com/tidyverse/ggplot2/issues/2251