当前位置: 首页 > news >正文

六边形箱图 (Hexbin Plot):使用 Matplotlib 处理大规模散点数据

六边形箱图 (Hexbin Plot):使用 Matplotlib 处理大规模散点数据

以下代码展示了一个高质量 Hexbin 图的生成过程,它清晰地揭示了大规模数据点的密度分布,是本文核心技术的直观展示。

import numpy as np
import matplotlib.pyplot as plt# 生成 50000 个符合正态分布的数据点
np.random.seed(42)
x = np.random.normal(size=50000)
y = x * 3 + np.random.normal(size=50000)# 创建一个图形实例
plt.figure(figsize=(10, 7))# 绘制 Hexbin 图
# gridsize 控制六边形的数量,值越大,六边形越小
# cmap 定义了颜色映射方案,'viridis' 是一个视觉友好的常用选项
hb = plt.hexbin(x, y, gridsize=50, cmap='viridis')# 添加一个颜色条,用于解释颜色与数据点计数的关系
cb = plt.colorbar(hb)
cb.set_label('数据点计数')# 添加标题和标签
plt.title("Hexbin 图:清晰展示数据密度")
plt.xlabel("X 值")
plt.ylabel("Y 值")
plt.grid(True, linestyle='--', alpha=0.2)# 显示图形
plt.show()

在这里插入图片描述


一、引言:当散点图不堪重负

散点图是数据可视化中最基础、最常用的图表之一,用于展示两个数值变量之间的关系。然而,当数据量变得非常大时,传统的散点图会遭遇一个严重的问题——过度绘制(Overplotting)

成千上万的数据点堆叠在一起,形成一个无法辨认的“墨水团”,这不仅使得图表难以解读,也掩盖了数据真实的密度分布。我们无法分辨哪些区域是数据真正的聚集地,哪些区域只是稀疏地散落着几个点。

看一个过度绘制的例子:

import numpy as np
import matplotlib.pyplot as plt# 生成 50000 个数据点
np.random.seed(42)
x = np.random.normal(size=50000)
y = x * 3 + np.random.normal(size=50000)# 绘制传统散点图
plt.figure(figsize=(8, 6))
plt.plot(x, y, 'o', markersize=2, alpha=0.1)
plt.title("过度绘制的散点图 (50,000 个点)")
plt.xlabel("X 值")
plt.ylabel("Y 值")
plt.grid(True)
plt.show()

面对这样的“墨水团”,我们需要一种更智能的可视化方法来揭示其内部结构。六边形箱图(Hexbin Plot) 正是为此而生的强大工具。

在深入这项技术前,若想在数据分析和编程学习中获得智能助力,不妨了解一下这款强大的 AI 助手。

AI 助手推荐

  • 官网https://0v0.pro
  • 特色
    • 🆓 开源模型全免费:Llama、Qwen、Deepseek 等。
    • 😲 基础模型全免费:gpt-4o、o4-mini 、gpt-5-mini 等。
    • ♾️ 对话真正无限制:不限时间、不限次数。
    • 🫡 每周免费一个旗舰模型:本周免费 gpt-5,不限使用!

二、六边形箱图 (Hexbin Plot) 的工作原理

Hexbin 图是一种二维密度图,它的工作方式如下:

  1. 划分网格:将整个二维绘图空间划分为一系列规则的六边形网格。
  2. 计数聚合:统计每个六边形“箱子”(bin)中落入了多少个数据点。
  3. 颜色映射:根据每个六边形内数据点的数量,为其赋予不同的颜色。通常,数据点越密集的区域,颜色越深。

为什么是六边形?
选择六边形而不是正方形(像二维直方图那样)是有原因的。在所有能够无缝平铺平面的形状中,六边形最接近圆形,这意味着它在聚合数据时,从中心到各个边缘的距离更加均匀,从而减少了因网格形状带来的视觉偏差。


三、使用 Matplotlib.pyplot.hexbin

Matplotlib 的 pyplot 模块提供了 hexbin() 函数,让我们可以轻松创建六边形箱图。

1. 基础 Hexbin 图

让我们用 hexbin 来重新绘制上面那个“墨水团”例子。

import numpy as np
import matplotlib.pyplot as plt# 使用与之前相同的数据
np.random.seed(42)
x = np.random.normal(size=50000)
y = x * 3 + np.random.normal(size=50000)plt.figure(figsize=(10, 7))# 绘制 Hexbin 图
hb = plt.hexbin(x, y, gridsize=50, cmap='viridis')# 添加颜色条
cb = plt.colorbar(hb)
cb.set_label('数据点计数')plt.title("Hexbin 图:清晰展示数据密度")
plt.xlabel("X 值")
plt.ylabel("Y 值")
plt.grid(True, linestyle='--', alpha=0.2)
plt.show()

效果立竿见见影!现在我们可以清晰地看到数据主要集中在一条对角线上,中心的密度最高,向两边逐渐稀疏。

2. 核心参数详解

plt.hexbin() 提供了丰富的参数来控制图表的外观和行为。

gridsize

控制六边形网格的粒度。它接受一个整数或一个元组 (nx, ny)

  • 整数:表示在 x 方向上六边形的数量,y 方向的数量会自动计算以保持六边形形状规则。
  • 值越大,六边形越小,分辨率越高
# 比较不同 gridsize 的效果
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))ax1.hexbin(x, y, gridsize=20, cmap='Blues')
ax1.set_title("gridsize = 20 (低分辨率)")ax2.hexbin(x, y, gridsize=80, cmap='Blues')
ax2.set_title("gridsize = 80 (高分辨率)")plt.show()
cmap

颜色映射(Colormap),用于指定从低密度到高密度的颜色渐变方案。常用的 cmap 包括 viridis (默认), plasma, inferno, magma, cividis, Blues, Reds 等。

bins

控制颜色条的刻度。默认是线性的,但当数据密度差异巨大时(例如,中心点有 1000 个点,而外围只有几个点),使用对数刻度 bins='log' 会非常有用。

plt.figure(figsize=(10, 7))hb = plt.hexbin(x, y, gridsize=50, cmap='inferno', bins='log')cb = plt.colorbar(hb)
cb.set_label('数据点计数 (Log Scale)')plt.title("使用对数刻度的 Hexbin 图")
plt.show()

使用对数刻度后,即使是计数较少的区域也能被清晰地着色,从而展示出更多的细节。

mincnt

设置一个阈值,只有当六边形内的数据点数量大于等于 mincnt 时,该六边形才会被绘制。这对于过滤掉稀疏的背景噪声、聚焦核心分布区域非常有效。

plt.hexbin(x, y, gridsize=50, cmap='viridis', mincnt=10)
plt.title("只显示计数 >= 10 的区域")
plt.show()

3. 高级应用:聚合第三方变量 (C)

Hexbin 图最强大的功能之一是,它不仅可以统计每个六边形内的点的数量,还可以计算这些点第三方变量 C 的统计值(如平均值、总和等)。

假设我们除了 xy 坐标外,还有一个变量 z,我们想知道在数据密集的区域,z 的平均值是多少。

import numpy as np
import matplotlib.pyplot as plt# 生成数据
np.random.seed(42)
n_points = 50000
x = np.random.normal(size=n_points)
y = x * 3 + np.random.normal(size=n_points)
# z 值与 x, y 的距离相关,中心区域 z 值较小
z = np.sqrt(x**2 + y**2)plt.figure(figsize=(10, 7))# C 参数传入 z 值,reduce_C_function 指定聚合函数为求均值
hb = plt.hexbin(x, y, C=z, gridsize=50, cmap='cividis', reduce_C_function=np.mean)cb = plt.colorbar(hb)
cb.set_label('Z 值的平均值')plt.title("Hexbin 图:按 Z 值的平均值着色")
plt.xlabel("X 值")
plt.ylabel("Y 值")
plt.show()

这张图的颜色不再代表点的数量,而是代表落入每个六边形内所有点的 z 值的平均值。这使得 Hexbin 图从一个二维密度图升级为了一个可以展示三维信息的强大工具。


四、自动化数据故事

在创建了像 Hexbin 这样信息丰富的图表后,下一步就是解读它并形成结论。例如,我们可以识别出高密度区域的坐标,或者 z 值最高的区域。这个过程可以借助 AI 自动化。

通过编程方式提取 Hexbin 的计算结果,然后将这些数据(如“密度最高的六边形位于(x, y)附近”)发送给大语言模型(LLM)API,就可以自动生成一份数据摘要或报告。在进行这类探索性开发时,API 成本是一个考量点。

LLM AI API 推荐 🗨️

1. 按量计算 (适合高频使用)
  • 官网https://llm-all.pro
  • 优势
    • 😊 主流模型超低价:OpenAI, Claude, Gemini 等模型,价格约为官方的 1 折
    • 🤓 国内模型折扣大:豆包、千问、DeepSeek 等,普遍享受 2-6 折 优惠。
2. 按次计算 (适合轻量或测试)
  • 官网https://fackai.chat
  • 优势
    • 高性价比:提供国内外全模型,1 元可购 100 次 调用,非常划算。

五、总结

六边形箱图(Hexbin Plot)是处理大规模散点数据时不可或缺的可视化工具。它完美地解决了传统散点图的过度绘制问题,通过美观的六边形网格和直观的颜色映射,清晰地揭示了数据的密度分布。

何时使用 Hexbin 图?

  • 当你的散点图数据点过多,已经变成了一个看不清细节的“墨水团”。
  • 当你想直观地了解二维数据的密度分布,找出“热点”区域。
  • 当你想在二维平面上可视化第三个变量的聚合统计值。

下次再遇到大规模散点数据时,不妨放弃 plt.plot(),试试 plt.hexbin(),它将为你打开一扇新的数据洞察之门。

http://www.dtcms.com/a/393808.html

相关文章:

  • LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(2——Parser解析html模块)
  • 电脑能ping开发板,开发板不能ping电脑的解决方法:
  • git 覆盖:检出特定分支的文件到当前分支
  • CentOS 8.5.2.111部署Zabbix6.0
  • 【Elasticsearch面试精讲 Day 20】集群监控与性能评估
  • hive调优系列-3.HQL语法和运行参数层面
  • 计算机网络学习(三、数据链路层)
  • Refresh keys changed: [] 2023.0.3.3 问题排查
  • 高并发内存池(二):三层缓存的整体框架设计
  • Android音视频编解码全流程之Extractor
  • 基于 @antv/x6 实现流程图
  • markdown 绘制流程图
  • Spark专题-第二部分:Spark SQL 入门(5)-算子介绍-Join
  • 平替Jira,推荐一款国产开源免费的项目管理工具-Kanass
  • ssh不用版本管理器为多个服务器添加密钥
  • Windows Docker Desktop 实战:大模型存入 docker-desktop 实例 home 目录并与 Dify 联动运行指南
  • linux驱动开发笔记
  • 阿里云与腾讯云产品操作与体验:云平台运维实战技术解析
  • 深入了解linux网络—— 网络基础
  • leetcode3 哈希
  • Spring AI 整合OpenAI 聊天、做图
  • 阿里Motionshop人物角色替换成3D虚拟形象
  • C语言自学--字符函数和字符串函数
  • spring-boot--邮箱验证码发送--spring-boot-starter-mail
  • 3ds Max 2026安装教程(附安装包)3ds Max 2026下载详细安装图文教程
  • Genie 2:Google DeepMind 推出的基础世界模型,单张图生成 1分钟可玩 3D 世界
  • LeetCode 104. 二叉树的最大深度
  • 欧拉角描述相机的运动
  • Unity2D-Spriteshape
  • 打工人日报#20250921