其他
R可视化——圆堆砌图(Circle Packing)的绘制
这几天在浏览一些绘图网站过程中,小编发现了一种比较有意思的图形——圆堆砌图(Circle Packing),示例如下(图片来源于Chiplot绘图网站)。这种图形展示数据的功能类似于气泡图,即颜色代表分组,圆圈大小代表具体数值大小,不过这种图片还是比较新颖的,那怎么绘制这种图片呢?下面就和小编一起看看吧!
设置工作环境并加载R包
1、设置工作环境
rm(list=ls())#clear Global Environment
setwd('D:/桌面/Circle Packing')#设置工作路径
2、加载R包——这里用到的包主要有两种,一个是ggplot2,另一个是packcircles:
#加载R包
library(packcircles) # Circle Packing
library(ggplot2) # Create Elegant Data Visualisations Using the Grammar of Graphics
加载数据
#加载数据
df <- read.table(file="data.txt",sep="\t",header=T,check.names=FALSE)
绘图
1、数据处理
直接用上面加载的数据是无法绘制图形的,所以需要进行处理,首先根据加载的数据生成图片中各圆的圆心和半径:
df1 <- circleProgressiveLayout(df$size, sizetype='area')
#合并数据集
data = cbind(df, df1)
df1$group <- df$group
然后验证一下生成的圆的面积和数值大小是否成正比:
plot(data$radius^2, data$size)
接着我们使用circleLayoutVertices函数生成用于绘制圆的直线,需要说明的是在idcol参数中需要输入分组所在列的列号,如果不进行设置,后续绘图时颜色填充是无法按照分组填充的、
# 生成50条直线用于绘制圆
data1 <- circleLayoutVertices(df1, #数据
npoints=50,#为每个圆生成的顶点数。
idcol=4,#圆标识符的可选索引或列名。
sizetype = "radius")#The type of size values: either "radius" (default) or "area". May be abbreviated.
由于设置的id列组名存在重复,绘图时会出现排列错乱现象,无法让每条直线回到其应在的位置上,所以需要添加一列数据用于直线排列位置标识:
data1$G <- rep(1:150,each=51)
2、绘图
这里我们先用绘制散点图的函数生成各圆大小对应的数值,再利用geom_polygon函数绘制图形的主体,并利用scale_fill_manual函数对其填充色进行修改。
ggplot() +
geom_point(data=data,aes(x,y,size=size),color = "black")+
scale_size(range = c(1,10))+
geom_polygon(data = data1,
aes(x, y, group = G,
fill=as.factor(id)),
color = "white") +#通过绘制大量的直线来填充这个圆
scale_fill_manual(values = c("#d20962","#f47721","#7ac143","#00a78e","#00bce4","#7d3f98")) +
theme_void() +
theme(legend.position="right") +
labs(fill="Group")+#图例标题
coord_equal()#保证x,y尺度大小相同
完整代码
rm(list=ls())#clear Global Environment
setwd('D:/桌面/Circle Packing')#设置工作路径
#加载R包
library(packcircles) # Circle Packing
library(ggplot2) # Create Elegant Data Visualisations Using the Grammar of Graphics
#加载数据
df <- read.table(file="data.txt",sep="\t",header=T,check.names=FALSE)
#根据数据集生成圆心和半径
df1 <- circleProgressiveLayout(df$size, sizetype='area')
#合并数据集
data = cbind(df, df1)
df1$group <- df$group
#验证圆的面积和数值大小是否成正比
plot(data$radius^2, data$size)
# 生成50条直线用于绘制圆
data1 <- circleLayoutVertices(df1, #数据
npoints=50,#为每个圆生成的顶点数。
idcol=4,#圆标识符的可选索引或列名。
sizetype = "radius")#The type of size values: either "radius" (default) or "area". May be abbreviated.
data1$G <- rep(1:150,each=51)#由于设置的id列存在重复,绘图时会出现排列错乱现象,所以需要添加一列数据用于直线排列位置标识
ggplot() +
geom_point(data=data,aes(x,y,size=size),color = "black")+
scale_size(range = c(1,10))+
geom_polygon(data = data1,
aes(x, y, group = G,
fill=as.factor(id)),
color = "white") +#通过绘制大量的直线来填充这个圆
scale_fill_manual(values = c("#d20962","#f47721","#7ac143","#00a78e","#00bce4","#7d3f98")) +
theme_void() +
theme(legend.position="right") +
labs(fill="Group")+#图例标题
coord_equal()#保证x,y尺度大小相同
参考:https://www.cnblogs.com/tecdat/p/15839746.html
绘图源码和数据可在公众号后台回复"堆砌图"获取!!!
爱我请给我好看!