如何在ggplot中分层设置坐标轴标签?

3

我的数据结构如下:

month <- c("May", "June", "July", "May", "June", "July")
year <- c("2015", "2015", "2015", "2016", "2016", "2016")
value <- c(1:3, 3:1)
df <- data.frame(month, year, value)

(实际数据从一月到十二月,为方便演示,这里只给出了一个短的可复制示例。)
我正在使用ggplot进行value的时间序列绘图(假设由于某些复杂原因我不能使用plot.ts())。 如何将x轴标签层叠,使得每个刻度标记都标有月份,并在下面加入另一个带有年份的标签,以便获得类似这样的效果:
-------+-------+-------+----//---+-------+-------+-----
      May     June    July      May     June    July
              2015                      2016

1
你可以查看https://dev59.com/X2Ij5IYBdhLWcg3wJCF-和https://dev59.com/x2Ml5IYBdhLWcg3wuZDL(我认为它们不是重复的)。 - Uwe
谢谢!这正是我在寻找的。我已经搜索过了,但没有找到那些文章。 - mmyoung77
顺便说一句,我更喜欢ISO8601标准命名月份,例如2015-05、2015-06、2015-07、2016-05等。这可以确保在转换成因子时按正确顺序排序月份。 - Uwe
2个回答

5

我不会制作两个轴,只需要一个轴,并加入调整后的标签和换行符即可。这个示例展示了如何在每个月份下面添加年份。我通常只会在一月份下放置年份,如果一月份不存在,则放置在该年度绘制的第一个月份下。您可以根据自己的喜好调整标签的准备工作。

df$lab <- factor(1:6, labels = paste0(month,"\n",year))
ggplot(df, aes(x = lab, y = value)) + geom_point()

enter image description here


非常聪明地使用了 label 参数来强制执行给定的排序顺序,这是对 factor() 函数的巧妙运用。如果没有这个参数,仅使用 paste() 将导致标签按字母顺序排列,例如 June 2015、June 2016、July 2015 等,从而忽略年份作为主要排序标准的影响。 - Uwe

3
另一个选择是使用按年份分面,并将分面标签放在x轴标签下方。这样可以更容易地每年只有一个年份标签。我已经删除了面板之间的空格,以创建未分面绘图的外观,但添加了一条垂直线来突出时间的断裂。如果您喜欢单独的面板,则只需删除panel.spacingpanel.bordertheme元素即可。
theme_set(theme_classic())

df$month = factor(df$month, levels=month.name)

ggplot(df, aes(x = month, y = value)) + 
  geom_point() +
  facet_grid(. ~ year, switch="x") +
  theme(strip.placement="outside",
        strip.background=element_rect(colour=NA),
        panel.spacing.x=unit(0,"lines"),
        panel.border=element_rect(colour="grey50", fill=NA))

在此输入图片描述

根据您的使用情况,您可能会发现使用每年的颜色美学并将所有线路放在单个面板上更可取:

ggplot(df, aes(x = month, y = value, colour=year, group=year)) + 
  geom_line() + geom_point() 

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接