You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化ggplot2折线图:增强年份区分色与设置X轴起始为一月

解决方案:优化兽医诊所鸟类收治量折线图

问题需求

使用ggplot2绘制兽医诊所每月鸟类收治数量n随年份year变化的折线图,需完成两个优化:

  • 提升各年份折线颜色的辨识度
  • 将X轴起始月份设置为一月

优化后代码

library(ggplot2)
library(dplyr)

# 将month转换为有序因子,确保月份按自然顺序排列
df2 <- df2 %>%
  ungroup() %>%  # 原数据集为分组数据,先取消分组再修改列
  mutate(month = factor(month, 
                        levels = c("January", "February", "March", "April", "May", "June",
                                   "July", "August", "September", "October", "November", "December"),
                        ordered = TRUE))

# 绘制优化后的折线图
df2 %>%
  ggplot(aes(x = month, y = n, group = year, colour = factor(year))) +
  geom_line(linewidth = 1) +  # 加粗折线,进一步提升辨识度
  ggtitle("Monthly admission numbers by year") +
  theme_minimal() +
  scale_color_brewer(palette = "Set1") +  # 使用高对比度离散配色
  labs(x = "Month", y = "Number of admissions", colour = "Year")

优化说明

  1. 设置X轴起始月份为一月
    原数据中的month是字符型,ggplot默认按字母顺序排序(如April会排在January之前)。通过将month转换为有序因子,指定从January到December的层级顺序,即可让X轴按自然月份顺序排列,起始为一月。

  2. 提升年份折线颜色辨识度

    • 将year转换为因子类型,让ggplot将其视为离散变量,而非连续数值,确保配色逻辑适配分类场景
    • 使用scale_color_brewer(palette = "Set1"):该调色板包含高对比度的颜色,不同年份的折线区分度更高;也可选择scale_color_viridis(discrete = TRUE)使用viridis的离散版本
    • 可选增加linewidth = 1加粗折线,进一步强化视觉区分效果

原尝试代码

library(ggplot2)
df2 |>
  ggplot(aes(x=month, y=n, group=year, colour=year)) +
  geom_line() +
  ggtitle("Monthly admission numbers by year") +
  theme_minimal()+
  scale_color_viridis()

数据集

df2 = structure(list(year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2019L, 2019L, 2019L, 
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 
2020L, 2020L, 2020L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 
2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2022L, 2022L, 2022L, 
2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 
2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 
2023L, 2023L, 2023L), month = c("January", "February", "March", 
"April", "May", "June", "July", "August", "September", "October", 
"November", "December", "January", "February", "March", "April", 
"May", "June", "July", "August", "September", "October", "November", 
"December", "January", "February", "March", "April", "May", "June", 
"July", "August", "September", "October", "November", "December", 
"January", "February", "March", "April", "May", "June", "July", 
"August", "September", "October", "November", "December", "January", 
"February", "March", "April", "May", "June", "July", "August", 
"September", "October", "November", "December", "January", "February", 
"March", "April", "May", "June", "July", "August", "September", 
"October", "November", "December"), n = c(16L, 20L, 31L, 17L, 
18L, 16L, 15L, 32L, 23L, 26L, 7L, 16L, 15L, 20L, 31L, 24L, 16L, 
13L, 9L, 13L, 15L, 14L, 15L, 16L, 16L, 27L, 17L, 10L, 12L, 15L, 
7L, 17L, 16L, 16L, 14L, 11L, 37L, 39L, 24L, 22L, 17L, 17L, 16L, 
38L, 21L, 17L, 11L, 27L, 20L, 42L, 12L, 15L, 12L, 7L, 19L, 25L, 
35L, 25L, 9L, 9L, 19L, 53L, 30L, 20L, 22L, 13L, 21L, 44L, 44L, 
28L, 17L, 15L)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -72L), groups = structure(list(year = c(2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 
2019L, 2019L, 2019L, 2019L, 2019L, 2020L, 2020L, 2020L, 2020L, 
2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2020L, 2021L, 
2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 2021L, 
2021L, 2021L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 
2022L, 2022L, 2022L, 2022L, 2022L, 2023L, 2023L, 2023L, 2023L, 
2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L), month = c("April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September", "April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September", "April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September", "April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September", "April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September", "April", 
"August", "December", "February", "January", "July", "June", 
"March", "May", "November", "October", "September"), .rows = structure(list(
    4L, 8L, 12L, 2L, 1L, 7L, 6L, 3L, 5L, 11L, 10L, 9L, 16L, 20L, 
    24L, 14L, 13L, 19L, 18L, 15L, 17L, 23L, 22L, 21L, 28L, 32L, 
    36L, 26L, 25L, 31L, 30L, 27L, 29L, 35L, 34L, 33L, 40L, 44L, 
    48L, 38L, 37L, 43L, 42L, 39L, 41L, 47L, 46L, 45L, 52L, 56L, 
    60L, 50L, 49L, 55L, 54L, 51L, 53L, 59L, 58L, 57L, 64L, 68L, 
    72L, 62L, 61L, 67L, 66L, 63L, 65L, 71L, 70L, 69L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -72L), .drop = TRUE))

内容的提问来源于stack exchange,提问作者Anna Le Souef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:45:54