我有一個包含三列的資料集,小例子:
A B
1 sety NA
2 NA bety
3 NA bety
4 sety bety
5 sety NA
我如何繪制一個餅圖,其中我有 sety 的百分比、擁有 bety 的百分比以及同時擁有 sety 和 bety 的百分比,在上面的示例中,百分比分別為 60%、60%、20%,第三個百分比必須顯示為前兩個之間的重疊。
可能是這樣的:

uj5u.com熱心網友回復:
- 排列和總結您的資料以找到每組的“開始”和“停止”位置,并轉換為百分比。您將使用這些位置 as
ymin和ymaxforgeom_rect()。 - 取
ymin和ymax作為 % 標簽的位置。 - 使用重疊標簽的值和位置創建一個單獨的資料框。
- 使用 閃避每個組的矩形和標簽
position_dodge(),并使用 增加透明度alpha以強調重疊。 - 回圈使用
coord_polar().
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
plot_data <- dat %>%
arrange(A, !is.na(B)) %>%
summarize(across(
A:B,
list(
ymin = ~ (first(which(!is.na(.x))) - 1) / n(),
ymax = ~ last(which(!is.na(.x))) / n(),
pct = ~ sum(!is.na(.x)) / n()
)
)) %>%
pivot_longer(everything(), names_to = c("set", ".value"), names_sep = "_") %>%
mutate(
xmin = .1,
xmax = 1,
x = xmin ((xmax - xmin) / 2),
y = ymin ((ymax - ymin) / 2)
)
overlap <- with(
plot_data,
tibble(x = median(x), y = median(c(max(ymin), min(ymax))), pct = sum(pct) - 1)
)
ggplot(plot_data, aes(x, y))
geom_rect(
aes(xmin = .1, xmax = 1, ymin = ymin, ymax = ymax, fill = set),
color = "black",
alpha = .5,
position = position_dodge(width = .2)
)
geom_text(
aes(label = percent(pct), group = set),
position = position_dodge(width = .2),
size = 16 / .pt,
fontface = "bold"
)
geom_text(
data = overlap,
aes(label = percent(pct)),
size = 16 / .pt,
fontface = "bold"
)
scale_fill_manual(values = c("#E41A1C", "#377EB8"))
scale_x_continuous(limits = 0:1)
coord_polar(theta = "y")
theme_void()

uj5u.com熱心網友回復:
library(ggplot2)
library(stringr)
library(dplyr)
#initial dataset
data <- data.frame(A = c("sety", NA, NA, "sety", "sety"), B = c(NA, "bety", "bety", "bety", NA))
#combine values and remove the NA
data$C <- str_remove_all(paste0(data$A, data$B), "NA")
#get frequency of each value
freq <- data %>%
group_by(C) %>%
select(C) %>%
summarize(count = n())
#plot
ggplot(freq, aes(x="", y=count, fill = C))
geom_bar(stat="identity", width = 1)
coord_polar("y", start = 0)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/531709.html
