终于等到你——ggplot2树状图

2017年8月份的R语言更新包中,默默地加入了支持ggplot2树状图的新几何对象,从此在R语言中制作树状图,不用再求助于第三方包的辅助了。

该包既有Cran上的正式发行版,也有托管在GitHub上的开发版,安装方式如下:

CRAN:

install.package("treemapify")

Github:

devtools::install_github("wilkox/treemapify")

GitHub主页:

https://github.com/wilkox/treemapify

载入本文章所需的扩展包:

library("ggplot2") library("treemapify") library("tweenr") library("gganimate") library("RColorBrewer")

安装该包之后,你的ggplot2中会多出一个树状图几何对象——geom_treemap()。

实际上我曾经分享过一个树状图案例,但是是使用第三方辅助包制作,一直在等ggplot2出树状图图层。

R语言数据可视化之——TreeMap

本次案例使用该(treemapify)包内的内置数据集:

预览一下数据集结构:

str(G20)

head(G20)

该数据集描述20峰会参会国家的经济指标,里面包含了五个字段,分别是全球的大区(region)、国家名称(country)、GDP指标(gdp_mil_usd)(应该是二次计算的某种指标),人类发展指数(hdi),已经经济发展程度(econ_classification)。

字段名称 类型 region 因子型 country 因子型 gdp_mil_usd 数值型(整数) hdi 数值型(浮点) econ_classification 因子型

树状图是没有显式坐标系统的一类特殊图形,依靠正方化算法,将样本总体正方形按照实际观测值占总体比例分割成单个矩形方块。因而其至少需要一个数值型变量作为输入参数。

一个简单的树状图:

ggplot(G20, aes(area = gdp_mil_usd)) + geom_treemap()

因为area仅仅是定义了一个数值型变量的方块大小,填充颜色是可以单独定义的。但是颜色往往也可以单独作为一个数值型度量的表达方式。

ggplot(G20, aes(area = gdp_mil_usd)) + geom_treemap(fill="steelblue")

ggplot(G20, aes(area = gdp_mil_usd, fill = hdi)) + geom_treemap()+ scale_fill_distiller(palette="Greens")

添加标签:

包作者针对ggplot树状图写了优化好的文本 标签函数geom_treemap_text(刚开始就说过树状图超越了传统三大坐标系的范畴,没有显式声明的坐标系统,算法比较特殊因而无法使用常规的geom_text()进行添加标签)。

ggplot(G20, aes(area = gdp_mil_usd, fill = hdi, label = country)) + geom_treemap() + geom_treemap_text(fontface = "italic", colour = "red", place = "centre",grow = TRUE,alpha=.6)+ scale_fill_distiller(palette="Greens")

其中place参数控制每一个方块中标签相对于四周的位置,grow则控制标签是否与方块大小自适应(呈大致比例放大缩小)

次级分组(亚群):

该包支持次级分组(专业术语叫做亚群),这在实际应用场景中非常广泛,比如我们在观察国家指标大小的同时,还想获取国家所属大区的总体指标,通过加入次级分组,我们可以获取两个维度信息。通过在美学映射中设置subgroup参数(一个类别型变量),函数内部可以自动完成亚群的变量聚合计算,并在图形成用框线显示出次级类别大小的规模。

ggplot(G20, aes(area = gdp_mil_usd, fill = hdi, label = country,subgroup = region)) + geom_treemap() + geom_treemap_subgroup_border() + geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5, colour ="black", fontface = "italic", min.size = 0) + geom_treemap_text(colour = "red", place = "topleft", reflow = T,alpha=.5)+ scale_fill_distiller(palette="Greens")

其中reflow参数用于控制标签是否自适应矩形块大小,若按照原始大小超过矩形块,则会自动换行显示。

分面系统:

当你觉得使用次级分组不能获得一个很好地视觉呈现效果,geom_treemap还支持ggplot函数中的fact_grid分面参数,这就是所有ggplot2扩展函数的好处,可以继承源自于ggplot2的高级图形属性。

ggplot(G20, aes(area = gdp_mil_usd, fill = region, label = country)) + geom_treemap() + geom_treemap_text(grow = T, reflow = T, colour = "black") + facet_wrap( ~ econ_classification) + scale_fill_brewer(palette="Blues")+ labs( title = "The G-20 major economies", caption = "The area of each country is proportional to its relative GDP within the economic group (advanced or developing)", fill = "Region" )+ theme(legend.position = "bottom", plot.caption=element_text(hjust=0))

GIF动画流:

借助tweened包提供的差值方法,你可以实现将不同时间点的截面数据进行追加,并且编组成gganimate函数可识别的动画帧组,通过tweenlength、statelength和nframes 参数来控制变化的长度、每一帧停留的时间以及切换的帧数。

G20_alt <- G20 G20_alt$gdp_mil_usd <- sample(G20$gdp_mil_usd, nrow(G20)) G20_alt$hdi <- sample(G20$hdi, nrow(G20)) tweened <- tween_states(list(G20,G20_alt,G20), tweenlength = 8, statelength = 5, ease = 'cubic-in-out', nframes = 30)

animated_plot <- ggplot(tweened, aes(area = gdp_mil_usd, fill = hdi,label = country, subgroup = region,frame = .frame)) + geom_treemap(fixed = T) + geom_treemap_subgroup_border(fixed = T) + geom_treemap_subgroup_text(place = "centre", grow = T, alpha = 0.5,colour = "black", fontface = "italic", min.size = 0,fixed = T) + geom_treemap_text(colour = "white", place = "topleft", reflow = T, fixed = T)+ scale_fill_distiller(palette="Greens")

ani.options(interval = 1/10) gganimate(animated_plot, "E:/animated_treemap.gif", title_frame = F,ani.width = 1000, ani.height = 800)

treemapify包给ggplot2提供的geom_treemap(),填补了ggplot2原生几何对象在树状图领域的空白,可谓是进一步扩展、丰富ggplot2生态系统。

参考文献:

https://github.com/thomasp85/tweenr

https://github.com/wilkox/treemapify

往期案例数据请移步本人GitHub:

https://github.com/ljtyduyu/DataWarehouse/tree/master/File

本文分享自微信公众号 - 数据小魔方(datamofang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-01

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

视锥剔除优化

26440
来自专栏HT

基于HTML5和WebGL的3D网络拓扑结构图

现在,3D模型已经用于各种不同的领域。在医疗行业使用它们制作器官的精确模型;电影行业将它们用于活动的人物、物体以及现实电影;视频游戏产业将它们作为计算机与视频游...

59550
来自专栏深度学习自然语言处理

【python】Tkinter可视化窗口(三)

我们的最终效果就是移动scale里面的bar,使得上面的黄色label显示该值并保留两位小数。

15930
来自专栏企鹅号快讯

输验证码输到崩溃?教你15分钟黑掉全球最流行的验证码插件

大数据文摘作品 编译:Katrine Ren、朝夕、钱天培 验证码这种东西真的是反人类。虽然它在保证账号安全、反作弊以及反广告有着至关重要的作用,但对于普通用户...

29780
来自专栏Golang语言社区

Go项目开发----2048小游戏(上)

刚接触go语言不久,前段时间看到一个2048的项目开发教程,于是就试着练了下手。我的环境采用的是Ubuntu Linux环境。 源码下载: https://gi...

37440
来自专栏落影的专栏

OpenGL光照学习以及OpenGL4环境

前言 最近稍有空闲,整理下之前学习光照的笔记,以及在配置OpenGL4环境过程中遇到的问题。 光照 1、模拟灯光 模拟灯光:通过GPU来计算场景中的几何图...

44870
来自专栏CSDN技术头条

数据可视化的10个关键术语

Format 交互方式 Interactive visualisations allow you to modify, manipulate and explo...

22570
来自专栏数据小魔方

sparklines迷你图系列4——Evolution(Area)

今天接着分享Evolution图表类型中的Area图表。 其实就是我们常见的区域图(或者叫面积图),它与折线图(昨天讲到的)都是用来呈现时间序列中的趋势走向和波...

29840
来自专栏向治洪

自定义Interpolator

nterpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果。那么什么叫做非...

23070
来自专栏简书专栏

Matplotlib入门

标题中的英文首字母大写比较规范,但在python实际使用中均为小写。 2018年7月30日笔记 作者的集成开发环境是jupyter,Python版本为3.6...

29630

扫码关注云+社区

领取腾讯云代金券