如何使用R的ggplot2绘制分组柱状图?
如何使用R的ggplot2绘制分组柱状图?
我太懂这种困惑了!ggplot2绘制分组柱状图的关键其实是数据格式——它更喜欢「长格式」的数据,而你现在从MySQL拿到的是「宽格式」,所以第一步得先把数据转个型,之后绘图就很顺了。我一步步给你演示:
1. 先确认你的数据结构
首先先模拟一下你从MySQL拿到的数据(你直接替换成自己实际的数据框就行):
# 模拟你的数据(替换成你用RMySQL读取的真实数据框) df <- data.frame( Category = c("A", "B"), Dataset1 = c(30, 70), Dataset2 = c(60, 40) )
2. 把宽格式转成长格式
ggplot需要每一行对应一个数据点,所以我们用tidyr包的pivot_longer函数转换格式(tidyr属于tidyverse全家桶,和ggplot2是一伙的,直接加载tidyverse就行):
# 加载tidyverse(包含ggplot2和数据处理工具) library(tidyverse) # 转换数据格式:把Dataset1、Dataset2列转成"数据集"和"数值"两列 df_long <- df %>% pivot_longer( cols = -Category, # 除了Category列,其他列都要转换 names_to = "Dataset", # 原来的列名(Dataset1/Dataset2)存在这个新列里 values_to = "Value" # 原来的数值存在这个新列里 )
转换后的数据长这样:
| Category | Dataset | Value |
|---|---|---|
| A | Dataset1 | 30 |
| A | Dataset2 | 60 |
| B | Dataset1 | 70 |
| B | Dataset2 | 40 |
3. 绘制分组柱状图
现在就可以用ggplot轻松画出分组柱状图了:
ggplot(df_long, aes(x = Category, y = Value, fill = Dataset)) + geom_col(position = position_dodge()) + # position_dodge()让柱子并排分组,不堆叠 labs( title = "分组柱状图", x = "类别", y = "数值", fill = "数据集" # 图例的标题 ) + theme_minimal() # 可选,换个清爽的主题
关键细节解释
fill = Dataset:用不同颜色区分两个数据集的柱子position = position_dodge():这是实现「分组」的核心参数,如果去掉它,柱子会默认堆叠在一起,就不是你想要的分组效果啦
如果你的数据是从MySQL直接读取的,只需要把第一步里的df换成你实际的数据集名称(比如你用dbGetQuery()得到的对象)就行,完全不用改其他代码~
备注:内容来源于stack exchange,提问作者Norman D
相关产品推荐
相关产品推荐

