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