超强脑洞第五弹——ggplot 构造连环饼图

今天这篇之前曾有涉略过,就是利用ggplot的辅助插件工具——scatterpie制作基于气泡图的饼图,之前曾在地图图层上演示过此种类似图表,不过这里我将其与折线图融合,案例来源于陈荣兴老师的名作——《Excel图表拒绝平庸》。

数据准备:

1
2
3
library("ggplot2")
library("scatterpie")
library("Cairo")

数据集构造:

1
2
3
4
5
6
7
8
mydata<-c(1,1,1,1,1,1,1,1,1,2,3,2,3,5,5,1,1,1,1,1,2,2,4,5,1,3,2,3,5,5,4,2,4,2,1,2,1,1,0.5,0.5)
Dummy<-5*seq(1:8)
mynewdata<-matrix(mydata,nrow=8,ncol=5,byrow=T)
colnames(mynewdata)<-c("S1","S2","S3","S4","S5")
mynewdata<-as.data.frame(mynewdata)
as.integer(mynewdata1$Year)
mynewdata1<-cbind(Year,Dummy,Data,mynewdata)
as.integer(mynewdata1$Dummy)

构造色盘:

1
2
color1<-c("#FF2D2D","#F79646","#4BACC6","#FFC000","#92D050")
color2<-c("#17375E","#23538D","#558ED5","#8EB4E3","#C6D9F1")

图形可视化:

色盘1图表输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CairoPNG(file="C:/Users/Administrator/Desktop/scatterpie1.png",width=500,height=330)
ggplot()+
geom_line(data=mynewdata1,aes(x=Dummy,y=Data,group=1),col="#085264",size=.8)+
geom_scatterpie(data=mynewdata1,aes(x=Dummy,y=Data,r=2),cols=colnames(mynewdata1)[4:8],color=NA)+
ylim(0,25)+
scale_fill_manual(values=color1)+
scale_x_continuous(breaks=mynewdata1$Dummy,labels=c(2004:2011))+
guides( fill=guide_legend(label.position ="top"))+
theme(
axis.title=element_blank(),
legend.title=element_blank(),
panel.background=element_blank(),
axis.line=element_line(),
axis.ticks=element_line(),
legend.direction="horizontal",
legend.position=c(0.15,0.9),
)
dev.off()

色盘2输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CairoPNG(file="C:/Users/Administrator/Desktop/scatterpie2.png",width=500,height=330)
ggplot()+
geom_line(data=mynewdata1,aes(x=Dummy,y=Data,group=1),col="#085264",size=.8)+
geom_scatterpie(data=mynewdata1,aes(x=Dummy,y=Data,r=2),cols=colnames(mynewdata1)[4:8],color=NA)+
ylim(0,25)+
scale_fill_manual(values=color2)+
scale_x_continuous(breaks=mynewdata1$Dummy,labels=c(2004:2011))+
guides( fill=guide_legend(label.position ="top"))+
theme(
axis.title=element_blank(),
legend.title=element_blank(),
panel.background=element_blank(),
axis.line=element_line(),
axis.ticks=element_line(),
legend.direction="horizontal",
legend.position=c(0.15,0.9),
)
dev.off()

本来原始图表在案例中使用VBA写的,大体思路是在折线图对应点位置强制插入8个饼图对象。(就是对应八个点位置的饼图)思路虽好,可是VBA的笨拙语法操作起来实在不易,代码量巨大。

源案例代码截图:

而使用R语言,不算主题修饰成分,核心代码只有短短6行,由此可见R在图形操控方面的便利。

核心要点总结:

本例适用场景:

  • 基于时间维度的个指标结构分解(年度GDP构成);
  • 基于地域维度的指标构成分解。(不同地区产品销量、销额等)。

核心要点:

  • 需掌握geom_scatterpie 图层函数要义(其实就是熟知scatterpie包的参数);
  • 保证横、纵轴刻度线量级一致,细心地童鞋可能已经发现,我并未直接将X轴映射给Year变量,而是费事儿的用0,5,10……40等间隔为5的数值来作为X轴,之后才将刻度标签替换成2004~2011的年份(具有实际意义的指标)。原因就是因为规避横纵坐标量级差异导致饼图变形。(算是scatterpie的bug吧,无法自动优化饼图半径)。

联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)
团队公众号:EasyCharts
qq交流群:[魔方学院]298236508

个人简介:
杜雨
财经专业研究僧;
伪数据可视化达人;
文科背景的编程小白;
喜欢研究商务图表与地理信息数据可视化,爱倒腾PowerBI、SAP DashBoard、Tableau、R ggplot2、Think-cell chart等诸如此类的数据可视化软件,创建并运营微信公众号“数据小魔方”。
Mail:578708965@qq.com


备注信息:
知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议

坚持原创技术分享,您的支持将鼓励我继续创作!