查看原文
其他

R可视化——圆堆砌图(Circle Packing)的绘制

王志山 科研后花园 2023-09-08

     这几天在浏览一些绘图网站过程中,小编发现了一种比较有意思的图形——圆堆砌图(Circle Packing),示例如下(图片来源于Chiplot绘图网站)。这种图形展示数据的功能类似于气泡图,即颜色代表分组,圆圈大小代表具体数值大小,不过这种图片还是比较新颖的,那怎么绘制这种图片呢?下面就和小编一起看看吧!

设置工作环境并加载R包

1、设置工作环境

rm(list=ls())#clear Global Environmentsetwd('D:/桌面/Circle Packing')#设置工作路径

2、加载R包——这里用到的包主要有两种,一个是ggplot2,另一个是packcircles:

#加载R包library(packcircles) # Circle Packinglibrary(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 Environmentsetwd('D:/桌面/Circle Packing')#设置工作路径#加载R包library(packcircles) # Circle Packinglibrary(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


绘图源码和数据可在公众号后台回复"堆砌图"获取!!!

爱我请给我好看!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存