编辑:此问题已被标记为重复,但此处的回复已经过尝试但无效,因为相关案例是折线图,而不是条形图.应用这些方法会生成一个包含5行的图表,每年1行 - 没用.投票标记为重复的任何人是否真的在这个问题提供的样本数据集上尝试这些方法?如果是这样,请发布作为答案.
原始问题:
Excel枢轴图中有一个功能,允许多级分类轴.我正在尝试找到一种方法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))
Run Code Online (Sandbox Code Playgroud)
如果将其导入Excel数据透视表,则可以直接创建以下图表:

注意x轴有两个级别,一个用于四分之一,一个用于分组变量year.是否可以使用多级轴ggplot?
注意:有一个带有小平面的黑客会产生类似的东西,但这不是我想要的.
library(ggplot2)
ggplot(df) +
geom_line(aes(x=quarter,y=sales,group=year))+
facet_grid(.~year,scales="free")
Run Code Online (Sandbox Code Playgroud)

我想沿水平轴显示月份(缩写形式),相应的年份打印一次.我知道如何显示月份:
今年不需要的重复使标签变得混乱.相反,我想要这样的事情:
除了年份将 在月份以下打印.
我在轴标签上方打印了一年,因为这是我能做的最好的.这遵循annotate()函数的限制,如果它位于绘图区域之外,则会被剪裁.我知道可能的解决方法基于annotate_custom(),但我无法使它们与日期对象一起工作(我没有尝试将日期转换为数字并再次返回日期,因为它似乎比希望必要更复杂)
我想知道新的dup_axis()是否可以为此目的而被劫持.如果不是将复制的轴发送到面板的另一侧,它可以在复制的轴下面发送几行,那么可能只是设置一个轴被panel.grid.major清空并且标签设置为%b,而另一个轴将panel.grid.minor消隐,标签设置为%Y.(另外一个挑战是年标签将转移到10月而不是1月)
这些问题是相关的.但是,就我所知,annotate_custom()功能和textGrob()功能与日期不相符.
数据和基本代码如下:
library("ggplot2")
library("scales")
ggplot(data = df, aes(x = Date, y = value)) + geom_line() +
scale_x_date(date_breaks = "2 month", date_minor_breaks = "1 month", labels = date_format("%b %Y")) +
xlab(NULL)
ggplot(data = df, aes(x = Date, y = value)) + geom_line() +
scale_x_date(date_minor_breaks = "2 month", labels = date_format("%b")) +
annotate(geom = …Run Code Online (Sandbox Code Playgroud)