You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Seaborn绘制以点替代条形的histplot直方图?

用散点图实现点式二项分布直方图

因为sns.histplot的element参数确实不支持点样式,你可以先统计每个变量的频率分布,再用散点图来实现需求:

步骤说明

  • 统计每个数据列的频数/频率,并按x值排序(保证二项分布的整数x按顺序排列)
  • 将宽格式数据转换为长格式,方便seaborn分组绘图
  • 使用散点图绘制每个x值对应的频率点

完整代码

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import binom

# 生成数据
x_n10_p0_6 = binom.rvs(n=10, p=0.6, size=10000, random_state=0)
x_n10_p0_8 = binom.rvs(n=10, p=0.8, size=10000, random_state=0)
x_n20_p0_8 = binom.rvs(n=20, p=0.6, size=10000, random_state=0)

df = pd.DataFrame({
    'n=10, p=0.6': x_n10_p0_6, 
    'n=10, p=0.8': x_n10_p0_8, 
    'n=20, p=0.6': x_n20_p0_8
})

# 统计每个系列的频率分布并整理成长表
plot_data = []
for col in df.columns:
    # 计算频数并归一化得到频率,按x值排序
    freq = df[col].value_counts(normalize=True).sort_index().reset_index()
    freq.columns = ['x', 'frequency']
    freq['series'] = col
    plot_data.append(freq)
plot_df = pd.concat(plot_data)

# 绘制点式分布图
sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.scatterplot(data=plot_df, x='x', y='frequency', hue='series', style='series', s=100)

# 添加标题和标签
plt.title('二项分布频率分布(点式展示)')
plt.xlabel('随机变量X')
plt.ylabel('频率')
plt.legend(title='分布参数')
plt.show()

代码解释

  • value_counts(normalize=True):计算每个x值的相对频率(近似概率)
  • sort_index():保证x值按从小到大的顺序排列,符合二项分布的直观展示
  • 转换为长表后,用hue和style区分不同的二项分布系列,让点的颜色和形状都有差异,更易区分
  • s=100:调整点的大小,让展示更清晰

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:09:56