geom_bar中的条形宽度相同(position =“dodge”)

前端之家收集整理的这篇文章主要介绍了geom_bar中的条形宽度相同(position =“dodge”)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想绘制具有相同宽度的条形图.这是我的最小示例代码
data <- data.frame(A = letters[1:17],B = sample(1:500,17),C = c(rep(1,5),rep(2,6),rep(c(3,4,each = 2)))

ggplot(data,aes(x = C,y = B,label = A,fill = A)) +
  geom_bar(stat = "identity",position = "dodge") +
  geom_text(position = position_dodge(width = 0.9),angle = 90)

结果如上图所示:

条形的宽度取决于变量C中给出的组中观察的数量.我希望每个条形具有相同的宽度.

facet_grid(~C)工作(条形宽度相同),这不是我的意思:

ggplot(data,angle = 90) +
  facet_grid(~C)

我想要的是在第一张照片中有一个情节,但是条纹的宽度与C列每个级别的观察次数无关.我该怎么做?

[编辑] geom_bar(宽度)改变了bars’group的宽度,但是第五组中的仍然比第一组中的更宽,所以它不是我的问题的答案.

解决方法

更新

使用ggplot2_3.0.0版本,您现在可以使用position_dodge2和preserve = c(“total”,“single”)

ggplot(data,fill = A)) +
  geom_col(position = position_dodge2(width = 0.9,preserve = "single")) +
  geom_text(position = position_dodge2(width = 0.9,preserve = "single"),angle = 90,vjust=0.25)

原始答案

正如已经评论过的那样你可以像在这个answer中那样做:
将A和C转换为因子,并使用tidyr完成添加看不见的变量.从最近的ggplot2版本开始,建议在stat =“identity”的情况下使用geom_col而不是geom_bar:

data %>% 
  as.tibble() %>% 
  mutate_at(c("A","C"),as.factor) %>% 
  complete(A,C) %>% 
  ggplot(aes(x = C,fill = A)) +
  geom_col(position = "dodge")

或者使用交互术语:

data %>% 
  ggplot(aes(x = interaction(C,A),fill = A)) +
  geom_col(position = "dodge")

最后,通过将交互转换为数字,您可以根据所需的输出设置x轴.通过分组(group_by),您可以计算匹配的中断.围绕ggplot参数的{}的奇特东西是直接使用管道内的变量Breaks和C的neseckary.

data %>% 
  mutate(gr=as.numeric(interaction(C,A))) %>% 
  group_by(C) %>% 
  mutate(Breaks=mean(gr)) %>% 
  {ggplot(data=.,aes(x = gr,fill = A,label = A)) +
   geom_col(position = "dodge") +
   geom_text(position = position_dodge(width = 0.9),angle = 90 ) +
   scale_x_continuous(breaks = unique(.$Breaks),labels = unique(.$C))}

编辑:

另一种方法是使用facet.使用space =“free_x”允许设置与x标度长度成比例的宽度.

library(tidyverse)
data %>% 
  ggplot(aes(x = A,fill = A))  +  
   geom_col(position = "dodge") +
   facet_grid(~C,scales = "free_x",space = "free_x")

您还可以使用开关绘制底部的构面标签删除x轴标签

data %>% 
  ggplot(aes(x = A,fill = A))  +  
  geom_col(position = "dodge") +
  facet_grid(~C,space = "free_x",switch = "x") + 
  theme(axis.text.x = element_blank(),axis.ticks.x = element_blank(),strip.background = element_blank())

猜你在找的CSS相关文章