ggplot折线图中的多行x轴标签
编辑:这个问题已被标记为重复,但在这里的答复已经尝试,并没有工作,因为有问题的情况是一个折线图,而不是条形图。 应用这些方法会产生一个5行的图表,每年1个 – 没有用处。 有人投票标记为重复实际上尝试这个问题提供的样本数据集的方法? 如果是这样,请发帖作为答案。
原问题:
Excel透视图中有一个允许多级分类坐标轴的function。我试图find一种方法来使用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数据透视表中,则可以直接创build以下图表:
请注意x轴有两个级别,分别为一个季度和一个分组variables,一年。 ggplot
可以使用多级轴吗?
注意:有一个方面可以产生类似的黑客攻击,但这不是我正在寻找的。
library(ggplot2) ggplot(df) + geom_line(aes(x=quarter,y=sales,group=year))+ facet_grid(.~year,scales="free")
我们使用theme
参数来删除默认的x轴文本( axis.title.x
/ axis.text.x = element_blank()
),并添加额外的边距( plot.margin
)。
新的标签是使用annotate(geom = "text",
。通过将plot对象转换为ggplot_gtable(ggplot_build(
)),可以closuresx轴标签的裁剪。
library(ggplot2) g1 <- ggplot(data = df, aes(x = interaction(year, quarter, lex.order = TRUE), y = sales, group = 1)) + geom_line(colour = "blue") + coord_cartesian(ylim = c(35, 65), expand = FALSE) + annotate(geom = "text", x = seq_len(nrow(df)), y = 34, label = df$quarter, size = 4) + annotate(geom = "text", x = 2.5 + 4 * (0:4), y = 32, label = unique(df$year), size = 6) + theme_bw() + theme(plot.margin = unit(c(1, 1, 4, 1), "lines"), axis.title.x = element_blank(), axis.text.x = element_blank(), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank()) # remove clipping of x axis labels g2 <- ggplot_gtable(ggplot_build(g1)) g2$layout$clip[g2$layout$name == "panel"] <- "off" grid::grid.draw(g2)
另请参阅@ eipi10在这里的好回答: 防止不必要地用时间序列显示一年
Henrikbuild议的代码确实有用,并且帮助了我很多! 我认为解决scheme具有很高的价值。 但是请注意,代码的第一行有一个小错误,导致错误的数据顺序。 代替
... aes(x = interaction(year,quarter), ...
它应该是
... aes(x = interaction(quarter,year), ...
生成的graphics具有正确顺序的数据。
PS我提出了一个编辑(到目前为止被拒绝),由于缺乏声誉,我不能评论,我宁愿做。