ggplot绘制按Recorte列分三类着色的折线图相关问题求助
问题根因
- 映射参数写错:
ggplot的美学映射中,指定按字段分类着色需要用color参数,你写的factor不是合法的映射参数,不会生效 - 硬编码颜色优先级更高:你在
geom_line()参数里直接写了color = "Purple",这个固定赋值会覆盖aes()内的动态映射规则,所以颜色不会随Recorte字段变化
分段着色正确实现代码
如果你要保留单条折线的连续性,仅按阶段切换颜色,需要额外加group = 1的映射(避免按颜色分组后折线断裂),示例代码如下:
library(ggplot2) library(scales) # 你用到了date_format需要加载这个包 graflutudo <- ggplot(campanhalutudo, aes(x = `Hora da publicação`, y = Alcance, color = Recorte, group = 1)) + geom_line(linewidth = 1) + # 保留原来的均值虚线 geom_line(aes(y = mean(Alcance)), color = "red", linetype = "dotted", inherit.aes = FALSE) + # 可以自定义三个阶段的颜色,这里保留你原来的紫色作为其中一个 scale_color_manual(values = c("Periodo 1" = "purple", "Periodo 2" = "orange", "Periodo 3" = "green")) + scale_y_continuous(breaks = seq(0, 85000, by = 10000)) + scale_x_datetime(labels = date_format("%m-%d"), date_breaks = "4 days") + theme_light()
更推荐的阶段区分方案:背景色块标注
如果不想破坏折线本身的视觉连贯性,用不同颜色的半透明背景色块区分三个阶段会更直观,示例代码如下:
# 先提取每个阶段的时间范围 period_range <- aggregate(`Hora da publicação` ~ Recorte, data = campanhalutudo, FUN = range) colnames(period_range) <- c("Recorte", "start", "end") graflutudo <- ggplot(campanhalutudo, aes(x = `Hora da publicação`, y = Alcance)) + # 先加背景色块,放在最底层 geom_rect(data = period_range, aes(xmin = start, xmax = end, ymin = -Inf, ymax = Inf, fill = Recorte), alpha = 0.2, inherit.aes = FALSE) + # 折线保持统一颜色 geom_line(color = "purple", linewidth = 1) + geom_line(aes(y = mean(Alcance)), color = "red", linetype = "dotted") + # 自定义色块颜色 scale_fill_manual(values = c("Periodo 1" = "purple", "Periodo 2" = "orange", "Periodo 3" = "green")) + scale_y_continuous(breaks = seq(0, 85000, by = 10000)) + scale_x_datetime(labels = date_format("%m-%d"), date_breaks = "4 days") + theme_light()
内容的提问来源于stack exchange,提问作者Hayguneys
相关产品推荐
相关产品推荐

