使用ggplot绘制美国各州性别拆分条形图失败,求排查原因
咱们来一步步拆解你遇到的问题——你的代码和数据格式确实都有需要调整的地方,这也是新手用ggplot画分组条形图常踩的坑。
先说说代码里的核心问题
- y轴引用错误:你写的
y="2015 Pop"是把字符串当成了y值,而不是引用数据框里的列。如果列名带空格,应该用反引号包裹,写成y=2015 Pop``。 - 缺少性别分组的映射:你要画性别拆分的条形图,但没告诉ggplot按哪个变量区分男女——得在
aes里加fill=Gender(这里的Gender是你数据里代表“男/女”的列名,要换成你实际的列名)。 - position参数选错了:
position="fill"会把所有条形的高度归一为1(显示百分比占比),但你要展示的是实际人口数量,应该用position="dodge"(让男女条形并列),或者用默认的堆叠模式(显示各州总人口+男女占比)。
再说说数据格式的问题
ggplot画分组图更适合长格式数据:每一行代表一个州的一个性别组,要有三列:State(州名)、Gender(男/女)、2015 Pop(对应人口数)。
如果你的数据是宽格式(比如一行一个州,列是State、Male_2015、Female_2015),得先转成长格式,用tidyr包的pivot_longer就能搞定。
修正后的完整流程示例
第一步:把宽格式数据转成长格式(如果需要)
library(tidyr) library(dplyr) # 假设你的宽表有State、Male_2015、Female_2015这几列 MW_15_long <- MW_15 %>% pivot_longer( cols = c(Male_2015, Female_2015), # 替换成你实际的性别列名 names_to = "Gender", values_to = "2015 Pop" ) %>% mutate(Gender = gsub("_2015", "", Gender)) # 去掉列名里的年份后缀,让Gender显示为Male/Female
第二步:绘制并列条形图(最适合对比男女数量)
library(ggplot2) p1 <- ggplot(MW_15_long, aes(x = State, y = `2015 Pop`, fill = Gender)) + geom_bar(stat = "identity", position = "dodge", width = 0.7) + # position="dodge"实现并列 ylab("Population") + labs(fill = "Gender") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转州名避免重叠 print(p1)
(可选)绘制堆叠条形图(展示各州总人口+男女占比)
p1 <- ggplot(MW_15_long, aes(x = State, y = `2015 Pop`, fill = Gender)) + geom_bar(stat = "identity") + # 默认就是堆叠模式 ylab("Population") + labs(fill = "Gender") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) print(p1)
内容的提问来源于stack exchange,提问作者yupper
相关产品推荐
相关产品推荐

