如何在Matplotlib/Seaborn图表中正确显示mean与median双图例?
解决分布图中均值和中位数竖线的图例显示问题
需求:在Seaborn绘制的分布图中添加均值(mean)和中位数(median)的竖线,并让两者的图例正确对应颜色与线型。
遇到的两个问题:
- 分两次调用
plt.legend()时,后一个图例完全覆盖前一个 - 使用
plt.legend([...,...])传参时,图例格式混乱,无法正确匹配样式
错误原因分析
- 代码1的问题:
plt.legend()传入的是字典列表,不符合Matplotlib图例的传参规范,无法识别这种格式来匹配线条样式与标签;同时代码中计算中位数标签时误写为均值的数值,属于低级错误。 - 代码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
相关产品推荐
相关产品推荐

