如何删除多面板饼图中的间距并使用 r 在顶部只有一个图例

How can I remove spacing in Pie charts in multi panel and have only one legend at the top using r

饼图:

LINK 数据:https://drive.google.com/file/d/0BwoPt0jyGdzORkM3cVA0WjJodVk/view?usp=sharing

Mydata<-read.csv(file="final_analysis_candy_analysis.csv",head=TRUE,sep=",")

dhfr.Arg <- table(Mydata$dhfr.Arg.59.163.137.)    
dhfr.Ile <- table(Mydata$dhfr.Ile.51.214.65.)    
dhfr.Asn108 <- table(Mydata$dhfr.Asn108.328.372.)
glu.540 <- table(Mydata$glu.540.538.326.200.)    
gly.437 <- table(Mydata$gly.437.848.300.)

library(plotrix)

par(op)
op <-par(mfrow=c(2,3),mar=c(0,0,1,0))   
pct <- round(dhfr.Arg/sum(dhfr.Arg)*100)
lbls <- paste(names(dhfr.Arg), pct) # add percents to labels    
lbls <- paste(lbls,"%",sep="") # ad % to labels    
lp<-pie3D(dhfr.Arg,radius=0.8,labels=lbls,explode=0.1,
labelrad=1.4,main="dhfr Arg 59(163,137)")    
pct <- round(dhfr.Ile/sum(dhfr.Ile)*100)    
lbls <- paste(names(dhfr.Ile), pct) # add percents to labels    
lbls <- paste(lbls,"%",sep="") # ad % to labels
lp<-pie3D(dhfr.Ile,radius=0.8,labels=lbls,explode=0.1,
  labelrad=1.4,main="dhfr Ile 51(214,65)")    
pct <- round(dhfr.Asn108/sum(dhfr.Asn108)*100)    
lbls <- paste(names(dhfr.Asn108), pct) # add percents to labels    
lbls <- paste(lbls,"%",sep="") # ad % to labels    
lp <- pie3D(dhfr.Asn108,radius=0.8,labels=lbls,explode=0.1,
  labelrad=1.4,main="dhfr Asn108(328,372)")
pct <- round(glu.540/sum(glu.540)*100)    
lbls <- paste(names(glu.540), pct) # add percents to labels   
lbls <- paste(lbls,"%",sep="") # ad % to labels    
lp<-pie3D(glu.540,radius=0.8,labels=lbls,explode=0.1,
  labelrad=1.4,main="glu 540(538,326,200)")    
pct <- round(gly.437/sum(gly.437)*100)   
lbls <- paste(names(gly.437), pct) # add percents to labels    
lbls <- paste(lbls,"%",sep="") # ad % to labels
lp <- pie3D(gly.437,radius=0.8,labels=lbls,explode=0.1,
  labelrad=1.4,main="gly 437(848,300)")
par(op)

plotrix documentation 开始,有一个边距参数 mar - 馅饼周围的边距。请参阅默认设置为 mar=c(4,4,4,4),它正在创建此白色 space。

pie3D(x,edges=NA,radius=1,height=0.1,theta=pi/6,start=0,border=par("fg"),
  col=NULL,labels=NULL,labelpos=NULL,labelcol=par("fg"),labelcex=1.5,
  labelrad=1.25,sector.order=NULL,explode=0,shade=0.8,mar=c(4,4,4,4),pty="s",...)

尝试将 mar 设置为较小的数量,因此在您的 pie3D 调用中添加此选项,例如mar =c(1,1,1,1) 降低所有边距。

使用 2D 可视化将使您的情节更容易理解。因此,另一种 2D 解决方案 ggplot:

# load needed packages
library(data.table)
library(ggplot2)
library(scales)

# process & summarise the data (with data.table)
mydat <- melt(setDT(Mydata),
              id=1,
              measure.vars=4:8)[, .N, by = .(variable,value)
                                ][, `:=` (perc = round(N/sum(N),2),
                                          pos = cumsum(N)-0.5*N), by = variable]

# create the plot with ggplot2 & scales
ggplot(mydat) +
  geom_bar(stat="identity", aes(x="", y=N, fill=value)) +
  geom_text(aes(x = "", y = pos, label = percent(perc))) +
  scale_x_discrete(expand = c(0,0)) +
  scale_y_continuous(expand = c(0,0)) +
  coord_polar(theta = "y") +
  facet_grid(.~ variable, scales = "free") +
  theme_minimal(base_size = 16) +
  theme(axis.title = element_blank(), axis.text = element_blank(),
        panel.grid = element_blank(), legend.title = element_blank())

给出了以下情节:

请参阅 this answer 了解如何使用基数 R 或 plyrdplyr[=34= 计算 pos 变量] 包。


但是,pie-charts 大多不是可视化数据的最佳方式。同样在这种情况下,条形图将导致更清晰的可视化。有:

ggplot(mydat, aes(x=variable, y=perc, fill=value)) +
  geom_bar(stat="identity", aes(label = percent(perc)), width=0.6) +
  scale_y_continuous(labels = percent(c(0,0.25,0.50,0.75,1.00))) +
  coord_flip() +
  theme_minimal(base_size = 14) +
  theme(axis.title = element_blank(), legend.title = element_blank())

你得到: