如何优化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")
优化说明
设置X轴起始月份为一月
原数据中的month是字符型,ggplot默认按字母顺序排序(如April会排在January之前)。通过将month转换为有序因子,指定从January到December的层级顺序,即可让X轴按自然月份顺序排列,起始为一月。提升年份折线颜色辨识度
- 将
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
相关产品推荐
相关产品推荐

