如何让ggplot图表X轴按Variac_2019时序排序并显示Mes1_Any标签
问题描述
我需要创建一个图表,要求按Variac_2019列的时间顺序排序,但X轴要显示Mes1_Any列的标签。当前在RStudio中生成的图表X轴是按字母顺序排列的,请问如何实现X轴显示Mes1_Any标签且按Variac_2019时序排序?
数据集
structure(list(Mes1_Any = c("Gen.2020", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag.", "Set.", "Oct.", "Nov.", "Des.", "Gen.2021", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag.", "Set.", "Oct.", "Nov.", "Des.", "Gen.2022", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag.", "Gen.2020", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag.", "Set.", "Oct.", "Nov.", "Des.", "Gen.2021", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag.", "Set.", "Oct.", "Nov.", "Des.", "Gen.2022", "Feb.", "Març", "Abril", "Maig", "Juny", "Jul.", "Ag."), Variac_2019 = c("2020_01", "2020_02", "2020_03", "2020_04", "2020_05", "2020_06", "2020_07", "2020_08", "2020_09", "2020_10", "2020_11", "2020_12", "2021_01", "2021_02", "2021_03", "2021_04", "2021_05", "2021_06", "2021_07", "2021_08", "2021_09", "2021_10", "2021_11", "2021_12", "2022_01", "2022_02", "2022_03", "2022_04", "2022_05", "2022_06", "2022_07", "2022_08", "2020_01", "2020_02", "2020_03", "2020_04", "2020_05", "2020_06", "2020_07", "2020_08", "2020_09", "2020_10", "2020_11", "2020_12", "2021_01", "2021_02", "2021_03", "2021_04", "2021_05", "2021_06", "2021_07", "2021_08", "2021_09", "2021_10", "2021_11", "2021_12", "2022_01", "2022_02", "2022_03", "2022_04", "2022_05", "2022_06", "2022_07", "2022_08"), Territori = c("Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Catalunya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya", "Espanya"), Alimentació = c(-4.76190476190477, -4.51745379876797, -0.196850393700776, -15.1950718685832, -20.4007285974499, -5.13089005235603, -3.37394564198689, -1.94174757281553, 3.94600207684319, -8.44564240790655, -7.68518518518518, 6.2227074235808, -11.175898931001, -2.87474332648872, 6.29921259842521, 1.95071868583161, -6.46630236794171, 9.42408376963351, -0.749765698219307, 6.25674217907228, 15.3686396677051, -2.60557053009882, 3.42592592592592, 16.2663755458515, -6.99708454810496, 1.5400410677618, 9.25196850393701, -1.74537987679672, -0.637522768670318, 11.0994764397906, -2.43673851921276, 8.62998921251348, -6.66058394160584, -5.89410589410588, 0.595829195630571, -11.8181818181818, -18.3970856102004, -4.42211055276382, -4.65753424657533, -6.06653620352251, 1.24879923150818, -9.30434782608696, -3.59168241965974, 3.06122448979591, -16.514598540146, -5.79420579420579, 5.56107249255213, -0.707070707070712, -7.01275045537341, 7.33668341708542, -2.46575342465754, 0.684931506849318, 9.12584053794427, -5.39130434782609, 7.65595463137998, 9.89795918367347, -9.85401459854014, -3.4965034965035, 6.05759682224429, -0.202020202020203, -0.637522768670318, 10.5527638190955, -4.5662100456621, 5.7729941291585)), row.names = c(NA, -64L), class = c("tbl_df", "tbl", "data.frame"))
当前代码
plot1 <- ggplot(alimentacio, aes(x=Mes1_Any, y=Alimentació, color= Territori, group=Territori))+ geom_line()
解决方案
要实现X轴按Variac_2019时序排序且显示Mes1_Any标签,关键是将Mes1_Any转换为有序因子,指定其层级顺序与Variac_2019的时序一致。
1. 预处理数据,生成有序因子
使用dplyr对数据排序并提取正确的标签顺序,再将Mes1_Any转换为有序因子:
library(dplyr) library(ggplot2) # 按Variac_2019排序,提取唯一的Mes1_Any顺序 ordered_mes <- alimentacio %>% arrange(Variac_2019) %>% pull(Mes1_Any) %>% unique() # 将Mes1_Any转为有序因子,层级为ordered_mes的顺序 alimentacio <- alimentacio %>% mutate(Mes1_Any = factor(Mes1_Any, levels = ordered_mes, ordered = TRUE))
2. 绘制调整后的图表
使用处理后的数据集绘制折线图,此时X轴会自动按Variac_2019的时序排列,同时显示Mes1_Any的标签:
plot1 <- ggplot(alimentacio, aes(x=Mes1_Any, y=Alimentació, color=Territori, group=Territori)) + geom_line() + # 可选:旋转X轴标签,避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
核心原理
- 有序因子的层级顺序由
ordered_mes决定,而ordered_mes是通过按Variac_2019排序后提取的唯一Mes1_Any值,保证了时序的正确性。 - ggplot默认会按照因子的层级顺序绘制X轴,而非字母顺序,这样就实现了需求。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

