You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为matplotlib.pyplot绘制的直方图添加图例(Legend)

解决Matplotlib直方图添加图例的问题

我来帮你搞定这个直方图加图例的困扰!这种情况我之前也碰到过,核心原因是matplotlib的直方图默认不会自动绑定图例标签,得我们手动指定才行。下面我用你的模拟场景(同一DataFrame,按列筛选两个数据集)一步步演示正确的做法:

第一步:创建模拟数据

先还原你的场景,生成一个包含两组数据的DataFrame:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 生成模拟数据,和你的实际场景一致
np.random.seed(42)  # 固定随机种子,保证结果可复现
df = pd.DataFrame({
    'value': np.concatenate([np.random.normal(50, 10, 200), np.random.normal(70, 15, 200)]),
    'group': ['A']*200 + ['B']*200
})

错误示例:为什么图例不显示?

如果你直接筛选数据画直方图却不指定label参数,调用plt.legend()是不会生效的,因为matplotlib不知道该给哪些元素加图例:

# 错误示范:无label参数,图例无法显示
plt.hist(df[df['group'] == 'A']['value'], alpha=0.5)
plt.hist(df[df['group'] == 'B']['value'], alpha=0.5)
plt.legend()  # 这里不会显示任何图例
plt.show()

正确做法1:直接指定label参数(最简单)

给每个plt.hist()添加label参数,告诉matplotlib每个直方图对应的名称,之后调用plt.legend()就能正常显示了:

# 正确做法:给每个直方图添加label参数
plt.hist(df[df['group'] == 'A']['value'], alpha=0.5, label='Group A')
plt.hist(df[df['group'] == 'B']['value'], alpha=0.5, label='Group B')

# 添加图例和其他标注
plt.legend()
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram of Values by Group')
plt.show()

正确做法2:面向对象方式(更灵活)

如果你习惯用matplotlib的面向对象API(推荐用于复杂绘图),可以手动获取直方图的patch对象,再关联图例标签:

# 面向对象写法,更适合复杂场景
fig, ax = plt.subplots()

# 绘制直方图并返回patch对象(直方图的矩形元素)
_, _, patches_a = ax.hist(df[df['group'] == 'A']['value'], alpha=0.5)
_, _, patches_b = ax.hist(df[df['group'] == 'B']['value'], alpha=0.5)

# 手动将patch和标签关联,添加图例
ax.legend([patches_a[0], patches_b[0]], ['Group A', 'Group B'])

# 设置图表标注
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
ax.set_title('Histogram of Values by Group')
plt.show()

额外优化:对齐两组直方图的bins

如果想让两组直方图的区间完全对齐(避免视觉上的错位),可以统一指定bins参数:

# 统一bins,让两组直方图区间一致
bins = np.linspace(df['value'].min(), df['value'].max(), 20)

plt.hist(df[df['group'] == 'A']['value'], bins=bins, alpha=0.5, label='Group A')
plt.hist(df[df['group'] == 'B']['value'], bins=bins, alpha=0.5, label='Group B')

plt.legend()
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Aligned Histogram of Values by Group')
plt.show()

这样处理后,你的直方图就能正常显示图例啦!

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

火山引擎 最新活动