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

告别沉闷的直方图:绘制高颜值的威尔金森图与麦穗图

在数据可视化世界中,我们经常用直方图来描述数据的分布情况,但今天我想介绍两种特别而优雅的点状图变体:威尔金森点状图麦穗图

它们像数据世界的"点彩派"画家,用简单的点创造出丰富的信息层次。

直方图相比,这种点绘法不仅能够更直观地展示数据分布的细节,还能更好地揭示数据之间的关系和模式,使得观察者能够从更广阔的视角理解数据集的特点。

1. 威尔金森点状图

想象一下,你有一袋彩色弹珠,需要按颜色分类展示。如果只是简单地把所有弹珠倒出来,它们会杂乱无章。

但如果你为每种颜色准备一个小盒子,把相同颜色的弹珠整齐地堆叠在里面,这就是威尔金森点状图基本思想

威尔金森点状图将数据点堆叠在对应的数值区域,形成类似直方图的分布展示,但保留了每个数据点的个体性。

它不是用条形的高度表示频率,而是用实际的数据点数量来可视化分布。

下面基于matplotlib库封装了一个绘制威尔金森点状图的函数。

def wilkinson_dot_plot(data, bins=10, dot_size=40, dot_spacing=0.8, show_stats=True, random_seed=42
):"""创建威尔金森点状图参数:data: 输入数据(一维数组)bins: 分组数量或分组边界dot_size: 点的大小dot_spacing: 点之间的垂直间距random_seed: 随机种子"""np.random.seed(random_seed)# 创建图形fig, ax = plt.subplots(figsize=(10, 7))# 计算直方图数据hist, bin_edges = np.histogram(data, bins=bins)# 为每个分组创建点max_count = 0  # 记录最大堆叠高度bin_centers = []  # 保存每个分组的中心位置# 省略...plt.tight_layout()return fig, ax, (bin_edges, hist)

威尔金森点状图的核心算法可以分解为几个步骤:

  1. 数据分箱:将连续数据分成若干个等宽的区间
  2. 点位置计算:在每个区间内,将数据点垂直堆叠
  3. 避免重叠:通过调整点的垂直位置防止重叠,同时保持可读性

使用起来也简单:

# 生成示例数据
np.random.seed(42)# 数据集:正态分布
data_normal = np.random.normal(100, 15, 100)
dot_size = 200# 创建威尔金森点状图
fig1, ax1, stats1 = wilkinson_dot_plot(data_normal, bins=12, dot_size=dot_size)
plt.show()

2. 麦穗图

如果把威尔金森点状图比作整齐堆叠的弹珠,那么麦穗图就像是田野中的麦穗——每个数据点都像一颗麦粒,精确地生长在自己的位置上,展示其实际数值。

麦穗图威尔金森点状图的一种变体,它将点放置在其实际数值位置,而不是分组中心。

这保留了数据的精确性,同时通过堆叠避免了重叠。

麦穗图的实现与威尔金森点状图类似,但有一个关键区别:点沿x轴放置在实际数据值位置,而不是分组中心。

# 封装麦穗图函数
def strip_plot(data,bin_edges=None,bins=10,dot_size=40,dot_spacing=0.8,jitter_amount=0.2,random_seed=42,
):"""创建麦穗图(在威尔金森点状图基础上显示实际值)参数:data: 输入数据(一维数组)bin_edges: 可选,使用预定义的分组边界bins: 如果未提供bin_edges,则使用此参数创建分组dot_size: 点的大小dot_spacing: 点之间的垂直间距jitter_amount: 水平抖动程度(避免重叠)random_seed: 随机种子"""np.random.seed(random_seed)# 创建图形fig, ax = plt.subplots(figsize=(10, 7))# 如果没有提供分组边界,则计算if bin_edges is None:hist, bin_edges = np.histogram(data, bins=bins)else:hist, bin_edges = np.histogram(data, bins=bin_edges)# 对数据进行排序sorted_data = np.sort(data)# 将数据分配到对应的分组data_by_bin = []for i in range(len(bin_edges) - 1):lower, upper = bin_edges[i], bin_edges[i + 1]bin_data = sorted_data[(sorted_data >= lower) & (sorted_data < upper)]data_by_bin.append(bin_data)# 处理最后一个分组(包含最大值)if len(data) > 0:last_bin_data = sorted_data[sorted_data >= bin_edges[-2]]if len(data_by_bin) > 0:data_by_bin[-1] = last_bin_data# 绘制麦穗图max_points_in_bin = 0# 省略 ...plt.tight_layout()return fig, ax, (bin_edges, data_by_bin)

使用起来也简单:

# 生成示例数据
np.random.seed(42)# 数据集:正态分布
data_normal = np.random.normal(100, 15, 100)
dot_size = 200# 创建的麦穗图
bin_edges = 12
fig2, ax2, stats2 = strip_plot(data_normal, bin_edges=bin_edges, dot_size=dot_size, jitter_amount=0.15
)
plt.show()

3. 两种图的应用场景

下面模拟一个学生考试成绩分布的分析场景,看看上面两种点状图的应用。

# 示例:学生考试成绩分布分析
print("示例:学生考试成绩分布分析")
print("-" * 40)# 创建模拟的考试成绩数据
np.random.seed(42)
exam_scores = np.concatenate([np.random.normal(65, 8, 45),  # 中等水平学生np.random.normal(85, 6, 30),  # 优秀学生np.random.normal(45, 10, 24),  # 需要帮助的学生]
)# 过滤掉不合理分数
exam_scores = np.clip(exam_scores, 0, 100)print(f"学生总数: {len(exam_scores)}")
print(f"分数范围: {exam_scores.min():.1f} - {exam_scores.max():.1f}")
print(f"平均分: {exam_scores.mean():.1f}")
print(f"及格率: {(exam_scores >= 60).sum() / len(exam_scores) * 100:.1f}%\n")# 使用威尔金森点状图
print("创建威尔金森点状图...")
fig1, ax1, stats1 = wilkinson_dot_plot(exam_scores,bins=[0, 40, 60, 70, 80, 90, 100],
)
plt.show()# 使用麦穗图
print("创建麦穗图...")
fig2, ax2, stats2 = strip_plot(exam_scores,bins=[0, 40, 60, 70, 80, 90, 100],jitter_amount=0.15,
)
plt.show()## 输出结果:
'''
示例:学生考试成绩分布分析
----------------------------------------
学生总数: 99
分数范围: 25.1 - 94.4
平均分: 65.3
及格率: 63.6%
'''

在学生考试成绩分析这个场景中:

  • 威尔金森点状图:将分数分组成区间(如60-70分),所有该区间的学生点都堆叠在区间中心,清晰地展示了分数段的整体分布形态,类似直方图但能看到个体点。
  • 麦穗图:点在实际分数位置堆叠(如65分、68分等),既显示了每个学生的具体分数,又通过垂直堆叠避免了重叠,保留了数据的精确性。

总的来说,威尔金森点状图看分布形态(区间视角),麦穗图看具体数值(精确视角)。

4. 总结

威尔金森点状图麦穗图为数据可视化工具箱增添了优雅而实用的工具。

它们填补了传统直方图散点图之间的空白,提供了同时展示数据分布和个体数据点的独特方式。

在数据可视化中,选择合适的图表类型就像选择正确的工具来完成工作。

威尔金森点状图麦穗图提供了独特的视角,让我们能够同时看到森林和树木——既理解整体分布,又关注个体数据点。

完整代码分享:威尔金森与麦穗图.ipynb (访问密码: 6872)

http://www.jsqmd.com/news/345540/

相关文章:

  • 基于STM32的多回路电力表:从原理到量产应用
  • 开题报告 springboot和vue-旅游信息系统
  • 2026年北京子女抚养权律师联系电话推荐:聚焦本地实践与成功案例 - 品牌推荐
  • 程序员除了上班,还可以尝试这5种副业
  • MMDetection3D 所有核心Backbone、Neck、数据集类型、完整模型算法详细剖析(超详细)
  • 技术收藏必备!Kimi K2.5:多模态智能体的革命性突破与实战应用
  • 漏洞扫描十大工具,收藏这一篇就够了!
  • 互联网大厂Java面试:从Spring Boot到分布式事务的技术场景解析
  • Visual Studio 2019 Enterprise 16.11.50 Offline - Windows 平台 IDE
  • # OP-TEE TA 保护三件套:签名、内置到安全存储、加密 TA(以 Rockchip RK3588 为例)
  • 赤水市英语雅思培训机构推荐:2026权威测评出国雅思辅导机构口碑榜单 - 老周说教育
  • 程序员必备技能:大模型知识库系统搭建全流程(含源码与实战案例)
  • 燕千云平台效能升级:构建敏捷数字化底座
  • 桌面运维不想做了,还能干什么?
  • 2026年专业的GEO公司,帮你解决企业品牌推广难题 - 工业推荐榜
  • 2026年AI大模型学习全攻略,收藏这份百万年薪指南0_2026年AI大模型高薪岗位揭秘:大模型人才的薪资,彻底爆了
  • Visual Studio 2017 Enterprise 15.9.78 Offline - Windows 平台 IDE
  • 完整教程:嵌入式Linux C语言程序设计九
  • 234_尚硅谷_客户管理系统-需求分析和界面
  • 2026年浙江江苏地区,微帮忙职称申报服务靠谱吗,咨询电话多少? - myqiye
  • RAG技术深度解析:4大开源项目实战指南,解决LLM两大痛点,建议收藏!
  • 全球高端硬密封球阀厂家盘点:电动型精度标杆与气动型效率先锋 - 品牌推荐大师1
  • 2026年北京离婚房产律师联系电话推荐:精选推荐与使用指南 - 品牌推荐
  • 2026年本地西点培训学校排名,性价比高的学校有哪些 - mypinpai
  • 大模型如何落地?2025年5大应用场景与TOP厂商实战分析
  • 学长亲荐9个降AIGC工具 千笔AI帮你高效降AI率
  • 2026年德派日用品费用多少,功能实用性价比高有参考 - 工业设备
  • 剖析区域保护能量饮料分销退换货政策,深圳地区靠谱品牌排名 - mypinpai
  • AIGC检测的困境度指标是什么意思?专业术语详解
  • 2026年【北京遗嘱咨询律所电话】联系电话推荐:权威律所服务详解 - 品牌推荐