用R语言制作商务图表,让你的图表美出新高度~

本文案例图表是之前本公众号推送过的一个方块面积比较图,之前看到过刘万祥老师在其公众号及博客中也提供了很好的制作思路。

当时就想如果是使用R来写该图表,不止是否可行呢,只是当时一时半会儿没有思路,直到最近,随着对ggplot 系统的理解进一步加深,这才找到了比较合适的思路。

今天跟大家分享使用R语言的ggplot函数来模仿该图表:

以下是原图:

为了 将本文 制作的成品图与该案例原图进行比较,我使用了相同的数据源:

1
2
3
4
library(ggplot2)
library(ggmap)
#加载ggmap是为了使用其theme_nothing()函数清空其原有主题元素

制作数据源:

1
mydata<-data.frame(X=c(3,7,11,15,19),A=c(2471,1893,1248,1078,556),B=c(1385,951,869,784,366),C=c(56,7,19,13,40))

以下过程构造三个序列的矩形范围数据(X轴起点终点、Y轴起点终点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mydata$Axmin<-mydata$X-sqrt(mydata$A)/30
mydata$Axmax<-mydata$X+sqrt(mydata$A)/30
mydata$Aymin<-0
mydata$Aymax<-sqrt(mydata$A)/15
mydata$Bxmin<-mydata$X+sqrt(mydata$A)/30-sqrt(mydata$B)/15
mydata$Bxmax<-mydata$X+sqrt(mydata$A)/30
mydata$Bymin<-0
mydata$Bymax<-sqrt(mydata$B)/15
mydata$Cxmin<-mydata$X+sqrt(mydata$A)/30-sqrt(mydata$C)/10
mydata$Cxmax<-mydata$X+sqrt(mydata$A)/30
mydata$Cymin<-0
mydata$Cymax<-sqrt(mydata$C)/10

仔细体会我在设置以上起始点时所用到的思路

  • 其中第一个序列在最底层,可以使其中心对齐
  • 第二、三个序列则需要对齐第一个序列的右侧
  • 原数据开方后仍然很大需要酌情进行压缩标度(这里除以15)

数值标签和文本标签

1
2
mydata$text<-c("University of\n Pennsylvania","University of\n Notre Dame","Princeton\n University","Stanford\n University","California Institute\n of Technology")
mydata$full<-c("31663","16548","27189","34348","5225")

数据整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mydata1<-mydata[,5:8]
names(mydata1)<-c("xmin","xmax","ymin","ymax")
mydata1$Group<-"A"
mydata2<-mydata[,9:12]
names(mydata2)<-c("xmin","xmax","ymin","ymax")
mydata2$Group<-"B"
mydata3<-mydata[,13:16]
names(mydata3)<-c("xmin","xmax","ymin","ymax")
mydata3$Group<-"C"
mynewdata<-rbind(mydata1,mydata2,mydata3)
mynewdata$Group<-factor(mynewdata$Group,order=T)

设置字体为arial字体

1
windowsFonts(myFont = windowsFont("arial"))

运行以下图表函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ggplot(mynewdata)+
geom_rect(aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=Group))+
scale_fill_manual(values=c("#59AF8A","#0074A3","#C72733"))+
geom_linerange(aes(x=X+2,ymin=0,ymax=4.8),col="grey",linetype=2)+
ylim(-.5,6)+
labs(x="",y="")+
geom_text(aes(x=X,y=4.5,label=text),size=4,fontface="bold",family="myFont")+
geom_label(aes(x=X,y=3.7,label=full),fill="#EFE5CA",colour="black",fontface="bold",size=3.5,label.r=unit(0.15,"lines"),family="myFont")+
geom_text(aes(x=Axmin,y=Aymax,label=A),hjust=-.2,vjust=1,size=3.5,col="white",family="myFont")+
geom_text(aes(x=Bxmin,y=Bymax,label=B),hjust=-.2,vjust=1,size=3.5,col="white",family="myFont")+
geom_text(aes(x=Cxmin,y=Cymax,label=C),hjust=-.2,vjust=1,size=3,col="white",family="myFont")+
annotate("text",x=2.5,y=5.7,label="Class Struggle",col="black", size=6,family="myFont")+
annotate("text",x=8.85,y=5.2,label="A spot on a university or college's waitlist rarely translates into admission. A look at the numbers for several institutions", size=4,family="myFont")+
annotate("text",x=3.9,y=-.32,label="Source:The universities and 2011-2012 Common Data Set",col="black",size=3,family="myFont")+
annotate("text",x=19.8,y=-.32,label="The wall Street Jaunual",col="black",size=3,family="myFont")+
theme_nothing()+
theme(panel.background=element_rect(fill="#F5F2E1"))

建议保存尺寸(1035*330)

建议使用Cairo包进行保存操作:

使用方法如下:

1
2
3
4
5
6
font.add("myfont", "arial.ttf")
CairoPNG(file="C:/Users/Administrator/Desktop/image.png",width=1035,height=330)
showtext.begin()
……
showtext.end()
dev.off()

联系方式:
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 国际许可协议

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