R语言ggplot2柱状图无显示问题:如何正确设置geom_bar参数?
解决ggplot2双轴图柱状条不显示的问题
你遇到的核心问题是两个变量的数值尺度差异过大:annualjobgrowth是几万甚至负几十万的量级,而Rate只是个位数到负十几,直接把它们放在同一个y轴上,柱状条会被压缩成几乎看不见的细线。另外,你没有设置双y轴来适配这两个完全不同量级的变量,这才导致柱状条“消失”了。
下面是修改后的完整代码,以及关键修改点的说明:
修改后的完整代码
# Data generation Month1 <- c(201812,20191,20192,20193,20194,20195,20196, 20197,20198,20199,201910,201911,201912,20201 ,20202,20203,20204,20205,20206,20207 ,20208,20209,202010,202011) annualjobgrowth<- c(44400,46000,42600,40500,42800,40500,36000, 34000,32300,29900,21900,24500,21000, 23300,16000,-6200,-275600,-249500,-149200, -136500,-129900,-122800,-113900,-109500) Rate <- c(3.3,3.4,3.1,3.0,3.1,2.9,2.6,2.5,2.3,2.1,1.6,1.7,1.5,1.7,1.1,-0.4, -19.5,-17.6,-10.5,-9.6,-9.1,-8.6,-8.0,-7.7) cesyoy <- data.frame(Month1,annualjobgrowth, Rate) # 可选优化:把Month1转成日期格式,让x轴刻度更易读 cesyoy$Month <- as.Date(paste0(substr(cesyoy$Month1, 1, 4), "-", substr(cesyoy$Month1, 5, 6), "-01"), "%Y-%m-%d") # 绘制双轴图表 library(ggplot2) # 计算缩放比例:让就业增长的数值范围适配增长率的范围 scale_factor <- max(cesyoy$annualjobgrowth, na.rm = TRUE) / max(cesyoy$Rate, na.rm = TRUE) firstces <- ggplot(cesyoy) + # 核心修改1:对annualjobgrowth做缩放,让它的数值范围和Rate匹配,这样柱状条就能显示 geom_bar(aes(x = Month, y = annualjobgrowth / scale_factor), stat = "identity", fill = "tan1", colour = "sienna3") + # 折线和增长率文本:使用原始Rate值,映射到右侧y轴 geom_line(aes(x = Month, y = Rate), colour = "blue", size = 1) + geom_text(aes(label = Rate, x = Month, y = Rate), colour = "black", vjust = -1) + # 就业增长文本:根据数值正负调整位置,避免被柱子挡住 geom_text(aes(label = annualjobgrowth, x = Month, y = (annualjobgrowth / scale_factor) * ifelse(annualjobgrowth > 0, 0.9, 1.1)), colour = "black", size = 3) + # 核心修改2:设置双y轴,把缩放后的数值转换回原始就业增长值 scale_y_continuous( name = "Annual Job Growth", breaks = seq(-300000, 50000, 50000), labels = seq(-300000, 50000, 50000), sec.axis = sec_axis(~ . * scale_factor, name = "Growth Rate (%)") ) + labs(x = "Month") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) ggsave("firstces.png", width = 12, height = 6)
关键修改说明
- 适配尺度差异的双y轴:通过
scale_factor把annualjobgrowth缩放至和Rate接近的范围,再用sec_axis把左侧轴的缩放值转换回原始就业增长数值,这样两个系列都能清晰显示。 - 调整geom_bar的y映射:将
annualjobgrowth除以scale_factor是让柱状条可见的核心操作,否则它会被Rate的小数值轴压缩成细线。 - 优化文本显示:根据就业增长的正负调整文本位置,确保正数柱子的文本在内部,负数柱子的文本在外部,避免遮挡。
- 日期格式优化:把
Month1转成标准日期格式,让x轴的时间刻度更直观易读。
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

