跟着高分SCI学画图:Python绘制六边形箱图和核密度估计图
在科研数据分析中,随着数据量的增加,过度绘制(overplotting)成为一个常见问题,尤其在高分文章的图表中,经常会看到如何通过图表优化来避免信息丢失。今天我们将通过Python演示如何使用六边形箱图(Hexbin)和核密度估计图(KDE)来解决这一问题,帮助您提升科研图表的可读性与表现力。
图1. 六边形箱图和核密度估计图
过度绘制的困境
过度绘制(Overplotting)是指在可视化数据时,当大量数据点重叠在图表上导致图像拥挤不清晰,难以理解数据的实际分布或趋势的一种现象。它通常发生在散点图或其他类型的图表中,尤其是当数据集较大,数据点彼此之间距离较近时。
过度绘制的主要问题
信息丢失: 由于数据点重叠,图表上某些区域的数据点变得无法区分,导致信息丢失或无法准确传达数据密度。 可读性差: 当大量数据点集中在一起时,图表变得杂乱,难以解读数据的趋势和分布情况。 误导性: 在一些极端情况下,过度绘制会让人误以为某些区域的数据点很少或没有,从而导致错误的结论。
解决过度绘制的方法
Hexbin(六边形箱图): 将数据点分布聚合到六边形网格中,每个六边形根据其中数据点的数量进行着色。它能够有效减少图表的复杂性,同时保留数据的密度信息。 透明度调整(Alpha Blending): 通过调整数据点的透明度来降低重叠部分的视觉效果,使得重叠区域的颜色更深,显示出数据点密集的地方。 KDE(核密度估计)图: 使用核密度估计(Kernel Density Estimation)来平滑和估计数据的分布,能够很好地显示数据的总体趋势和密度情况。
六边形箱图详解
Hexbin图的作用
Hexbin图是处理大数据集中点分布的一种好方法。与普通的散点图不同,Hexbin图将数据聚合到网格中,每个六边形的颜色表示数据点的密度。这样不仅解决了数据点重叠导致的信息丢失,还能更加直观地展示数据分布。
Hexbin图绘制原理与代码讲解
原理
Hexbin图的核心思想是将散点数据映射到六边形单元格中,并根据单元格中的点数量着色,颜色越深,数据点越密集。它通过聚合来代替简单的点对点散布,尤其适合大数据集。
构造示例数据集
我们将代码生成了一个包含三个不同分布的数据集,并将其合并为一个DataFrame df
:
df1: 数据集A, x
和y
的值服从均值为10,标准差为1.2的正态分布。组名为'A',数据量为20000。df2: 数据集B, x
和y
的值服从均值为14.5,标准差为1.2的正态分布。组名为'B',数据量为20000。df3: 数据集C, x
服从均值为9.5,标准差为1.5的正态分布,y
服从均值为15.5,标准差为1.5的正态分布。组名为'C',数据量为20000。
通过pd.concat()
函数将三个数据集合并成一个DataFrame df
。
# 导入所需的库
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
# 生成数据集
# 数据集 df1: x 和 y 从均值为 10,标准差为 1.2 的正态分布中生成,分组为 'A'
df1 = pd.DataFrame(
{'x': np.random.normal(10, 1.2, 20000), 'y': np.random.normal(10, 1.2, 20000), 'group': np.repeat('A', 20000)})
# 数据集 df2: x 和 y 从均值为 14.5,标准差为 1.2 的正态分布中生成,分组为 'B'
df2 = pd.DataFrame(
{'x': np.random.normal(14.5, 1.2, 20000), 'y': np.random.normal(14.5, 1.2, 20000), 'group': np.repeat('B', 20000)})
# 数据集 df3: x 从均值为 9.5,标准差为 1.5 的正态分布中生成,y 从均值为 15.5,标准差为 1.5 的正态分布中生成,分组为 'C'
df3 = pd.DataFrame(
{'x': np.random.normal(9.5, 1.5, 20000), 'y': np.random.normal(15.5, 1.5, 20000), 'group': np.repeat('C', 20000)})
# 合并三个数据集成一个 DataFrame
df = pd.concat([df1, df2, df3], ignore_index=True)
# 将合并后的数据保存到 CSV 文件中
df.to_csv('input_data.csv', index=False)
绘制 Hexbin 图(六边形箱图)
Hexbin图是一种处理大量散点数据的有效方法。它将数据点聚合到六边形的单元格中,并根据单元格中的点数对其进行着色。 使用 plt.hexbin()
函数创建Hexbin图:gridsize=50
指定了六边形网格的大小。cmap='viridis'
设定了颜色映射(颜色从黄色到紫色变化,表示密度增加)。添加颜色条来表示每个六边形中的点数。 Hexbin图能够有效处理大量数据点的重叠问题,帮助我们清晰看到数据密度和分布。
# 导入所需的库
import matplotlib.pyplot as plt
# 绘制 Hexbin 图(六边形箱图)以处理过度绘图问题
plt.figure(figsize=(10, 6))
plt.hexbin(df['x'], df['y'], gridsize=50, cmap='viridis') # 绘制 Hexbin 图,设置网格大小和颜色映射
plt.colorbar(label='Count in bin') # 添加颜色条,显示每个六边形中的数据点数量
plt.xlabel('Value of X') # 设置 x 轴标签
plt.ylabel('Value of Y') # 设置 y 轴标签
plt.title('Hexbin Plot to Address Overplotting') # 设置图表标题
plt.show() # 显示图形
核密度估计图详解
KDE图的作用
KDE图同样是解决过度绘制的利器,它通过核密度估计算法,平滑数据分布,使我们能够直观了解数据的总体趋势。相比于Hexbin图,KDE图不仅展示了数据点的密度,还能清晰地看出数据的概率分布。
KDE图绘制原理与代码讲解
原理
KDE图基于概率密度函数估计,通过核函数对数据进行平滑,使我们可以直观看到数据集中在哪些区域。对于不同组别的比较(如A、B、C组),我们可以使用不同颜色填充展示它们的分布差异。
绘制KDE(核密度估计)图
KDE图是基于数据的密度来估计分布的平滑图。它使用核密度估计(Kernel Density Estimation)来估算二维数据的概率密度函数。 使用 sns.kdeplot()
函数创建KDE图:data=df
指定数据源。x='x'
和y='y'
指定要绘制的变量。hue='group'
根据不同的组('A', 'B', 'C')对数据进行颜色区分。fill=True
和alpha=0.6
用于填充颜色,并设定透明度,使得图表更清晰。palette='Set1'
为不同组指定了颜色。
# 绘制 KDE 图(核密度估计图)以处理过度绘图问题
plt.figure(figsize=(10, 6))
sns.kdeplot(data=df, x='x', y='y', hue='group', fill=True, alpha=0.6, palette='Set1') # 绘制 KDE 图,按组着色并填充颜色
plt.xlabel('Value of X') # 设置 x 轴标签
plt.ylabel('Value of Y') # 设置 y 轴标签
plt.title('KDE Plot to Address Overplotting') # 设置图表标题
plt.show() # 显示图形
总结
通过这两种可视化方法,你可以有效解决过度绘制问题,无论是Hexbin图的聚合与着色,还是KDE图的平滑与填充,都会让你的数据分布一目了然,避免关键信息被大量数据点所掩盖。
如果你希望在科研图表中既保留数据的细节又解决图表的复杂性,试试这两种方法吧!Python的绘图能力可以轻松提升你的科研数据可视化水平,为你的文章增添亮点!
本文作者:李想
现在:
长按扫码关注:科研生信充电宝
10元赞赏本文,即喜欢作者~
即可直接解锁:
《跟着高分SCI学画图:Python绘制六边形箱图和核密度估计图》对应资源哦~
看到这里你还不心动吗?
赶紧关注、转发、点赞、分享,领取你的专属福利吧~
好啦,以上就是今天推文的全部内容啦!
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。
如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。