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

Matplotlib图例重复显示求助:循环调用sns.histplot致图例重复

解决Seaborn histplot循环绘图时图例重复的问题

使用Matplotlib和Seaborn读取CSV数据绘图时,通过for循环调用sns.histplot()绘制多列数据的直方图,出现了每个列的图例显示两次的问题。原代码如下:

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

sns.set_style('darkgrid')
df = pd.read_csv('dm_office_sales.csv')
df['salary'] = df['salary'] * 3
df['sample salary'] = df['salary'] * 2
x = df['salary']
y = df['sales']
z = df['sample salary']

fig,ax = plt.subplots()
for i in [x,y,z]:
    sns.histplot(data = i, bins=50, ax=ax, palette = 'bright',alpha=0.3, label='{}'.format(i.name))

plt.legend(numpoints=1)
plt.suptitle('Sales/Salary Histogram')
plt.show()

问题原因

当传入的data是Pandas Series(即单独的列数据)时,sns.histplot()会自动基于Series的名称生成一个图例条目,同时手动设置的label参数又会添加一次相同的图例,最终导致重复显示。

解决方案

有两种简单的修复方式:

方法1:禁用histplot自动生成图例

在调用sns.histplot()时添加legend=False参数,只保留手动设置的label:

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

sns.set_style('darkgrid')
df = pd.read_csv('dm_office_sales.csv')
df['salary'] = df['salary'] * 3
df['sample salary'] = df['salary'] * 2
x = df['salary']
y = df['sales']
z = df['sample salary']

fig,ax = plt.subplots()
for i in [x,y,z]:
    # 添加legend=False,关闭自动图例
    sns.histplot(data = i, bins=50, ax=ax, palette = 'bright',alpha=0.3, label='{}'.format(i.name), legend=False)

plt.legend(numpoints=1)
plt.suptitle('Sales/Salary Histogram')
plt.show()

方法2:直接传入DataFrame和列名(更规范的方式)

循环列名而非单独的Series,通过x参数指定列名,这样histplot只会生成一次对应列名的图例:

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

sns.set_style('darkgrid')
df = pd.read_csv('dm_office_sales.csv')
df['salary'] = df['salary'] * 3
df['sample salary'] = df['salary'] * 2

fig,ax = plt.subplots()
# 循环目标列名
for col in ['salary', 'sales', 'sample salary']:
    sns.histplot(data=df, x=col, bins=50, ax=ax, palette='bright', alpha=0.3, label=col)

plt.legend(numpoints=1)
plt.suptitle('Sales/Salary Histogram')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:01:13