如何用ggplot和geom_bar为数据框各Item绘制多面板柱状图
问题描述
我有如下数据框:
Steps Item_number avg 1 Item 1 172 2 Item 1 817 3 Item 1 110 4 Item 1 703 5 Item 1 74 6 Item 1 12 7 Item 1 12 8 Item 1 87 1 Item 2 172 2 Item 2 817 3 Item 2 110 4 Item 2 703 5 Item 2 74 6 Item 2 12 7 Item 2 12 8 Item 2 87 1 Item 3 11 2 Item 3 817 3 Item 3 110 4 Item 3 703 5 Item 3 745 6 Item 3 92 7 Item 3 192 8 Item 3 831
希望创建一个包含3个柱状图的面板,每个Item对应一个图,x轴代表Steps,y轴代表avg值,想学习如何用ggplot和geom_bar实现该需求。
解决方案
可以通过ggplot2的分面功能结合geom_bar轻松实现需求,具体步骤如下:
1. 数据准备
先将数据转换为R数据框格式(如果已有数据框可跳过):
df <- data.frame( Steps = rep(1:8, 3), Item_number = c(rep("Item 1", 8), rep("Item 2", 8), rep("Item 3", 8)), avg = c(172,817,110,703,74,12,12,87, 172,817,110,703,74,12,12,87, 11,817,110,703,745,92,192,831) )
2. 绘制分面柱状图
核心代码如下:
library(ggplot2) ggplot(df, aes(x = factor(Steps), y = avg)) + # 绘制柱状图,stat="identity"表示直接使用y轴给定的数值 geom_bar(stat = "identity", fill = "#2E86AB", width = 0.7) + # 按Item_number拆分面板,ncol=1表示单列布局,改成ncol=3则为三列 facet_wrap(~ Item_number, ncol = 1) + # 设置图表标签 labs( x = "Steps", y = "avg值", title = "各Item的Steps对应avg值柱状图" ) + # 使用简洁的黑白主题 theme_bw() + # 自定义样式优化 theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), strip.text = element_text(size = 12, face = "bold") )
关键参数说明:
aes(x = factor(Steps), y = avg):将Steps转为因子类型,保证x轴显示离散的步骤序号;y轴绑定avg数值geom_bar(stat = "identity"):默认geom_bar是统计计数,这里需要直接用avg值作为柱子高度,必须指定stat="identity"facet_wrap(~ Item_number):根据Item_number字段自动拆分出对应的子图面板,通过ncol或nrow控制面板排列方式
如果想要和示例图一致的横向三列布局,只需把facet_wrap的参数改为facet_wrap(~ Item_number, ncol = 3)即可。
内容的提问来源于stack exchange,提问作者Giulia Ciminelli
相关产品推荐
相关产品推荐

