% mutate_at(c("A", "C"), as.factor) %>% comple-6ren">
gpt4 book ai didi

r - geom_bar(position = "dodge") 中条的宽度相同

转载 作者:行者123 更新时间:2023-12-03 14:37:14 25 4
gpt4 key购买 nike

我想绘制具有相同条形宽度的图。这是我的最小示例代码:

data <- data.frame(A = letters[1:17],
B = sample(1:500, 17),
C = c(rep(1, 5), rep(2, 6), rep(c(3,4,5), 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)

结果如上图所示:
enter image description here

条形的宽度取决于变量 C 中给出的组中的观察数量。 .我想让每个条具有相同的宽度。
facet_grid(~C)有效(条形宽度相同)这不是我的意思:
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) +
facet_grid(~C)

enter image description here

我想要的是像第一张图中那样的情节,但条形的宽度与来自列 C 的每个级别中的观察数量无关。 .我该怎么做?

[编辑] geom_bar(width)更改条形组的宽度,但第五组中的条形仍然比第一组中的条形宽,所以这不是我问题的答案。

最佳答案

更新

ggplot2_3.0.0您现在可以使用的版本 position_dodge2preserve = c("total", "single")

ggplot(data,aes(x = C,  y = B, label = A, 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)

enter image description here

原答案

正如已经评论过的,您可以像这样操作 answer :
转换 AC使用 tidyr 因子和添加看不见的变量的 complete .由于最近 ggplot2版本建议使用 geom_col而不是 geom_barstat = "identity" 的情况下:
data %>% 
as.tibble() %>%
mutate_at(c("A", "C"), as.factor) %>%
complete(A,C) %>%
ggplot(aes(x = C, y = B, fill = A)) +
geom_col(position = "dodge")

enter image description here

或者使用交互术语:
data %>% 
ggplot(aes(x = interaction(C, A), y = B, fill = A)) +
geom_col(position = "dodge")

enter image description here

通过最终将交互转换为数字,您可以根据所需的输出设置 x 轴。通过分组( group_by ),您可以计算匹配的中断。带有 {} 的花哨的东西围绕 ggplot 参数是 neseccary 直接使用变量 BreaksC管内。
data %>% 
mutate(gr=as.numeric(interaction(C, A))) %>%
group_by(C) %>%
mutate(Breaks=mean(gr)) %>%
{ggplot(data=.,aes(x = gr, y = B, 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))}

enter image description here

编辑:

另一种方法是使用方面。使用 space = "free_x"允许设置与 x 刻度的长度成比例的宽度。
library(tidyverse)
data %>%
ggplot(aes(x = A, y = B, fill = A)) +
geom_col(position = "dodge") +
facet_grid(~C, scales = "free_x", space = "free_x")

enter image description here

您还可以使用 switch 在底部绘制刻面标签。并删除 x 轴标签
data %>% 
ggplot(aes(x = A, y = B, fill = A)) +
geom_col(position = "dodge") +
facet_grid(~C, scales = "free_x", space = "free_x", switch = "x") +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
strip.background = element_blank())

enter image description here

关于r - geom_bar(position = "dodge") 中条的宽度相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38101512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com