我正在嘗試在 ggplot 中的堆疊條形總數之間插入差異條或方差條。我希望結果看起來像此鏈接中的影像:

我想用兩側堆疊條之間的差異來標記這些差異條。
有人可以告訴我如何實作這一目標嗎?
這是我的示例資料:
df <-
data.frame(
x.axis.Var = rep(c("Phase1", "Phase2", "Phase3", "Phase4"), 2),
cat.Var = rep(c("High Grade","Low Grade"), each = 4),
values = c(500, 200, 600, 300,
150, 500, 600, 200
)
)
整理資料:
df.tmp <- df %>%
mutate(
x.axis.Var = factor(x.axis.Var,
levels = c("Phase1", "Phase2", "Phase3", "Phase4")),
cat.Var = factor(cat.Var,
levels = c("High Grade","Low Grade"))
) %>%
arrange(x.axis.Var, desc(cat.Var)) %>%
mutate(end.Bar = cumsum(values),
start.Bar = c(0, head(end.Bar, -1))) %>%
mutate(group.id = group_indices(., x.axis.Var)) %>%
group_by(x.axis.Var) %>%
mutate(total.by.x = sum(values)) %>%
select(x.axis.Var, cat.Var, group.id, start.Bar, values, end.Bar, total.by.x)
使用 ggplot 繪制資料:
ggplot(df.tmp, aes(x = group.id, y = values, fill = cat.Var))
geom_bar(stat = "identity",position = "stack", width = 0.3)
scale_fill_manual(values=c('#ff0000','#c8f464'))
scale_x_continuous(
expand=c(0,0),
limits = c(min(df.tmp$group.id)-0.5,max(df.tmp$group.id) 0.5),
breaks = c(min(df.tmp$group.id)-0.5,
unique(df.tmp$group.id),
unique(df.tmp$group.id) 0.5
),
labels =
c("",
as.character(unique(df.tmp$x.axis.Var)),
rep(c(""), length(unique(df.tmp$x.axis.Var)))
)
)
theme(
text = element_text(size = 5, color = "#4e4d47"),
axis.text = element_text(size = 8, angle = 90, vjust = 0.5, hjust=1, color = "#4e4d47", face =
"bold"),
axis.text.y = element_text(margin = margin(r = 0.3, unit = "cm")),
axis.ticks.x =
element_line(color =
c("black",
rep(NA, length(unique(df.tmp$x.axis.Var))),
rep("black", length(unique(df.tmp$x.axis.Var))-1)
)
),
axis.line = element_line(colour = "#4e4d47", size = 0.5),
axis.ticks.length = unit(.15, "cm"),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.background = element_blank(),
plot.margin = unit(c(1, 1, 1, 1), "lines"),
legend.text = element_text(size = 10,
color = "#4e4d47",
face = "bold",
margin = margin(l = 0.25, unit = "cm")
),
legend.title = element_blank()
)
uj5u.com熱心網友回復:
我冒昧地將您的代碼剝離了許多無關的東西。
在繪圖之前,您幾乎不會繞過一些手動計算。一種方法是使用您的匯總值創建一個單獨的資料框并將它們繪制為geom_rect(因為geom_col根據定義從 0 開始)
您需要將分類 x 轉換為整數 - 然后您可以“插入”您的匯總列。您需要添加一些標簽以使其看起來分類。
如果需要,為您的注釋添加一個 geom_layer,如果您想要不同的填充,您可以使用 {ggnewscale} 包。
library(tidyverse)
df1 <- data.frame(
x.axis.Var = rep(c("Phase1", "Phase2", "Phase3", "Phase4"), 2),
cat.Var = rep(c("High Grade","Low Grade"), each = 4),
values = c(500, 200, 600, 300,
150, 500, 600, 200
)
) %>%
mutate(cat.Var = factor(cat.Var,
levels = c("High Grade","Low Grade")))
col_width <-.2
df2 <-
df1 %>%
group_by(x.axis.Var) %>%
summarise(sum = sum(values)) %>%
ungroup() %>%
mutate(diff = c(NA, diff(sum)),
x = seq(.5, 3.5, 1),
xmin = x - col_width,
xmax = x col_width,
ymin = lag(sum),
ymax = ymin diff)
ggplot()
geom_col(data = df1, aes(x = as.integer(as.factor(x.axis.Var)), y = values, fill = cat.Var),
width = col_width*2 )
scale_fill_manual(NULL, values=c('#ff0000','#c8f464'))
ggnewscale::new_scale_fill()
geom_rect(data = df2, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = (ymax - ymin) > 0),
alpha = .5, show.legend = FALSE)
geom_text(data = df2, aes(x, y = ymin (ymax - ymin)/ 2, label = diff))
scale_fill_brewer(NULL, palette = "Set1")
scale_x_continuous(NULL, breaks = 1:4, labels = paste0("Phase", 1:4))
#> Warning: Removed 1 rows containing missing values (geom_rect).
#> Warning: Removed 1 rows containing missing values (geom_text).

由reprex 包(v2.0.1)于 2021 年 11 月 17 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/359579.html
