r - ggplot、构面、饼图、缺失值
问题描述
这是我的最终数据集。我最初是通过分别计算值并从原始更大的数据集中在女性 (F) 和男性 (M) 之间进行 rbind 来获得此表的。
我正在尝试制作一个漂亮的饼图,外面有百分比标签,我遇到了所有可能无法找到解决方案的问题。请注意,数据框中的男性没有值 A。
Dataframe: sex ms n_ms n msPerc value 1 FA 1 91 0.01098901 1.098901 2 FB 18 91 0.19780220 19.780220 3 FC 65 91 0.71428571 71.428571 4 FD 7 91 0.07692308 7.692308 5 MB 11 108 0.10185185 10.185185 6 MC 86 108 0.79629630 79.629630 7 MD 11 108 0.10185185 10.185185
library(ggplot2)
library(ggrepel)
library(tidyverse)
n<- c(91, 91 , 91, 91, 108, 108, 108 )
n_ms<-c(1,18,65,7,11,86,11)
sex<- c("F","F","F","F", "M"," M","M")
ms<- c("A","B","C","D","B","C","D")
df <- data.frame(sex, ms, n_ms, n)
df[is.na(df)]<- 0
df$msPerc <- df$n_ms /df$n
df$value <- 100*df$n_ms /df$n
df$n_ms<- as.integer(df$n_ms) # original big dataframe (doing for replication purposes)
df$n<- as.integer(df$n)
#creating position of labels
df2 <- df %>%
mutate(csum = rev(cumsum(rev(value))),
pos = value/2 + lead(csum, 1),
pos = if_else(is.na(pos), value/2, pos))
ms_pie<-ggplot(df, aes(x="", y=msPerc, group=sex, fill=ms)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0) +
facet_grid(.~ sex) +
theme_void()+
theme(legend.position="top",
legend.text = element_text(size = 9),
legend.title = element_text(size = 9,face = "bold"))+
scale_fill_manual(values=c("#d7191c", "#fdae61", "#abd9e9","#5e3c99"),
name="Moulting stage",
labels=c("A","B","C","D"))+
# geom_label(aes(label = percent(msPerc)),
# position = position_stack(vjust = 0.5),
# show.legend = FALSE)
# geom_text(aes(label = percent(msPerc)),size = 3,color = "black",
# position = position_stack(vjust = 0.5),
# show.legend = FALSE)
geom_label_repel(data = df2,
aes(y = pos, label = paste0(value, "%")),
size = 4.5, nudge_x = 1, show.legend = FALSE)
ms_pie
这就是发生的事情......
我想要的是来自 https://r-charts.com/part-whole/pie-chart-labels-outside-ggplot2/ 的饼图,但在变量“sex”中包含 facet_grid。
到目前为止,这是我得到的最接近的。使用 geom_label,但是我的值重叠,我也不知道如何将它们分开......成为 R 初学者的乐趣。
我还尝试了ggplot、facet、piechart 中提供的解决方案:将文本放在饼图切片的中间, 但 coor_polar 不适用于“免费”刻度。
我将非常感谢您的帮助。亲切的问候。
解决方案
我试图清理您的代码有几个问题(请参阅前面的注释####
) - 这应该让您更接近:
library(ggplot2)
library(ggrepel)
library(tidyverse)
library(scales) #### using scales for number formatting
n<- c(91, 91 , 91, 91, 108, 108, 108 )
n_ms<-c(1,18,65,7,11,86,11)
sex<- c("F","F","F","F", "M","M","M") #### changed " M" to "M" at last but one element
ms<- c("A","B","C","D","B","C","D")
df <- data.frame(sex, ms, n_ms, n)
df[is.na(df)]<- 0
df$msPerc <- df$n_ms /df$n
df$value <- 100*df$n_ms /df$n
df$n_ms<- as.integer(df$n_ms) # original big dataframe (doing for replication purposes)
df$n<- as.integer(df$n)
#creating position of labels
df2 <- df %>% group_by(sex) %>% #### you need to group your data by the facets you want to show
mutate(csum = cumsum(msPerc), #### adjusted example code to use "msPerc"
pos = msPerc/2 + lag(csum, 1),
pos = if_else(is.na(pos), msPerc/2, pos))
ms_pie<-ggplot(df, aes(x="", y=msPerc, group=sex, fill=ms)) +
geom_col(width = 1) +
coord_polar("y", start=0) +
facet_grid(~sex) +
theme_void()+
theme(legend.position="top",
legend.text = element_text(size = 9),
legend.title = element_text(size = 9,face = "bold"))+
scale_fill_manual(values=c("#d7191c", "#fdae61", "#abd9e9","#5e3c99"),
name="Moulting stage",
labels=c("A","B","C","D"))+
geom_label_repel(data = df2,
aes(y = pos, label = percent(msPerc, digits = 1)),
size = 4.5, nudge_x = 1, show.legend = FALSE)
ms_pie
推荐阅读
- c# - 弹丸不是我的武器的射击方向
- linux - 将多个内核缓冲区映射到连续的用户空间缓冲区?
- dictionary - 如何区分 Golang 中的两种自定义结构类型,其数据与地图中的键相同?
- powershell - Powershell 仅排除文件
- python - 找到黑桃 A 时超出了最大递归深度
- mysql - 来自 Optionmenu 的 Variable.get() 没有返回我需要查询 mySQL 的内容
- python - Apache 无法使用 WSGI mod 与 Flask 一起工作
- javascript - 向 Google DriveApp 提交多个附件行
- excel - 记录的 vba 代码不会更改图表中的图例颜色
- javascript - 如何在不重复角度数据的情况下合并