让执着成为一种习惯——仿网易数独玫瑰气泡图

没有难学的技艺,只有不够辛勤的付出!

今天这篇文章推送仿的的是网易数独的一幅信息图,内容呈现的是全球各国人民对于养老所持的态度,数据来源于Pew Reserch Centre。

图表整体难度中等,使用ggplot2来写代码,主要考察关于极坐标转换与应用。(ggplot2系统中,两个较为高阶的用法分别为:极坐标系、地理空间的多边形填充)。

#加载包:

library("ggplot2") library("tidyr") library("ggthemes") library("dplyr") library("Cairo") library("showtext")

#载入字体:

font.add("myfontl","msyhl.ttc") font.add("myfont","msyh.ttc") font.add("myfzhzh","方正正粗黑简体.TTF")

#锁定文件临时目录:

setwd("D:/R/File")

#导入数据

circle_bubble<-read.csv("circle_bubble.csv",stringsAsFactors = FALSE,check.names = FALSE)

仔细观察该图,你会发现,玫瑰图内侧并非底边对齐,而是靠上下中心对齐,要想做到这种效果,必须将一个 细分维度转化为负值(柱形图堆积时会自动将负值堆积在负坐标轴上)。

circle_bubble$Government<--circle_bubble$Government level<-circle_bubble[,"State"] circle_bubble$State<-factor(circle_bubble$State,levels=level,ordered=TRUE)

筛选出制作堆积条形图的数据源:

circle_data<-circle_bubble %>% select(State,Government,Family,Youself) %>% gather(Class,Value,-State) circle_data$Class<-factor(circle_data$Class,levels=c("Government","Youself","Family"),ordered=TRUE)

#构造三个序列的气泡图数据:

circle_point<-circle_bubble[,c("State","General","Very","Raito")] circle_point_data<-gather(circle_point,Class,Value,-State) circle_point_data$Class<-factor(circle_point_data$Class,levels=c("General","Very","Raito"),order=TRUE)

#构造气泡图模拟Y轴:

circle_point_data <- within(circle_point_data,{ mood_y <- NA mood_y[Class=="General"]<--150 mood_y[Class=="Very"]<--100 mood_y[Class=="Raito"]<-140})

#构造模拟气泡大小

circle_point_data$Value_y<-ifelse(circle_point_data$Class=="Raito",circle_point_data$Value,0.3*circle_point_data$Value)

(这里没有使用气泡图对应真实值作为气泡大小,而是将除Raito系列之外的两个序列真实值缩小了70%,这么做的目的是为了整体的气泡大小比例显示更为匀称和谐,因为Ratio序列是单值序列,其与自身的100%单位标度比较,剩余两个序列相互比较)。

#构造模拟标签位置

circle_data <- within(circle_data,{ label_y <- NA label_y[Class=="Government"]<-circle_bubble$Government/2 label_y[Class=="Family"]<-circle_bubble$Family/2 label_y[Class=="Youself"]<-circle_bubble$Family+circle_bubble$Youself-circle_bubble$Youself/2})

#极坐标化前的柱形图:

ggplot()+ geom_linerange(data=circle_bubble,aes(x=State,ymin=-150,ymax=140),size=.25,color="#D8E5F2",alpha=0.8)+ geom_col(data=circle_data,aes(x=State,y=Value,fill=Class),width=1,colour="white",size=.25)

###极坐标化前的柱形图和气泡图

ggplot()+ geom_linerange(data=circle_bubble,aes(x=State,ymin=-150,ymax=140),size=.25,color="#D8E5F2",alpha=0.8)+ geom_col(data=circle_data,aes(x=State,y=Value,fill=Class),width=1,colour="white",size=.25)+ geom_point(data=circle_bubble,aes(State,y=140),size=40,colour="#FEFCD3",alpha=.8)+ geom_point(data=circle_point_data,aes(State,y=mood_y,size=Value_y,colour=Class))+ geom_text(data=circle_data,aes(x=State,y=label_y,group=Class,label=abs(Value)),family="myfont",colour="white",size=5)+ geom_text(data=filter(circle_point_data,mood_y==-150),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#AA1A66",size=4)+ geom_text(data=filter(circle_point_data,mood_y==-100),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#A31067",size=4)+ geom_text(data=filter(circle_point_data,mood_y==140),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#F29E4A",size=5)

#极坐标化后的柱形图和气泡图(完整标签版)

ggplot()+ geom_linerange(data=circle_bubble,aes(x=State,ymin=-150,ymax=140),size=.25,color="#D8E5F2",alpha=0.8)+ geom_col(data=circle_data,aes(x=State,y=Value,fill=Class),width=1,colour="white",size=.25)+ geom_point(data=circle_bubble,aes(State,y=140),size=40,colour="#FEFCD3",alpha=.8)+ geom_point(data=circle_point_data,aes(State,y=mood_y,size=Value_y,colour=Class))+ geom_text(data=circle_data,aes(x=State,y=label_y,group=Class,label=abs(Value)),family="myfont",colour="white",size=5)+ geom_text(data=filter(circle_point_data,mood_y==-150),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#AA1A66",size=4)+ geom_text(data=filter(circle_point_data,mood_y==-100),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#A31067",size=4)+ geom_text(data=filter(circle_point_data,mood_y==140),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#F29E4A",size=5)+ scale_fill_manual(values=c("#FA844F","#BDCCD4","#00C4B5"))+ scale_colour_manual(values=c("#FAC0A1","#F35C57","#FBEB1B"))+ labs(title="各国人民\n对于养老的态度")+ scale_size_area(max_size=34.8)+ coord_polar()

#最终成品图:

CairoPNG(file="circle_bubble.png",width=1000,height=1000) showtext.begin() ggplot()+ geom_linerange(data=circle_bubble,aes(x=State,ymin=-150,ymax=140),size=.25,color="#D8E5F2",alpha=0.8)+ geom_col(data=circle_data,aes(x=State,y=Value,fill=Class),width=1,colour="white",size=.25)+ geom_point(data=circle_bubble,aes(State,y=140),size=40,colour="#FEFCD3",alpha=.8)+ geom_point(data=circle_point_data,aes(State,y=mood_y,size=Value_y,colour=Class))+ geom_text(data=circle_data,aes(x=State,y=label_y,group=Class,label=abs(Value)),family="myfont",colour="white",size=5)+ geom_text(data=filter(circle_point_data,mood_y==-150),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#AA1A66",size=4)+ geom_text(data=filter(circle_point_data,mood_y==-100),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#A31067",size=4)+ geom_text(data=filter(circle_point_data,mood_y==140),aes(x=State,y=mood_y,label=Value),family="myfontl",colour="#F29E4A",size=5)+ scale_fill_manual(values=c("#FA844F","#BDCCD4","#00C4B5"))+ scale_colour_manual(values=c("#FAC0A1","#F35C57","#FBEB1B"))+ labs(title="各国人民\n对于养老的态度")+ scale_size_area(max_size=34.8)+ coord_polar()+ ylim(-250,150)+ guides(colour=FALSE,size=FALSE,fill=FALSE)+ theme_map() %+replace%theme(plot.title=element_text(family="myfzhzh",size=50,hjust=0,lineheight=1.2)) showtext.end() dev.off()

PS修饰后的最终效果(以上进过PS修饰细节)。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-07-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端说吧

JS-用js的for循环实现九九乘法表以及其他算数题等

4076
来自专栏SeanCheney的专栏

《Pandas Cookbook》第05章 布尔索引1. 计算布尔值统计信息2. 构建多个布尔条件3. 用布尔索引过滤4. 用标签索引代替布尔索引5. 用唯一和有序索引选取6. 观察股价7. 翻译SQ

第01章 Pandas基础 第02章 DataFrame运算 第03章 数据分析入门 第04章 选取数据子集 第05章 布尔索引 第06章 索引对齐 ...

1462
来自专栏海天一树

小朋友学C语言(4):单精度浮点数与双精度浮点数

上节课 简单介绍了浮点数。计算机程序中的浮点数分为单精度浮点数和双精度浮点数。 单精度和双精度精确的范围不一样。 计算机里的最基本的存储单位用位(bit)来表...

37812
来自专栏Python小屋

哈夫曼编码原理与Python实现代码(附手动推导过程原稿真迹)

哈夫曼编码依据字符出现概率来构造异字头(任何一个字符的编码都不是其他字符的前缀)的平均长度最短的码字,通过构造二叉树来实现,出现频次越多的字符编码越短,出现频次...

5758
来自专栏二进制文集

LeetCode 004 Median of Two Sorted Arrays 详细分析

题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/

861
来自专栏决胜机器学习

《编程之美》读书笔记(一)——中国象棋将帅有效位置

《编程之美》读书笔记(一) ——中国象棋将帅有效位置 (原创内容,转载请注明来源,谢谢) 一、问题 ? 如上述棋盘,假设将为点A,帅为点B。将只能在d10...

4016
来自专栏窗户

有限域(3)——多项式环的商环构造有限域

  接着上两章内容,我们还是得继续寻找有限域的构造方法。上章证明矩阵环是个单环,自然是没戏了,但我们还可以考虑多项式环。

2702
来自专栏Java帮帮-微信公众号-技术文章全总结

Java案例-数组随机数

五四青年节,是为纪念1919年5月4日爆发的五四运动而设立的。它来源于中国一九一九年反帝爱国的。1939年,陕甘宁边区西北青年救国联合会规定5月4日为中国青年节...

3638
来自专栏java初学

top K 问题

44416
来自专栏Jacklin攻城狮

简谈常用算法

862

扫码关注云+社区