R 为ggplot中的两个不同列制作并排饼图,并针对不同的因素进行面包装

R 为ggplot中的两个不同列制作并排饼图,并针对不同的因素进行面包装,r,ggplot2,pie-chart,R,Ggplot2,Pie Chart,我正在尝试为我拥有的数据矩阵制作一些饼图。我在下面创建了一个具有类似变量的虚拟矩阵。我有两个结果值要处理,那就是面积和侵蚀。对于每个结果值,我可以有三个因素之一,即高精度区、中等精度区。区域和低精度。区域 我想在3行2列的图表中显示这一点。每行需要有每个分区的面积饼图和侵蚀饼图。我可以通过添加facet_wrap~区域来分隔饼图,但我不确定如何通过两个不同的列分隔饼图?所以我可以在每一行中并排显示侵蚀饼图和面积饼图 另外,我的原始矩阵每行最多可以有15个值,这意味着饼图会很拥挤。是否有一种方法或

我正在尝试为我拥有的数据矩阵制作一些饼图。我在下面创建了一个具有类似变量的虚拟矩阵。我有两个结果值要处理,那就是面积和侵蚀。对于每个结果值,我可以有三个因素之一,即高精度区、中等精度区。区域和低精度。区域

我想在3行2列的图表中显示这一点。每行需要有每个分区的面积饼图和侵蚀饼图。我可以通过添加facet_wrap~区域来分隔饼图,但我不确定如何通过两个不同的列分隔饼图?所以我可以在每一行中并排显示侵蚀饼图和面积饼图

另外,我的原始矩阵每行最多可以有15个值,这意味着饼图会很拥挤。是否有一种方法或一个简单的函数可以使用0或低于某个阈值的忽略值

我将感谢任何有关这方面的帮助和建议

library(ggplot2)
library(tidyverse)
library(RColorBrewer)
my_pal <- colorRampPalette(brewer.pal(9, "Set1"))

#### create new matrix ############
new_mat<-matrix(, nrow=40, ncol = 4)
colnames(new_mat)<-c("Zones", "ssoilcmb", "Erosion_t", "area..sq.m.")

for ( i in 1:nrow(new_mat)){ 
  new_mat[i,4]<-as.numeric(sample(0:20, 1))
  new_mat[i,3]<-as.numeric(sample(0:20, 1))
  a<-sample(c("S2","S3","S4","S5","S1"),1)
  b<-sample(c("Deep","Moderate","Shallow"),1)
  new_mat[i,1]<-sample(c("High Precip","Moderate Precip","Low Precip"),1)
 
  new_mat[i,2]<-paste0(a,"_",b)
}

m_dt<-as.data.frame(new_mat)
m_dt$Erosion_t<-as.numeric(m_dt$Erosion_t)
m_dt$area..sq.m.<-as.numeric(m_dt$area..sq.m.)

#### calculate parea
m_dt<- m_dt %>%
  group_by(Zones)%>%
  mutate(per_er=signif((`Erosion_t`/sum(`Erosion_t`))*100,3), per_area=signif((`area..sq.m.`/sum(`area..sq.m.`))*100,3))

############ plot 
 ggplot(m_dt, aes(x="", y=per_er, fill=ssoilcmb)) + geom_bar(stat="identity", width=1, position = position_fill())+
  coord_polar("y", start=0) + facet_wrap(~ Zones) +geom_text_repel(aes(label = paste0(per_er, "%")), position = position_fill(vjust = 0.5))+
  scale_fill_manual(values=my_pal(15)) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Erosions")+
  theme_classic() + theme(axis.line = element_blank(),
                          axis.text = element_blank(),
                          axis.ticks = element_blank(),
                          plot.title = element_text(hjust = 0.5, color = "#666666"))


我认为您需要以适当的方式重新排列数据,而不是使用图形语言本身

我在这里提出了我的建议。请原谅高、中、低已更改为1、2和3。我这样做是为了让自己理解这些数据。很明显,您将对其进行重命名

    library(tidyverse)
library(RColorBrewer)
library(ggrepel)
my_pal <- colorRampPalette(brewer.pal(9, "Set1"))

#### create new matrix ############
new_mat<-matrix(, nrow=40, ncol = 4)
colnames(new_mat)<-c("Zones", "ssoilcmb", "Erosion_t", "area..sq.m.")


for ( i in 1:nrow(new_mat)){ 
  new_mat[i,4]<-as.numeric(sample(0:20, 1))
  new_mat[i,3]<-as.numeric(sample(0:20, 1))
  a<-sample(c("S2","S3","S4","S5","S1"),1)
  b<-sample(c("Deep","Moderate","Shallow"),1)
  new_mat[i,1]<-sample(c("High Precip","Moderate Precip","Low Precip"),1)

  new_mat[i,2]<-paste0(a,"_",b)
}

m_dt<-as.data.frame(new_mat)
m_dt$Erosion_t<-as.numeric(m_dt$Erosion_t)
m_dt$area..sq.m.<-as.numeric(m_dt$area..sq.m.)

#### calculate parea
m_dt<- m_dt %>%
  group_by(Zones)%>%
  mutate(per_er=signif((`Erosion_t`/sum(`Erosion_t`))*100,3), per_area=signif((`area..sq.m.`/sum(`area..sq.m.`))*100,3))

## You must rearrange your data as given here:

a<-data.frame(m_dt$Zones,m_dt$ssoilcmb, m_dt$per_er)
b<-data.frame(m_dt$Zones,m_dt$ssoilcmb, m_dt$per_area)
c<-data.frame(Zones=Zones,ssoilcmb=m_dt$ssoilcmb,
              Parameter=c(rep("Erosion",40),rep("Area",40)),
              Values=c(m_dt$per_er,m_dt$per_area))

### Your New Plot ###

ggplot(c, aes(x="", y=Values, fill=ssoilcmb)) + 
  geom_bar(stat="identity", width=1, position = position_fill())+
  coord_polar("y", start=0) + 
  facet_wrap(Zones~Parameter, nrow = 3) +
  geom_text_repel(aes(label = paste0(Values, "%")), position = position_fill(vjust = 0.5))+
  scale_fill_manual(values=my_pal(15)) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Erosions")+
  theme_classic() + theme(axis.line = element_blank(),
                          axis.text = element_blank(),
                          axis.ticks = element_blank(),
                          plot.title = element_text(hjust = 0.5, color = "#666666"))

非常感谢。是否有任何方法可以忽略非重要值(如0.5%)或某些阈值下的值,从而使饼图变得不那么拥挤?