如何在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




