鱼眼百分比信息图

该图表案例来源于某财经杂志,我是从刘万祥老师那里看来的,之后又在知乎上发现有人发帖求做法。我就抱着试一试的心态,用ggplot2尝试着做,没想到真的让我给弄出来了。

这里分享给大家我的做法和思路:

加载包:

1
2
3
library(tidyverse)
require(grid)
library("Rmisc")

生成辅助数据:

1
2
3
4
5
px1<-seq(from=0,to=10,length=1000)
py1<-sqrt(5^2-(px1-5)^2)
Project1x<-c(px1,rev(px1))
Project1y<-c(py1,-py1)

圆环数据构造过程:

这里全部都是同一个套路的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Project1<-data.frame(lon=Project1x,lat=Project1y)
Project1$group<-"ProjectA"
Project1$order<-1:nrow(Project1)
Project2<-data.frame(lon=Project1x+15,lat=Project1y)
Project2$group<-"ProjectB"
Project2$order<-1:nrow(Project2)
Project3<-data.frame(lon=Project1x+30,lat=Project1y)
Project3$group<-"ProjectC"
Project3$order<-1:nrow(Project3)
Project4<-data.frame(lon=Project1x+45,lat=Project1y)
Project4$group<-"ProjectD"
Project4$order<-1:nrow(Project4)
Project5<-data.frame(lon=Project1x+60,lat=Project1y)
Project5$group<-"ProjectE"
Project5$order<-1:nrow(Project5)
Project<-rbind(Project1,Project2,Project3,Project4,Project5)
1
ggplot(Project)+geom_path(aes(lon,lat,group=group))

five

多边形数据构造过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Proj1<-Project1[,1:2]%>%filter(lat<=-4)
Proj1[nrow(Proj1)+1,]<-c(8,-4)
Proj1$group<-"ProjA"
Proj1$order<-1:nrow(Proj1)
Proj2<-Project2[,1:2]%>%filter(lat<=-3)
Proj2[nrow(Proj2)+1,]<-c(24,-3)
Proj2$group<-"ProjB"
Proj2$order<-1:nrow(Proj2)
Proj3<-Project3[,1:2]%>%filter(lat<=0)
Proj3[nrow(Proj3)+1,]<-c(40,0)
Proj3$group<-"ProjC"
Proj3$order<-1:nrow(Proj3)
Proj4<-Project4[,1:2]%>%filter(lat<=3)
Proj4$group<-"ProjD"
Proj4$order<-1:nrow(Proj4)
Proj5<-Project5[,1:2]%>%filter(lat<=4)
Proj5$group<-"ProjE"
Proj5$order<-1:nrow(Proj5)
Projdata<-rbind(Proj1,Proj2,Proj3,Proj4,Proj5)

six

可视化图形:

1
2
windowsFonts(myFont=windowsFont("msyh.ttc"))
labeldata<-data.frame(x=seq(from=5,to=65,length=5),y=c(-4,-3,0,3,4),label=sprintf("%2d%%",c(10,20,50,80,90)))
1
2
3
4
5
6
7
8
9
10
11
12
13
p1<-ggplot()+
geom_polygon(data=Projdata,aes(x=lon,y=lat,group=group),fill="#92D24F",col=NA)+
geom_path(data=Project,aes(x=lon,y=lat,group=group),col="black",size=1.2)+
geom_text(data=labeldata,aes(x=x,y=y+1,label=label),hjust=.5)+
scale_x_continuous(breaks=labeldata$x,labels=paste0("Project",LETTERS[1:5]))+
ylim(-5.5,6)+
theme_minimal()+
theme(
panel.grid=element_blank(),
axis.title=element_blank(),
axis.text.y=element_blank(),
plot.margin = unit(c(.2,.2,1,.2), "cm")
)

one
1
2
3
4
5
6
7
8
9
10
11
12
13
p2<-ggplot()+
geom_polygon(data=Projdata,aes(x=lon,y=lat,group=group),fill="#FFC000",col=NA)+
geom_path(data=Project,aes(x=lon,y=lat,group=group),col="black",size=1.2)+
geom_text(data=labeldata,aes(x=x,y=y+1,label=label),hjust=.5)+
scale_x_continuous(breaks=labeldata$x,labels=paste0("Project",LETTERS[1:5]))+
ylim(-5.5,6)+
theme_minimal()+
theme(
panel.grid=element_blank(),
axis.title=element_blank(),
axis.text.y=element_blank(),
plot.margin = unit(c(.2,.2,1,.2), "cm")
)

two
1
2
3
4
5
grid.newpage()
pushViewport(viewport(layout=grid.layout(2,2)))
vplayout <- function(x,y){viewport(layout.pos.row = x, layout.pos.col = y)}
print(p1,vp=vplayout(1,1:2))
print(p2,vp=vplayout(2,1:2))

three
1
2
3
4
library(gridExtra)
library("plyr")
library("lattice")
multiplot(p1,p2,layout=matrix(c(1,1,2,2),nrow=2,byrow=TRUE))

four

联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)

qq交流群:[魔方学院]298236508

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


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

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