R ggplot折线图中的多行x轴标签

R ggplot折线图中的多行x轴标签,r,ggplot2,R,Ggplot2,编辑:此问题已标记为重复,但已尝试回答,但无效,因为所讨论的案例是折线图,而不是条形图。应用这些方法会生成一个5行的图表,每年1行-没有用处。是否有人投票将其标记为重复,并在随此问题提供的样本数据集上尝试了这些方法?如果是的话,请贴出答案 原始问题: Excel pivot图表中有一个允许多级分类轴的功能。我正试图找到一种方法来使用ggplot(或R中的任何其他绘图软件包)执行相同的操作 考虑以下数据集: set.seed(1) df=data.frame(year=rep(2009:2013,

编辑:此问题已标记为重复,但已尝试回答,但无效,因为所讨论的案例是折线图,而不是条形图。应用这些方法会生成一个5行的图表,每年1行-没有用处。是否有人投票将其标记为重复,并在随此问题提供的样本数据集上尝试了这些方法?如果是的话,请贴出答案

原始问题:

Excel pivot图表中有一个允许多级分类轴的功能。我正试图找到一种方法来使用
ggplot
(或R中的任何其他绘图软件包)执行相同的操作

考虑以下数据集:

set.seed(1)
df=data.frame(year=rep(2009:2013,each=4),
              quarter=rep(c("Q1","Q2","Q3","Q4"),5),
              sales=40:59+rnorm(20,sd=5))
如果将其导入Excel数据透视表,则可以直接创建以下图表:

请注意,x轴有两个级别,一个用于季度,另一个用于分组变量year。使用
ggplot
是否可以使用多级轴

注:有一个黑客方面,产生类似的东西,但这不是我要找的

library(ggplot2)
ggplot(df) +
  geom_line(aes(x=quarter,y=sales,group=year))+
  facet_grid(.~year,scales="free")

使用
注释(geom=“text”,
添加新标签。使用
坐标笛卡尔
中的
clip=“off”
关闭x轴标签的剪裁

使用
theme
添加额外的边距(
plot.margin
)并删除(
element\u blank()
)x轴文本(
axis.title.x
axis.text.x
)和垂直网格线(
panel.grid.x



这里还可以看到@eipi10给出的很好的答案:

Henrik建议的代码确实有效,对我帮助很大!我认为该解决方案具有很高的价值。但请注意,代码的第一行有一个小错误,导致数据顺序错误。 而不是

... aes(x = interaction(year,quarter), ...
应该是

... aes(x = interaction(quarter,year), ...
生成的图形的数据顺序正确


顺便说一句,我建议编辑(直到现在才被拒绝),而且,由于有点缺乏声誉,我不允许评论我宁愿做的事情。

用户
Tung
有一个很好的答案

库(tidyverse)
图书馆(lubridate)
图书馆(比例尺)
种子集(123)

df非常好!另外,
x=interaction(year,quarter)
的使用对我来说是新的。哟,哥们,这真是太棒了answer@Henrik如果我在数据中有月份而不是季度,我会怎么做,如
quarty=rep(c(“一月”、“二月”、“三月”、“五月”),5)
?这是一个相当创新的解决方案(使用隐藏面)!
... aes(x = interaction(quarter,year), ...
library(tidyverse)
library(lubridate)
library(scales)

set.seed(123)
df <- tibble(
  date = as.Date(41000:42000, origin = "1899-12-30"), 
  value = c(rnorm(500, 5), rnorm(501, 10))
)

# create year column for facet
df <- df %>% 
  mutate(year = as.factor(year(date)))

p <- ggplot(df, aes(date, value)) + 
  geom_line() + 
  geom_vline(xintercept = as.numeric(df$date[yday(df$date) == 1]), color = "grey60") + 
  scale_x_date(date_labels = "%b", 
               breaks = pretty_breaks(),
               expand = c(0, 0)) +
  # switch the facet strip label to the bottom
  facet_grid(.~ year, space = 'free_x', scales = 'free_x', switch = 'x') +
  labs(x = "") +
  theme_classic(base_size = 14, base_family = 'mono') +
  theme(panel.grid.minor.x = element_blank()) + 
  # remove facet spacing on x-direction
  theme(panel.spacing.x = unit(0,"line")) +
  # switch the facet strip label to outside 
  # remove background color
  theme(strip.placement = 'outside',
        strip.background.x = element_blank())
p