R语言频率分布直方图绘制教程

本篇笔记分享R语言绘制直方图的方法,通过多种展示风格对数据进行可视化,主要用到ggplot、ggpubr等包。

什么是直方图?

直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的柱子表示数据分布的情况。

主要展示数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或者异常值。

直方图和柱形图的区别?

  • 柱形图横轴表示类别:横轴固定

  • 直方图横轴表示组距:横轴可变

  • 直方图的表示的数据通常是连续排列,而柱状图则是分开排列,直方图能展示分布趋势。

R语言绘制直方图方法

先创建一个随机数据用于绘图,该数据表格的第一列是“type”样品分类信息,包含A、B、C三个种类,第二列是随机数字,一共包含600行,将其看做600个样品的某指标数据。

set.seed(666)
df = data.frame(
    type = factor(rep(c("A", "B","C"), each=200)),
    val = c(rnorm(200, 56), rnorm(200, 58),rnorm(200, 52)))

创建的随机数据如下所示,在实际的作图过程中,只需整理成类似这种格式即可。

为了直观的展示测试数据的分布,先做个散点图试试:

ggplot(df)+
    geom_point(aes(type,val,color=type),position = "jitter")

明显可以看出C组的均值52左右最低,B组均值58左右最高,组内整体随机分布。

Base R 基础版直方图

hist(df$val, 
     breaks = 16, #切分多少个条
     col = "#51cf66",
     freq = F,
     xlab = "Value",main = "Hist Plot")
# 添加拟合曲线
lines(density(df$val),col= "#fd7e14",lwd=2)
# 添加下方密度条
rug(jitter(df$val))

这是最基础的直方图,没有展示分组信息,仅对所有的数据统计,可以看出在52和58处有峰值,说明分布频率很高,横轴上有一些条形码一样的黑色竖线,表示样品的分布情况,黑色线越密集,代表此处的值越多。

ggplot2 升级版直方图

library(ggplot2)
ggplot(df,aes(val,..density..)) +
    geom_histogram(bins = 50, fill="#74c0fc") +
    xlab("Insertion Size (bp)") +
    theme_bw()

通过上述代码,可以用ggplot绘制一张简单的直方图,gfill参数后面可以修改颜色,bins参数可以修改条子的数量。

bins参数很重要,它关系到直方图的形状,以下举个例子,分别画两张直方图,左图p1是bins等于10的时候,组距比较宽。右图p2是bins等于50的情况,组距变窄,同时一些隐藏的细节趋势展示的更加清楚。

p1 <- ggplot(diamonds, aes(carat)) +
    geom_histogram(aes(carat,fill=cut),bins = 10)+
    xlim(0,3)+
    theme_bw()
p2 <- ggplot(diamonds, aes(carat)) +
    geom_histogram(aes(carat,fill=cut),bins = 50)+
    xlim(0,3)+
    theme_bw()
library(patchwork)
p1+p2

由上图可知,不同的分组数量bins影响了信息的传递,在实际过程中若想模糊细节展示整体,则将bins设置的小一些。

多组分面直方图

假如有多个分组或者水平因素,想要看不同分组的直方图,则借助分面功能实现。例如在本文中A、B、C三个分组的直方图,通过下面的代码绘图:

ggplot(df,aes(val,..density..)) +
    geom_histogram(aes(fill=type),bins = 30,color="#ffffff") +
    facet_wrap(~type, scales = 'free_x') +
    xlab("Insertion Size (bp)") +
    theme_bw()

这样就可以将不同类型分开绘制,观察每个组内样品的指标数据分布趋势,可以发现三个组都是呈正态分布。

ggpubr 尊享版直方图

gghistogram函数提供了一个便捷绘制好看直方图的方法,只需简单的几行代码,就能生成漂亮的直方图。

library(ggpubr)
gghistogram(df, x = "val",
            fill = "#3bc9db", # 设置填充色
            add = "mean", # 添加均值线
            rug = TRUE # 添加轴须线
)

先画一张基础的直方图,fill参数可以修改颜色,add参数可以添加辅助线,比如这里就添加了一条均值竖线,rug是绘制横轴的条形码须线。

但是,上图中把三个组的样品数据混在一起统计,下面将其分开用不同颜色表示:

gghistogram(df,
            x="val",
            add="mean",
            rug = TRUE,
            color = "type",
            fill = "type",
            palette = c("#0fb9b1","#f7b731","#8854d0"),
            bins = 50,
            add_density = FALSE,
            xlab = "公众号:生信分析笔记")

如果想在图中对直方图添加拟合曲线展示密度信息,只需将add_density改为TURE即可。

堆叠形式直方图

接下来,再分享两种堆叠形式的直方图,用途是比较不同分组的数据。首先重新修改一下随机生成的测试数据,注意A组的样品数减少到100,B组样品数增加到300,以下是新的数据框:

df = data.frame(
    type = factor(rep(c("A", "B","C"), each=200)),
    val = c(rnorm(100, 56), rnorm(300, 58),rnorm(200, 57)))

画一张普通的直方图看看效果:

ggplot(df)+
    geom_histogram(aes(val,fill=type),bins = 20)+
    scale_fill_brewer()+
    theme_bw()

整体趋势比较明显,均值都在57附近,只不过不同组的数据个数不一样,正如所料,整体的趋势都呈正态分布。

再添加亿点点细节:

ggplot(df,aes(val,fill=type))+
    geom_histogram(bins = 40,color="black",alpha=0.8)+
    scale_fill_manual(values = c("A"="#a3cd5b",
                                 "B"="#f7b731",
                                 "C"="#0fb9b1"),
                      labels=c("A"="Type A",
                               "B"="Type B",
                               "C"="Type C"))+
    geom_vline(xintercept = 57,lty="dashed")+
    theme_bw()+
    theme(panel.border = element_blank(),
          panel.grid = element_blank(),
          axis.line = element_line(),
          legend.position = c(0.9,0.8),
          legend.background = element_rect(fill = "transparent"),
          legend.title = element_blank())

上面这张图展示了不同种类样品的数据分布规律,这种分布是柱形堆叠格式“stack”,现在将其转换成密度曲线图,你能看出下面这张图的区别吗?

ggplot(df,aes(val,fill=type))+
    geom_density(alpha=0.5,
                 position = "stack")+
    scale_fill_manual(values = c("#a3cd5b","#f7b731","#0fb9b1"))

是不是感觉似曾相识,直方图和密度曲线的规律是一样的,因为它们都是用同样的数据做出的图,呈现出相同的变化趋势。

还有一种位置展示方式“identity”,它不会将不同分组的值堆叠累加到一起,而是都从Y等于0为起始位置,只需修改上方代码中的“stack”为“identity”,即可看出效果区别。

不知道你有没有发现,这个图就是小提琴图的一半,因为这个密度曲线实际上反映了数据的分布,而小提琴图的宽窄也反应数据的分布,因此二者本质一样。

ggplot(df)+
    geom_violin(aes(x=type,y=val,fill=type))+
    scale_fill_manual(values = c("#0fb9b1","#f7b731","#8854d0"))+
    theme_bw()

对比一下,就能看出小提琴图、直方图、密度图存在互通之处,比如Type C类型的数据分布比较集中,因此小提琴图中紫色的中间部分凸出明显,而且上面密度曲线的紫色也区域中间也明显凸起。

翻转直方图

有时候还想比较两组之间的分布趋势差异,那么将两个直方图按横轴翻转放置,展示效果更佳。

ggplot(df,aes(val,fill=type))+
    geom_histogram(data = filter(df,type=="B"),
                   aes(y=..count..),
                   bins = 40,
                   color="#ffffff")+
    geom_histogram(data = filter(df,type=="C"),
                   aes(y=..count..*(-1)),
                   bins = 40,
                   color="#ffffff")+
    scale_fill_manual(values = c("#0fb9b1","#8854d0"))+
    labs(x='Value',y='Frequency')+
    theme_bw()+
    theme(legend.position = c(0.1,0.3))

此时可以看出,C组紫色的分布明显更集中一些,该图信息直观明了。本次直方图分享到这里完毕,感谢您的阅读,建议收藏转发,有备无患,万一之后需要用到这个绘图方法,换一下数据就可以。

本文由mdnice多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现代 C++ 及 C++ 的演变

C 活跃在程序设计领域。该语言写入了许多新项目&#xff0c;而且据 TIOBE 排行榜数据显示&#xff0c;C 的受欢迎度和使用率位居第 4&#xff0c;仅次于 Python、Java 和 C。 尽管 C 在过去二十年里的 TIOBE 排名都位居前列&#xff08;2008 年 2 月排在第 5 名&#xff0c;到…

从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理

目录 1. 提取变量 1.1 提取方法 1.2 提取地方&#xff1a;响应的body&#xff0c;响应的cookie&#xff0c;响应头 1.3 提取方式&#xff1a; 1.4 示例&#xff1a;在能获取到对应token的yaml用例中写入 2.使用变量&#xff1a;封装一个通用extract_util.py 3. 调用测试用…

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种结构型设计模式&…

5.5 THREAD GRANULARITY

性能调优中一个重要的算法决定是线程的粒度。有时&#xff0c;在每个线程中投入更多工作并使用更少的线程是有利的。当线程之间存在一些冗余工作时&#xff0c;就会产生这种优势。在当前一代设备中&#xff0c;每个SM的指令处理带宽有限。每个指令都消耗指令处理带宽&#xff0…

迎接人工智能的下一个时代:ChatGPT的技术实现原理、行业实践以及商业变现途径

课程背景 2023年&#xff0c;以ChatGPT为代表的接近人类水平的对话机器人&#xff0c;AIGC不断刷爆网络&#xff0c;其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识&#xff1a;AIGC绝非昙花一现&#xff0c;其底层技术和产业生态已经形成了新的格局…

【数据结构 | 二叉树入门】

数据结构 | 二叉树入门 二叉树概念&#xff1a;二叉树特点&#xff1a;二叉树的基本形态特殊二叉树满二叉树完全二叉树 二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历 计算二叉树的节点个数计算叶子节点的个数树的高度求第k层节点个数 二叉树概念&#xff1a; 如下图…

【51单片机】延时函数delay的坑——关于无符号整型数据for语句“x >= 0“变成死循环

请认真看看以下延时函数是否正确&#xff0c;并且指出错误&#xff1a;&#xff08;考考C语言功底&#xff09; void delay_ms(unsigned int xms) //delay x ms {unsigned int x,y;for(xxms;x>0;x--)for(y124;y>0;y--); }废话少说&#xff0c;上正确代码&#xff1a; v…

python进阶 -- 日志装饰器详解

日志 日志&#xff1a;记录程序运行的时候&#xff0c;出现的问题&#xff0c;或者说验证流程是否正常 在实际工作中&#xff0c;python的脚本命令一般是放在服务器执行的linux系统 日志其实就是记录程序运行时出现的问题、或者正常的打印&#xff0c;协助出现问题的时解决排查…

以太网交换机——稳定安全,构筑数据之桥

交换机&#xff0c;起源于集线器和网桥等网络通信设备&#xff0c;它在性能和功能上有了很大的发展&#xff0c;因此逐渐成为搭建网络环境的常用的设备。 随着ChatGPT爆发&#xff0c;因为用户量激增而宕机事件频频发生&#xff0c;云计算应用催生超大规模算力需求&#xff0c;…

kubernetes Namespace Labels 详解

写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 namespace 实现资源分组&#xff0c;label实现业务分组 Namespace 基础理论 最重…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo&#xff0c;对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上&#xff0c;使用pip安装&#xff1a; pip install…

YY9706.102-2021 医疗设备EMC检测知识-RE

一&#xff1a;RE&#xff08;辐射发射试验&#xff09; 按照GB 4824 6.2.2电磁辐射骚扰限值描述&#xff0c;在相对应的实验室和距离测量时&#xff0c;选择不同的限值进行测量。 以上只列出了1组的A、B类限值&#xff0c;2组设备的限值在6.3章节有介绍&#xff0c;对于我们的…

Backtrader 文档学习-Strategy(下)

Backtrader 文档学习-Strategy&#xff08;下&#xff09; 1. notify_cashvalue # 测试 #notify_cashvalue 方法特点 class Test_Strategy(bt.Strategy): # 策略通用初始参数params ((maperiod1, 5),(maperiod2, 20),(printlog, True), # 写入日志标志(logfilename, Test_…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

求求你,别再乱用@Transactional了

求求你&#xff0c;别再乱用Transactional了 文章目录 &#x1f50a;先看个问题&#x1f4d5;情况1情况1结果 &#x1f5a5;️情况2情况2结果 &#x1f4dc; 情况三情况3结果 &#x1f4d8;情况4情况4结果 &#x1f516;先说结论情况1结果情况2结果情况3结果情况4结果&#x1f…

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.45 (目的&am…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2105服务器场景操作系统&#xff1a;Windows&#xff08;版本不详&#xff09;&#xff08;封闭靶机&#xff09;需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…