如何使用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
相关产品推荐
相关产品推荐

