R语言中有很多现成的R包,可以绘制venn图,但是最多支持5组,当组别数大于5时,venn图即使能够画出来,看上去也非常复杂,不够直观;

在实际的数据分析中,组别大于5的情况还是经常遇到的,这是就可以考虑用花瓣图来进行数据的可视化

比如下面这个例子:

来源于该链接  https://www.researchgate.net/figure/235681265_fig3_The-pan-genome-of-Sinorhizobium-The-flower-plots-and-Venn-diagrams-illustrate-the-number

A和D是我们常见的venn图,B和C 就是花瓣图了

在花瓣图中,我们能够看到两种信息;

1)所有样本共有的信息;

2)每个样本独有的信息;

花瓣图既美观,展示信息也很直观,那么这样的图如何画呢?

我在网上找了半天,也没找到现成的工具,只能自己写代码来画!

在写代码之前,首先来分析下这张图,每一片花瓣就是一个椭圆型,整幅图片可以看做有1个椭圆通过旋转得到

通过以上分析,我们只需要先画一个椭圆,然后循环旋转即可

中间的调试过程就不细讲了,直接看写好的代码

flower_plot <- function(sample, value, start, a, b,
ellipse_col = rgb(135, 206, 235, 150, max = 255),
circle_col = rgb(0, 162, 214, max = 255),
circle_text_cex = 1.5
) {
par( bty = "n", ann = F, xaxt = "n", yaxt = "n", mar = c(1,1,1,1))
plot(c(0,10),c(0,10),type="n")
n <- length(sample)
deg <- 360 / n
res <- lapply(1:n, function(t){
draw.ellipse(x = 5 + cos((start + deg * (t - 1)) * pi / 180),
y = 5 + sin((start + deg * (t - 1)) * pi / 180),
col = ellipse_col,
border = ellipse_col,
a = a, b = b, angle = deg * (t - 1))
text(x = 5 + 2.5 * cos((start + deg * (t - 1)) * pi / 180),
y = 5 + 2.5 * sin((start + deg * (t - 1)) * pi / 180),
value[t]
) if (deg * (t - 1) < 180 && deg * (t - 1) > 0 ) {
text(x = 5 + 3.3 * cos((start + deg * (t - 1)) * pi / 180),
y = 5 + 3.3 * sin((start + deg * (t - 1)) * pi / 180),
sample[t],
srt = deg * (t - 1) - start,
adj = 1,
cex = circle_text_cex
) } else {
text(x = 5 + 3.3 * cos((start + deg * (t - 1)) * pi / 180),
y = 5 + 3.3 * sin((start + deg * (t - 1)) * pi / 180),
sample[t],
srt = deg * (t - 1) + start,
adj = 0,
cex = circle_text_cex
)
}
})
draw.circle(x = 5, y = 5, r = 1.3, col = circle_col, border = circle_col)
}

这里我写成了1个函数,函数的调用方式如下;

flower_plot(c("WSM419", "A321", "M1", "M2", "M22", "M58",
"M102", "M161", "KH36b", "KH36c", "KH36d", "KH53a", "KH53b"),
c(519, 556, 83, 62, 415, 425, 357, 441, 22, 41, 33, 44, 43), 90, 0.5, 2)

第一个参数为样本名字构成的向量,第二个参数为每个样本独有的数目,第三个参数为起始椭圆的角度,第四个参数为椭圆的短轴的长度,第五个参数为椭圆的长轴的长度

效果图如下:

R语言绘制花瓣图flower plot的更多相关文章

  1. R语言绘制QQ图

    无论是直方图还是经验分布图,要从比较上鉴别样本是否处近似于某种类型的分布是困难的 QQ图可以帮我们鉴别样本的分布是否近似于某种类型的分布 R语言,代码如下: > qqnorm(w);qqline ...

  2. R语言绘制茎叶图

    与直方图相比,茎叶图更能细致的看出数据分布情况! 代码: > x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75,+ 78, 79, 81, 8 ...

  3. R语言——绘制半圆形图

    好久没发点新的作品了.......也许...... Que sera, seraWhatever will be, will be

  4. R语言绘制相对性关系图

    准备 第一步就是安装R语言环境以及RStudio 图绘制准备 首先安装库文件,敲入指令,回车 install.packages('corrplot') 然后安装excel导入的插件,点击右上角impo ...

  5. 一幅图解决R语言绘制图例的各种问题

    一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...

  6. R语言之脸谱图

    脸谱图和星图类似,但它却比星图可以表示更多的数据维度.用脸谱来分析多维度数据,即将P个维度的数据用人脸部位的形状或大小来表征.脸谱图在平面上能够形象的表示多维度数据并给人以直观的印象,可帮助使用者形象 ...

  7. R语言绘制空间热力图

    先上图 R语言的REmap包拥有非常强大的空间热力图以及空间迁移图功能,里面内置了国内外诸多城市坐标数据,使用起来方便快捷. 开始 首先安装相关包 install_packages("dev ...

  8. R语言-画线图

    R语言分高水平作图函数和低水平作图函数 高水平作图函数:可以独立绘图,例如plot() 低水平作图函数:必须先运行高水平作图函数绘图,然后再加画在已有的图上面 第一种方法:plot()函数 > ...

  9. R语言绘制沈阳地铁线路图

    ##使用leaflet绘制地铁线路图,要求 ##(1)图中绘制地铁线路 library(dplyr) library(leaflet) library(data.table) stations< ...

随机推荐

  1. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-1导入JavaScript插件

    导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScri ...

  2. LeetCode: Path Sum 解题报告

    Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...

  3. Ubuntu 16.04 64位安装arm-linux-gcc交叉编译器以及samba服务器

    交叉编译器是嵌入式开发的必要工具,但是由于目前大多数人使用64位ubuntu,在照着很多教程做的时候,就会失败,失败原因是64位ubuntu需要额外安装32位的兼容包.以arm-linux-gcc-3 ...

  4. u盘引导制作工具

    https://rufus.ie/en_IE.html

  5. C#学习笔记(1)——快捷键

    说明(2017-5-23 09:29:17): 1. 自动排版Ctrl+E,D 2. 注释Ctrl+E,C 3. 取消注释Ctrl+E,U 4. 给字段生成属性Ctrl+R,E 5. 新建类Alt+S ...

  6. Virtual DOM 虚拟DOM的理解(转)

    作者:戴嘉华 转载请注明出处并保留原文链接( #13 )和作者信息. 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步骤一:用JS对象模拟DOM ...

  7. Docker常用命令<转>

    创建redis服务端docker run -p 6379:6379 -d --name redis-server docker.io/redis:3.0.7 redis-server -- port ...

  8. [转]Gson的基本使用

    gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的 ...

  9. 15.01.23-sql的注入式攻击

    很多网站上有登录和忘记密码的链接,可能存在sql注入的隐患.在忘记密码(把密码发送到邮箱)那里测试. 获取数据 1.'的妙用.在邮箱栏输入emailaddress',如果返回服务器错误,则说明sql注 ...

  10. CentOS防SYN攻击

    netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 ESTABLISHED 59 CONNECTED 589 SYN_RECV 15 S ...