R ggplot2:显示x轴标签的类别和子类别

R ggplot2:显示x轴标签的类别和子类别,r,ggplot2,R,Ggplot2,我希望x轴按类别进行标记,下面我希望为大类别进行标记。例如,我想要aa、ba和ca的轴标签,然后在ggplot中的大_类别a的轴标签下面加一个标签。我不希望它与类别的标签混合在一起,我还希望它位于水平显示的x轴标签下面 我也尝试过facet_grid,但这给了我一个问题,因为这些条的大小并不均匀。像big_一样,a类有3个类别,而big_c类只有1个。我希望它们都有相同的宽度,我希望有一个连续的绘图 更新 big_category category variable value a

我希望x轴按类别进行标记,下面我希望为大类别进行标记。例如,我想要aa、ba和ca的轴标签,然后在ggplot中的大_类别a的轴标签下面加一个标签。我不希望它与类别的标签混合在一起,我还希望它位于水平显示的x轴标签下面

我也尝试过facet_grid,但这给了我一个问题,因为这些条的大小并不均匀。像big_一样,a类有3个类别,而big_c类只有1个。我希望它们都有相同的宽度,我希望有一个连续的绘图

更新

big_category category   variable    value
a     aa    x   1.2
a     ba    x   1.05
a     ca    x   1.11
a     aa    y   1.43
a     ba    y   1.09
a     ca    y   0.97
a     aa    z   1.12
a     ba    z   1.46
a     ca    z   1.32

b     ab    x   1.2
b     bb    x   1.05
b     cb    x   1.11
b     ab    y   1.43
b     bb    y   1.09
b     cb    y   0.97
b     ab    z   1.12
b     bb    z   1.46
b     cb    z   1.32
c     ac    x   1.2
c     ac    y   1.05
c     ac    z   1.11
代码:

big_主题%mutate(变量=fct_relevel(变量,c(“z”,“x”,“y”)))+
geom_col(position=“identity”,
aes(x=类别,y=值,填充=变量,颜色=变量))+
平面网格(.~big_category,space=“free_x”,scales=“free_x”,switch=“x”)+
大主题+主题2+主题3+
主题(strip.placement=“外部”,
strip.background=元素(fill=NA,color=“白色”),
面板间距x=单位(0,“cm”),
strip.text=元素\文本(hjust=0,face=“bold”,size=12))

下面是一个示例,使用您的示例数据,说明如何在
大类中设置
类别。为了简单起见,我只包含了基本的情节元素。当然,您可以将特定的主题、颜色和其他元素添加到下面的基本情节中

big_theme <- theme(
panel.background = element_rect(fill = "black"),
plot.background = element_rect(fill = "black", colour = NA),
plot.title = element_text(hjust = 0.5, size = 15, color = "white"),
axis.text.y = element_text(colour = "white", size = 14),
axis.title.x = element_text(colour = "white", size = 14),
axis.title.y = element_text(colour = "white", size = 14),
axis.text.x = element_text(vjust = 1, angle = 45, color = "white", size = 14, hjust=1),
strip.background = element_rect(fill = "black"),
strip.text = element_text(colour = 'white'),
strip.text.y = element_text(angle = 0),
legend.position = "top"
)

theme2 = theme(panel.background = element_rect(fill = 'black'),
legend.background=element_rect(fill = "black"),
legend.text = element_text(colour = "white", size = 14),
legend.justification = "right",
legend.key.height = unit(1, "line"),
legend.key = element_rect(color = "black", fill = "black"))

theme3 = theme(plot.background = element_rect(fill = 'black'))

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
geom_col(position = "identity",
aes(x = category, y = value, fill = variable, color = variable)) +
facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
big_theme + theme2 + theme3 +
theme(strip.placement = "outside",
strip.background = element_rect(fill=NA,colour="white"),
panel.spacing.x=unit(0,"cm"),
strip.text = element_text(hjust=0, face="bold", size=12))

更新:如果我理解您的评论,下面是更新的代码,用于左对齐条带文本并删除条带边框。我不知道有什么方法(不破坏ggplot之外的底层图形对象)在条带之间只有垂直线。然而,我已经在面板之间添加了一些空间,并添加了面板边框来描绘
big_类别
级别

library(tidyverse)

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
  geom_col(position = "identity", 
           aes(x = category, y = value, fill = variable, color = variable)) + 
  facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
  theme_classic() +
  theme(strip.placement = "outside",
        strip.background = element_rect(fill=NA, colour="grey50"),
        panel.spacing.x=unit(0,"cm"))

更新2:我创建了一个带有以下更改的绘图:(1)x轴标签左端的
big\u category
标签,以及(2)当
category
的唯一级别少于3个时,空白
big\u category
标签。为了使用空白标签保持相同的方面“中断”,我们为每个前
big_类别
值创建一个唯一的空白字符串(通过改变字符串的长度)

我不认为情节看起来很好(我实际上认为,如果顶部的
big_category
facet strips处于标准位置,文本居中,效果会更好),但也许你可以尝试一下,得到一些满足你需要的东西。我已经对代码进行了注释,解释了它在做什么,但是如果有什么不清楚的地方,请告诉我

我们将使用您发布的新的
示例数据
,但我们将在
大类
中添加第四级:

ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
  geom_col(position = "identity", 
           aes(x = category, y = value, fill = variable, color = variable)) + 
  facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
  theme_bw() +
  theme(strip.placement = "outside",
        strip.background = element_rect(fill=NA,colour=NA),
        panel.spacing.x=unit(0.15,"cm"), 
        strip.text = element_text(hjust=0, face="bold", size=12))
现在,我们将对
sample_data
进行一些转换,将其设置为绘图,并将调整后的数据框直接导入ggplot:

sample_data = sample_data %>% 
  bind_rows(data_frame(big_category="d",
                       category=c("da1111111111", "db111111"),
                       variable=c("z","x"), value=c(1.1,0.6)))
样本数据%>%
变异(变量=fct_relevel(变量,c(“z”,“x”,“y”)))%>%
#创建分组列(称为short_cat)以标记大类别的级别
#具有两个或两个以下的唯一类别级别
按(大类)分组%>%
突变(短_cat=长度(唯一(类别))%
解组%>%
#为grp的每个唯一值创建唯一的空白字符串
突变(grp=c(0,cumsum(diff(short_cat)!=0)),
grp=sapply(grp,函数(g)粘贴(rep(“,g),collapse=”“),
#将空白字符串指定给每个级别的大类,短类
#是真的
大类=替换(大类、短类、grp[短类]),
#为大类设置因子顺序,以便新级别保持相同的顺序
#作为原始级别
大类=系数(大类,级别=唯一(大类))%>%
ggplot()+
几何坐标(位置=“标识”,宽度=0.8,
aes(x=类别,y=值,填充=变量,颜色=变量))+
平面网格(.~big_category,space=“free_x”,scales=“free_x”,switch=“x”)+
主题_bw()+
主题(axis.text.x=element\u text(角度=45,vjust=1,hjust=1),
strip.placement=“外部”,
条带背景=元素(填充=NA,颜色=NA),
面板间距x=单位(0.15,“cm”),
#左对齐大类标签
strip.text=元素\文本(hjust=0,face=“bold”,size=12))+
#展开x轴的左侧,使大类别标签位于左侧下方
#x轴标签的末端
扩展_限制(x=-0.5)

中的选项1a和1b可能会有所帮助。基本思想是按
big\u类别划分面,并将面标签放在底部(和轴外部)而不是在顶部。我看了它,它很有帮助。然而,由于每个大类的类别数量不相等,所以这些条的大小并不均匀。如何移动矩形和文本?我希望a、b和c向左调整,因为我只对aa、ba、ca、ab、bb、cb、ac进行了调整。我想做一个公正的但当我做一个公正的tex时t、 它是不可见的,我不能只画矩形。我还想在边上画两条线,而不是一个完整的矩形。基本上,这个矩形没有顶部和底部。请看我更新的答案,让我知道这是否有帮助。谢谢你的更新。我想这个问题在这个示例数据中没有清楚地显示出来,因为它太小了。但是我有我喜欢类别中的50个长标签,我将其调整为45度角。因此,标签很好地放在图表的左侧。我希望大类别标签一直放在标签的左下角。此外,我希望能够删除小于2个类别的大类别标签。我已将代码和图表更新为反映这一变化和问题
ggplot(sample_data %>% mutate(variable=fct_relevel(variable, c("z","x","y")))) +
  geom_col(position = "identity", 
           aes(x = category, y = value, fill = variable, color = variable)) + 
  facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
  theme_bw() +
  theme(strip.placement = "outside",
        strip.background = element_rect(fill=NA,colour=NA),
        panel.spacing.x=unit(0.15,"cm"), 
        strip.text = element_text(hjust=0, face="bold", size=12))
sample_data = sample_data %>% 
  bind_rows(data_frame(big_category="d",
                       category=c("da1111111111", "db111111"),
                       variable=c("z","x"), value=c(1.1,0.6)))
sample_data %>% 
  mutate(variable=fct_relevel(variable, c("z","x","y"))) %>% 
  # Create grouping column (called short_cat) to mark levels of big_category 
  #  with two or fewer unique levels of category
  group_by(big_category) %>% 
  mutate(short_cat = length(unique(category)) <= 2) %>% 
  ungroup %>% 
  # Create a unique white-space string for each unique value of grp
  mutate(grp = c(0, cumsum(diff(short_cat) != 0)),
         grp = sapply(grp, function(g) paste(rep(" ", g), collapse="")),
         # Assign white-space strings to each level of big_category for which short_cat 
         # is TRUE
         big_category=replace(big_category, short_cat, grp[short_cat]),
         # Set factor order for big_category so new levels will stay in same order 
         #  as original levels
         big_category=factor(big_category, levels=unique(big_category))) %>%
  ggplot() +
    geom_col(position = "identity", width=0.8, 
             aes(x = category, y = value, fill = variable, color = variable)) + 
    facet_grid(. ~ big_category, space="free_x", scales="free_x", switch="x") +
    theme_bw() +
    theme(axis.text.x=element_text(angle=45, vjust=1, hjust=1),
          strip.placement = "outside",
          strip.background = element_rect(fill=NA,colour=NA),
          panel.spacing.x=unit(0.15,"cm"), 
          # Left justify big_category labels
          strip.text = element_text(hjust=0, face="bold", size=12)) +
    # Expand left side of x-axis so that big_category labels will be under left 
    #  end of x-axis labels
    expand_limits(x=-0.5)