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

news2024/9/23 1:27:02

本篇笔记分享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多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端适配750px设计稿

全局引入 (function(doc, win) {const docEl doc.documentElement,resizeEvt orientationchange in window ? orientationchange : resizeconst setFont function() {let clientWidth docEl.clientWidth;if (!clientWidth) return;if (clientWidth > 750) {docEl.styl…

社科院与美国杜兰大学金融管理硕士项目——金融在职人员的当下与未来

随着经济的蓬勃发展和全球化的疾驰&#xff0c;金融行业已稳坐现代经济的心脏位置。在这翻涌的时代浪潮中&#xff0c;金融从业人员的重要性愈发突出&#xff0c;他们不仅是企业的坚实支柱&#xff0c;更是推动经济前行的强大引擎。然而&#xff0c;科技进步和市场变幻的风云也…

深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解

负载均衡 官网地址&#xff1a; http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略&#xff0c; 以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的&#xff1f; 讲道理&#xff0c; 最少活跃数…

TSP(Python):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

批量剪辑方法:掌握视频剪辑技巧,按指定时长轻松分割视频

在视频制作和编辑过程中&#xff0c;经常要批量处理和剪辑大量的视频片段。学会批量剪辑方法可以提高工作效率&#xff0c;还可以使视频编辑更加准确和高效。下面来看下云炫AI智剪如何按指定时长轻松分割视频的批量剪辑方法。 分割后的视频文件效果&#xff0c;已分割分段的视…

一、Mybatis 简介

本章概要 简介持久层框架对比快速入门&#xff08;基于Mybatis3方式&#xff09; 1.1 简介 https://mybatis.org/mybatis-3/zh/index.html MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投G…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

搭建一个手游平台的价格大概是多少?

随着智能手机的普及和移动互联网的发展&#xff0c;手游行业呈现出爆炸性的增长。许多人都看到了手游市场的巨大潜力&#xff0c;并考虑搭建一个自己的手游平台。那么&#xff0c;搭建一个手游平台的价格大概是多少呢&#xff1f; 首先&#xff0c;我们需要明确手游平台的搭建涉…

Halcon灰度共生矩阵

Halcon灰度共生矩阵 图像的纹理一般具有重复性&#xff0c;纹理单元往往会以一定的规律出现在图像的不同位置&#xff0c;即使存在一些形变或者方向上的偏差&#xff0c;图像中一定距离之内也往往有灰度一致的像素点&#xff0c;这一特性适合用灰度共生矩阵来表现。 灰度共生矩…

软件测试|Django 入门:构建Python Web应用的全面指南

引言 Django 是一个强大的Python Web框架&#xff0c;它以快速开发和高度可扩展性而闻名。本文将带您深入了解Django的基本概念和核心功能&#xff0c;帮助您从零开始构建一个简单的Web应用。 什么是Django&#xff1f; Django 是一个基于MVC&#xff08;模型-视图-控制器&a…

软件测试|MySQL算术运算符使用详解

简介 MySQL是一种流行的开源关系型数据库管理系统&#xff0c;广泛用于各种应用程序和网站的数据存储和管理。在MySQL中&#xff0c;算术运算符是执行数学计算的特殊符号&#xff0c;用于处理数字类型的数据。本文将详细介绍MySQL中常用的算术运算符及其使用方法。 常用算术运…

【仙丹秘法】如何炼制一颗稳定的仙丹

提示词始终保持不变 1&#xff1a;收集素材 制作lora_v1 2: 制作lora_v1 产生 1个人物 含 你想要的服装 导入 pose_1 到 control 1 生成人物 (white_background:1.1),front view,1boy,blue sleeveless t-shirt,blue shorts,detailed eyes,best quality,masterpiece,high res…

3d模型里显示了灯光怎么取消---模大狮模型网

要取消3D模型中的灯光显示&#xff0c;您可以尝试以下方法&#xff1a; 禁用灯光&#xff1a;在您使用的3D软件中&#xff0c;查找并选择灯光对象&#xff0c;然后禁用或隐藏它们。这样可以阻止灯光对场景的渲染影响。 调整灯光属性&#xff1a;如果您不想完全禁用灯光&#x…

模型创建与nn.Module

一、网络模型创建步骤 二、nn.Module 下面描述了在 PyTorch 中常见的一些属性和功能&#xff0c;用于存储和管理神经网络模型的参数、模块、缓冲属性和钩子函数。 parameters&#xff1a;用于存储和管理 nn.Parameter 类的属性。nn.Parameter 是一种特殊的张量&#xff0c;它被…

Spring Boot 接入 KMS 托管中间件密码第三方接口密钥

1. 需求 Nacos中关于中间件的密码&#xff0c;还有第三方API的密钥等信息&#xff0c;都是明文存储&#xff0c;不符合系统安全要求。现需对这些信息进行加密处理&#xff0c;Nacos只存储密文&#xff0c;并在服务启动时&#xff0c;调用云厂商的KMS接口进行解密&#xff0c;将…

【十九】【动态规划】518. 零钱兑换 II、279. 完全平方数、474. 一和零,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

LoRa网关在智能冷链物流中的应用解决方案

随着物联网技术的不断发展&#xff0c;智能冷链物流成为了物流行业的一个重要领域。在冷链物流中&#xff0c;对于货物的温度、湿度等环境变量的监测和控制非常关键&#xff0c;而这些数据的传输需要一个高效可靠的通信方式。LoRa技术作为一种低功耗广域网通信技术&#xff0c;…

详解java继承

目录 一 、为什么需要继承 二、准备工作&#xff1a;用java代码先定义狗类、猫类、动物类&#xff0c;这是代码准备如下 三、继承代码实现 四、 子类中访问父类的成员方法 4.1. 成员方法名字不同 4.2 成员方法名字相同 五、子类构造方法 扩展&#xff1a;如果你对子类和…

jvm虚拟机初识

JVM Java虚拟机就是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令执行。每一条Java指令&#xff0c;Java虚拟机规范中都有详细定义&#xff0c;如怎么取操作数&#xff0c;怎么处理操作数&#xff0c;处理结果放在哪…

什么是API网关代理?

带有API网关的代理服务显着增强了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的人来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解API API&#xff08;即应用程序编程接口&#xff09;充当服务提供商和用户之间的连接网关。通过 API 连接&a…