使用 ggplot 修复饼图的正确布局
Fixing the proper layout of pie chart using ggplot
我对指定饼图布局的可能性有疑问。让我们来看看下面的代码
pie_chart=function(vec,save){
if (class(vec)=='numeric'){vec<-as.character(vec)
vec<-print(paste('var',vec))
}
df<-data.frame(table(vec))
colnames(df)[1]<-'group'
bp<- ggplot(df, aes(x="", y=Freq, fill=group))+
geom_bar(width = 1, stat = "identity")
blank_theme <- theme_minimal()+
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
plot.title=element_text(size=14, face="bold")
)
pie <- bp + coord_polar("y", start=0)
pie + scale_fill_brewer("Characteristic") + blank_theme +
theme(axis.text.x=element_blank())+
geom_text(aes(y = Freq/3 + c(0, cumsum(Freq)[-length(Freq)]),
label = print(paste0(Freq,'(',percent(Freq/(sum(Freq))),')'))), size=5)
}
pie_chart(c(rep(1,50),rep(2,60),rep(3,26),rep(4,24)))
如上图所示,标签的放置方式很奇怪。有什么简单的方法可以让我将它们集中到 'middle of part of the pie' 中吗?
提前致谢!
将 y
的 geom_text(aes)
更改为:
geom_text(aes(y = rev(Freq)/2 + c(0, cumsum(rev(Freq))[-length(Freq)]),
label = print(paste0(rev(Freq),'(',percent(rev(Freq)/(sum(Freq))),')'))), size=5)
根据 Vincent 的评论,我删除了极坐标。我能够看到您的 Freq
值顺序相反,因此它们的相对间距是正确的,但它们的绝对位置是错误的。请注意,为了清楚起见,我简化了标签。
为了让它们在正确的位置,我首先使用rev()
来反转计算中的Freq
。这将标签放在大致正确的位置,但顺序仍然错误:
然后,我在label
审美中使用了rev
,现在一切都很好。我还除以 2 而不是 3,以使块中的标签居中。
最后,把极坐标放回去,我们得到:
我对指定饼图布局的可能性有疑问。让我们来看看下面的代码
pie_chart=function(vec,save){
if (class(vec)=='numeric'){vec<-as.character(vec)
vec<-print(paste('var',vec))
}
df<-data.frame(table(vec))
colnames(df)[1]<-'group'
bp<- ggplot(df, aes(x="", y=Freq, fill=group))+
geom_bar(width = 1, stat = "identity")
blank_theme <- theme_minimal()+
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
plot.title=element_text(size=14, face="bold")
)
pie <- bp + coord_polar("y", start=0)
pie + scale_fill_brewer("Characteristic") + blank_theme +
theme(axis.text.x=element_blank())+
geom_text(aes(y = Freq/3 + c(0, cumsum(Freq)[-length(Freq)]),
label = print(paste0(Freq,'(',percent(Freq/(sum(Freq))),')'))), size=5)
}
pie_chart(c(rep(1,50),rep(2,60),rep(3,26),rep(4,24)))
如上图所示,标签的放置方式很奇怪。有什么简单的方法可以让我将它们集中到 'middle of part of the pie' 中吗?
提前致谢!
将 y
的 geom_text(aes)
更改为:
geom_text(aes(y = rev(Freq)/2 + c(0, cumsum(rev(Freq))[-length(Freq)]),
label = print(paste0(rev(Freq),'(',percent(rev(Freq)/(sum(Freq))),')'))), size=5)
根据 Vincent 的评论,我删除了极坐标。我能够看到您的 Freq
值顺序相反,因此它们的相对间距是正确的,但它们的绝对位置是错误的。请注意,为了清楚起见,我简化了标签。
为了让它们在正确的位置,我首先使用rev()
来反转计算中的Freq
。这将标签放在大致正确的位置,但顺序仍然错误:
然后,我在label
审美中使用了rev
,现在一切都很好。我还除以 2 而不是 3,以使块中的标签居中。
最后,把极坐标放回去,我们得到: