R 可视化 | 华夫饼图
作者:庄闪闪
前言
华夫饼图(waffle chart)分为块状华夫饼图和点状华夫饼图。华夫饼图是展示总数据的组类别情况的一种有效图表。它是西方的一种 由小方格组成的面包,所以这种图表因此得名为华夫饼图。
本文框架
数据介绍
#相关包
library(ggplot2)
library(RColorBrewer)
library(reshape2)
nrows <- 10
categ_table <- round(table(mpg$class ) * ((nrows*nrows)/(length(mpg$class))))
sort_table<-sort(categ_table,index.return=TRUE,decreasing = FALSE)
Order<-sort(as.data.frame(categ_table)$Freq,index.return=TRUE,decreasing = FALSE)
df <- expand.grid(y = 1:nrows, x = 1:nrows)
df$category<-factor(rep(names(sort_table),sort_table), levels=names(sort_table))
Color<-brewer.pal(length(sort_table), "Set2")
head(df)
前 6 行数据如下所示,y 从 1~10,x 也是从 1~10。
ggplot 包绘制
块状华夫饼图
块状华夫饼图的小方格用不同颜色表示不同类别,适合用来快速检视数 据集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让 人更容易找出当中模式。
接下来通过以上数据进行实现。代码看着很长,但是有一半都是主题的设置theme()
.
ggplot(df, aes(x = y, y = x, fill = category)) +
geom_tile(color = "white", size = 0.25) +
#geom_point(color = "black",shape=1,size=5) +
coord_fixed(ratio = 1)+ #x,y 轴尺寸固定, ratio=1 表示 x , y 轴长度相同
scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
scale_fill_manual(name = "Category",
#labels = names(sort_table),
values = Color)+
theme(#panel.border = element_rect(fill=NA,size = 2),
panel.background = element_blank(),
plot.title = element_text(size = rel(1.2)),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
legend.title = element_blank(),
legend.position = "right")
点状华夫饼图
点状华夫饼图(dot matrix chart)以点为单位显示离散数据,每种颜色 的点表示一个特定类别,并以矩阵形式组合在一起,适合用来快速检视数据 集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让人 更容易找出当中模式。当只有一个变量/类别时(所有点都是相同颜色),点 状华夫饼图相当于比例面积图
library(ggforce)
ggplot(df, aes(x0 = y, y0 = x, fill = category,r=0.5)) +
geom_circle(color = "black", size = 0.25) +
#geom_point(color = "black",shape=21,size=6) +
coord_fixed(ratio = 1)+
scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
scale_fill_manual(name = "Category",
#labels = names(sort_table),
values = Color)+
theme(#panel.border = element_rect(fill=NA,size = 2),
panel.background = element_blank(),
plot.title = element_text(size = rel(1.2)),
legend.position = "right")
图解释:这个图从横坐标(y)看,在 y 为 10 时,有 2 个 pichup,一个 subcompact 等。从纵坐标(x)看,在 x 为 10 时,全是 suv 类型。从总体来看,suv 占最多数(16 个),2seater 占最少数(2 个)。
堆积型华夫饼图
这里还有一种比较有趣的华夫饼图。
library(dplyr)
nrows <- 10
ndeep <- 10
unit<-100
df <- expand.grid(y = 1:nrows, x = 1:nrows)
categ_table <- as.data.frame(table(mpg$class) * (nrows*nrows))
colnames(categ_table)<-c("names","vals")
categ_table<-arrange(categ_table,desc(vals))
categ_table$vals<-categ_table$vals /unit
tb4waffles <- expand.grid(y = 1:ndeep,x = seq_len(ceiling(sum(categ_table$vals) / ndeep)))
regionvec <- as.character(rep(categ_table$names, categ_table$vals))
tb4waffles<-tb4waffles[1:length(regionvec),]
tb4waffles$names <- factor(regionvec,levels=categ_table$names)
Color<-brewer.pal(nrow(categ_table), "Set2")
ggplot(tb4waffles, aes(x = x, y = y, fill = names)) +
#geom_tile(color = "white") + #
geom_point(color = "black",shape=21,size=5) + #
scale_fill_manual(name = "Category",
values = Color)+
xlab("1 square = 100")+
ylab("")+
coord_fixed(ratio = 1)+
theme(#panel.border = element_rect(fill=NA,size = 2),
panel.background = element_blank(),
plot.title = element_text(size = rel(1.2)),
#axis.text = element_blank(),
#axis.title = element_blank(),
#axis.ticks = element_blank(),
# legend.title = element_blank(),
legend.position = "right")
waffle 包绘制
当然如果前面代码看的非常吃力的话, 这里有一个好用的包,专为华夫饼图做准备的。
waffle(parts, rows = 10, keep = TRUE, xlab = NULL, title = NULL, colors = NA, size = 2, flip = FALSE, reverse = FALSE, equal = TRUE, pad = 0, use_glyph = FALSE, glyph_size = 12, legend_pos = "right")
主要参数含义:
- parts 用于图表的值的命名向量
- rows 块的行数
- keep 保持因子水平(例如,在华夫饼图中获得一致的图例)
简单例子
该华夫饼图,行为 8,one 占 80 个,two 占 30 个,tree 占 20 个,four 占 10 个。
parts <- c(One=80, Two=30, Three=20, Four=10)
chart <- waffle(parts, rows=8)
print(chart)
本片主要参考《R 数据可视化之美》第 7 章局部整体型图表,配套代码可见张杰的github[1]以及waffle 包介绍[2]
参考资料
[1]
github: https://github.com/Easy-Shu/Beautiful-Visualization-with-R
[2]
waffle包介绍: https://www.rdocumentation.org/packages/waffle/versions/0.7.0/topics/waffle
往期推荐
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【CTR】ESMM:多任务联合学习
- 状态管理之Vuex (三) store利用module拆分
- MySQL 案例:无主键表产生的延迟
- 面试官真的会问:new的实现以及无new实例化
- Android Hilt实战初体验: Dagger替换成Hilt
- Linux系列之学会使用CURL命令
- 潘石屹用python解决100个问题 | 斐波那契数列
- [869]pandas的dataFrame的行列索引操作
- JSP的文件上传处理
- 将SAP CRM WebClient UI的表格导出成PDF
- java.lang.ClassNotFoundException org.w3c.dom.ElementTraversal
- docker一键部署SpringBoot项目
- 【Flutter 专题】95 图解 Dart 单线程实现异步处理之 Task Queue
- 首发基于OpenPAI细化部署 Hadoop 集群
- PhpStorm 集成 WSL 虚拟机中的 PHP 进行单元测试和代码调试