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

如何在Matplotlib/Seaborn图表中正确显示mean与median双图例?

解决分布图中均值和中位数竖线的图例显示问题

需求:在Seaborn绘制的分布图中添加均值(mean)和中位数(median)的竖线,并让两者的图例正确对应颜色与线型。

遇到的两个问题:

  • 分两次调用plt.legend()时,后一个图例完全覆盖前一个
  • 使用plt.legend([...,...])传参时,图例格式混乱,无法正确匹配样式

错误原因分析

  1. 代码1的问题:plt.legend()传入的是字典列表,不符合Matplotlib图例的传参规范,无法识别这种格式来匹配线条样式与标签;同时代码中计算中位数标签时误写为均值的数值,属于低级错误。
  2. 代码2的问题:每次调用plt.legend()都会重置图例,第二次调用会直接覆盖第一次的结果,因此最终只显示中位数的图例。

正确解决方案

给每条竖线(axvline)通过label参数直接设置图例文本,之后仅调用一次plt.legend()(或ax.legend()),Matplotlib会自动根据线条的颜色、线型匹配对应的图例项。

修正后的完整代码

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from numpy import random

# 生成测试数据
d = {'distance_km': random.randint(100, size=(20))}
df_calculation = pd.DataFrame(data=d)

sns.set_style("white")

# 计算均值和中位数
mean = df_calculation["distance_km"].mean()
median = df_calculation["distance_km"].median()

plt.figure(figsize=(11,5))
ax = sns.distplot(df_calculation["distance_km"], color='lightblue')
# 给每条竖线添加label参数
ax.axvline(mean, color='r', linestyle='--', label=f'Mean = {round(mean, 2)}')
ax.axvline(median, color='green', linestyle='--', label=f'Median = {round(median, 2)}')
# 仅调用一次legend即可自动匹配所有带label的元素
plt.legend()

plt.box(False)
plt.xlabel("\n Km", fontsize=12)
plt.ylabel("", fontsize=12)
plt.show()

效果说明

运行修正后的代码,分布图中会显示红色虚线(均值)和绿色虚线(中位数),图例将正确对应两者的颜色、线型和文本标签,不会出现覆盖或格式错误的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:15:39