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