如何在Matplotlib violinplot的X轴显示频率值?
在Matplotlib小提琴图的X轴显示频率
Matplotlib默认的violinplot以分组索引作为X轴(单组数据时显示1),要改成显示频率,核心思路是先统计数据的频率分布,再将X轴的刻度或位置映射到频率值。以下是两种实用方案:
方案1:单组数据X轴展示频率统计信息
如果是单组数据,我们可以先统计数据的频率分布,再替换X轴的刻度标签,展示频率的关键信息:
import numpy as np import matplotlib.pyplot as plt data = np.random.normal(size=100) # 分箱统计频率(计数) counts, bins = np.histogram(data, bins=10) # 计算相对频率(占比) rel_freqs = counts / len(data) # 绘制小提琴图 plt.violinplot(data) # 修改X轴标签为频率统计结果 plt.xticks([1], [f"频率范围: {rel_freqs.min():.2f}-{rel_freqs.max():.2f}\n峰值频率: {rel_freqs.max():.2f}"]) plt.xlabel("频率(相对占比)") plt.ylabel("数据值") plt.show()
方案2:多组数据X轴直接对应频率计数
如果有多组数据,想要让每组小提琴图的X轴位置直接对应该组的样本计数(频率),可以通过positions参数指定X轴位置:
import numpy as np import matplotlib.pyplot as plt # 生成3组不同样本量的数据集 data_groups = [ np.random.normal(size=50), np.random.normal(size=100), np.random.normal(size=150) ] # 计算每组的样本计数(作为频率指标) freq_counts = [len(group) for group in data_groups] # 以频率值作为X轴位置绘制小提琴图 plt.violinplot(data_groups, positions=freq_counts) # 设置X轴刻度与标签 plt.xticks(freq_counts, [str(count) for count in freq_counts]) plt.xlabel("样本计数(频率)") plt.ylabel("数据值") plt.grid(axis='x', alpha=0.3) plt.show()
补充说明
- 你可以调整
np.histogram的bins参数来改变分箱数量,适配不同的数据分布。 - 若需要展示绝对频率(原始计数),直接使用
counts即可,无需除以总样本数。 - 多组场景下,
positions参数可以自由指定小提琴图的X轴位置,完全匹配你的频率需求。
内容的提问来源于stack exchange,提问作者Didac Busquets
相关产品推荐
相关产品推荐

