我想绘制具有相同宽度的条形图.这是我的最小示例代码:
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")
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())