You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Matplotlib中创建点图(Dot Plot)?非散点图

实现统计学中的点图(Dot Plot)

嘿,我完全懂你要的那种点图——就是每个观测值对应一个点,相同数值的点在垂直方向堆叠的统计学点图,比如0值上方有6个点就代表6个取值为0的观测,对吧?之前我也踩过坑,直接搜Matplotlib的时候确实容易搜到普通散点图,这里给你两个实用的实现方案:

方法一:用Matplotlib手动绘制

核心思路是先统计每个数值的出现次数,然后在对应x轴位置,把点依次画在不同的y轴高度上,保证每个观测值都有对应的点:

import matplotlib.pyplot as plt
import numpy as np

# 示例数据,和你提到的示例类似
data = [0,0,0,0,0,0,1,1,1,2,2,2,2,3,3]

# 统计每个数值的出现频数
values, counts = np.unique(data, return_counts=True)

plt.figure(figsize=(8, 4))

# 遍历每个数值和它的频数,逐个画点
for val, cnt in zip(values, counts):
    # 生成y轴坐标,从0到频数-1,保证点垂直堆叠
    y_positions = range(cnt)
    # 绘制对应x位置的所有点
    plt.scatter([val]*cnt, y_positions, color='#1f77b4', s=60)

# 美化图表
plt.xlabel('观测值')
plt.ylabel('堆叠数量')
plt.title('统计学点图(Dot Plot)')
plt.yticks(range(max(counts)))
plt.grid(axis='y', linestyle='--', alpha=0.6)

plt.show()

方法二:用Seaborn快速实现(更简洁)

Seaborn是基于Matplotlib的可视化库,它的stripplot可以直接实现这种点图,只要关闭抖动效果,让相同数值的点垂直堆叠:

import seaborn as sns
import matplotlib.pyplot as plt

data = [0,0,0,0,0,0,1,1,1,2,2,2,2,3,3]

plt.figure(figsize=(8, 4))
# jitter=False 是关键,禁止点左右分散,实现垂直堆叠
sns.stripplot(x=data, jitter=False, size=12, color='#1f77b4')

# 美化图表
plt.xlabel('观测值')
plt.title('统计学点图(Dot Plot)')
plt.grid(axis='y', linestyle='--', alpha=0.6)

plt.show()

补充说明

你搜Matplotlib时搜到的散点图,是因为Matplotlib原生的scatter默认会让点分散展示,而我们需要的是相同x值的点在y轴方向堆叠,所以要么手动控制y轴坐标,要么借助Seaborn的封装工具,这两种方法都能完美实现你要的统计学点图效果。

内容的提问来源于stack exchange,提问作者Scott

火山引擎 最新活动