ggplot绘制GDP与移动平均线时颜色及顺序异常问题排查
问题原因与解决方案
问题根源
你把colour参数放在了aes()函数内部,这会让ggplot将"black""red"视为分类变量的标签,而非直接使用的颜色值。ggplot会自动调用默认调色板为这些标签分配颜色,所以不会遵循你指定的颜色设定。
解决方法1:直接指定颜色(无需图例)
把colour移出aes(),直接作为geom_line()的参数,这样就是直接设置线条颜色,而非变量映射:
# 确保已加载依赖包 library(zoo) library(ggplot2) library(dplyr) graf <- data %>% ggplot(aes(x = TRIMESTRE)) + geom_line(aes(y = PIB), colour = "black") + geom_line(aes(y = rollmean(PIB, 6, na.pad = TRUE)), colour = "red") graf
解决方法2:规范长数据格式(带图例)
如果需要显示图例区分两条线,推荐先将数据转换为ggplot偏好的长格式,再通过颜色映射+手动指定颜色实现:
library(zoo) library(ggplot2) library(dplyr) library(tidyr) # 1. 提前计算移动平均线,新增列到数据框 data <- data %>% mutate(PIB_移动平均 = rollmean(PIB, 6, na.pad = TRUE)) # 2. 转换为长格式 data_long <- data %>% pivot_longer( cols = c(PIB, PIB_移动平均), names_to = "指标类型", values_to = "数值" ) # 3. 绘图并指定颜色 graf <- data_long %>% ggplot(aes(x = TRIMESTRE, y = 数值, colour = 指标类型)) + geom_line() + scale_colour_manual( values = c("PIB" = "black", "PIB_移动平均" = "red") ) graf
额外注意
- 确保已加载
zoo包,rollmean函数属于该包,未加载会触发报错。 - 若
na.pad = TRUE导致开头出现NA值,可以考虑改用rollmeanr(右侧对齐)或调整fill参数处理缺失值。
内容的提问来源于stack exchange,提问作者Gedean John
相关产品推荐
相关产品推荐

