将两个饼图合二为一

Ang*_*elo 4 plot r pie-chart

我正在尝试使用R中的以下数据创建一个饼图:

    2009    2010
US  10  12
UK  13  14
Germany 18  11
China   9   8
Malaysia    7   15
Others  13  15
Run Code Online (Sandbox Code Playgroud)

我使用的命令是:

slices<-c(10,13,18,9,7,13,12,14,11,8,15,15)
 lbls <- c("US","UK","Germany","China", "Malaysia", "Others","US","UK","Germany","China", "Malaysia", "Others") 
 pct <- round(slices/sum(slices)*100)
 lbls <- paste(lbls,"%",sep="")
 lbls <- paste(lbls, pct)
 pie(slices,labels = lbls, col=rainbow(length(lbls)),  main="Pie Chart of Countries")
Run Code Online (Sandbox Code Playgroud)

我得到的数字 是

现在,我如何配置图表,以便国家/地区具有相同的配色方案?并且他们按照相同的顺序分两部分,首先它应该是美国和英国等等.

两个简化了我想在一个饼图中制作两个饼图的问题,其中一半的饼图代表2009年,另一半代表2010年.

善意的帮助.

谢谢

Ben*_*ker 12

 lbls0 <- c("US","UK","Germany","China", "Malaysia", "Others","US","UK","Germany","China", "Malaysia", "Others") 
 pct <- round(slices/sum(slices)*100)
 lbls <- paste(lbls,"%",sep="")
 lbls <- paste(lbls, pct)
 pie(slices,labels = lbls, col=rainbow(length(lbls)),
      main="Pie Chart of Countries")


 nlbl <- length(lbls)
 yrs <- rep(2009:2010,each=nlbl/2)
 xlbls <- sprintf("%s (%d) %d%%",lbls0,yrs,pct)
 pie(slices,labels = xlbls, col=rep(rainbow(nlbl/2),2),
      main="Pie Chart of Countries")
Run Code Online (Sandbox Code Playgroud)

您是否愿意考虑一种可视化的形式,以便更容易进行定量比较?

 library(ggplot2); theme_set(theme_bw())
 dd <- data.frame(lbls0,yrs,slices,pct)
 dd$lbls0 <- reorder(dd$lbls0,-dd$slices)
 ggplot(dd,aes(x=lbls0,y=slices,fill=lbls0))+
    geom_bar(aes(alpha=factor(yrs)),
                    stat="identity",position=position_dodge(width=1))+
    scale_alpha_discrete(range=c(0.7,1.0))+
    geom_text(aes(label=paste0(pct,"%"),
              group=interaction(lbls0,yrs)),hjust=-0.2,
              position=position_dodge(width=1))+
                  coord_flip()+
    expand_limits(y=20)+labs(x="",y="total")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你对国家之间的比较更感兴趣,而不是国家内的年份,你可以跳过这些scale_alpha东西并使用facet_wrap(~yrs)......

  • 我鼓励你阅读[伟大的饼图辩论](http://vizthinker.com/grudge-match-pie-chart-vs-bar-chart/)并形成你自己的结论...... (4认同)

Jaa*_*aap 8

您可以在reshape2包的帮助下解决这个问题:

# reading the data
df <- read.table(header=TRUE, text="Country   2009    2010
US  10  12
UK  13  14
Germany 18  11
China   9   8
Malaysia    7   15
Others  13  15")

# setting the column names correct
colnames(df) <- c("Country","2009","2010")

# reshaping the dataframe
require(reshape2)
df2 <- melt(df, id="Country")

# creating the plot
pie(df2$value, labels=paste0(df2$Country," (",df2$variable,") ",df2$value,"%"),
    col=rainbow(length(levels(df2$Country))), main="Pie Chart of Countries")
Run Code Online (Sandbox Code Playgroud)

这使: 在此输入图像描述


有关年份标签的变体,您还可以使用:

pie(df2$value, labels=paste0(df2$Country," ",df2$value,"%"),
    col=rainbow(length(levels(df2$Country))), main="Pie Chart of Countries")
mtext("2009",side=3)
mtext("2010",side=1)
Run Code Online (Sandbox Code Playgroud)

这使: 在此输入图像描述


正如@BenBolker所说,饼图不是一种很好的呈现数据的方式.值得引用的帮助页面?pie也是如此:

饼图是显示信息的一种非常糟糕的方式.眼睛擅长判断线性测量,判断相对区域不好.条形图或圆点图是显示此类数据的首选方式.

Cleveland(1985),第264页:"可以通过饼图显示的数据始终可以通过点图显示.这意味着可以做出沿着共同尺度的位置判断,而不是不太准确的角度判断."这个陈述是基于克利夫兰和麦吉尔的实证调查以及感性心理学家的调查.