我在matplotlib中编写了一段代码,在一个子图网格下打印多个直方图,但是,当我在最后调用fig. legend()函数时,每个图的图例都打印了两次。如果您能给出解决这个问题的指导,我们将不胜感激:)以下是我的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
def get_cmap(n, name='hsv'):
return plt.cm.get_cmap(name, n)
def isSqrt(n):
sq_root = int(np.sqrt(n))
return (sq_root*sq_root) == n
df = pd.read_csv('mpg.csv')
df2 = pd.read_csv('dm_office_sales.csv')
df['miles'] = df2['salary']
numericClassifier = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
newdf = df.select_dtypes(numericClassifier)
columns = newdf.columns.tolist()
n = len(columns)
cmap = get_cmap(n)
if(isSqrt(n)):
nrows = ncols = int(np.sqrt(n))
else:
ncols = int(np.sqrt(n))
for i in range(ncols,50):
if ncols*i >= n:
nrows = i
break
else:
pass
fig,ax = plt.subplots(nrows,ncols)
count = 0
print(nrows,ncols)
for i in range(0,nrows,1):
for j in range(0,ncols,1):
print('ncols = {}'.format(j),'nrows = {}'.format(i),'count = {}'.format(count))
if count<=n-1:
plt_new = sns.histplot(df[columns[count]],ax=ax[i,j],facecolor=cmap(count),kde=True,edgecolor='black',label=df[columns[count]].name)
patches = plt_new.get_children()
for patch in patches:
patch.set_alpha(0.8)
color = patches[0].get_facecolor()
ax[i,j].set_xlabel('{}'.format(df[columns[count]].name))
ax[i,j].xaxis.label.set_fontsize(10)
ax[i,j].xaxis.label.set_fontname('ariel')
ax[i,j].set(xlabel=None)
ax[i,j].tick_params(axis='y', labelsize=8)
count+=1
else:
break
for i in range(0,nrows,1):
for j in range(0,ncols,1):
if not ax[i,j].has_data():
fig.delaxes(ax[i,j])
else:
pass
plt.suptitle('Histograms').set_fontname('ariel')
plt.tight_layout()
fig.legend(loc='upper right')
plt.show()
下面是输出:
1条答案
按热度按时间eblbsuwk1#
sns.histplot
似乎创建了两个bar容器。首先是一个虚拟容器,然后是真实的的容器。(用seaborn0.12.1测试;这在其它版本中可能不同)。2因此,标签被分配给虚拟和真实的棒容器。3一个变通方案是移除虚拟棒容器的标签。以下是修改后的代码。Seaborn的
mpg
数据集被用作一个易于复制的示例。由于hls
颜色Map表的第一个和最后一个颜色是红色,get_cmap(n + 1)
确保n
选择不同的颜色。一些多余的代码已被删除。经进一步调查,似乎在使用
color=
而非facecolor=
调用sns.histplot
时未创建引锭杆容器。代码也可以写得更“Python”一点。这意味着a.o.要尽量避免重复代码和显式索引。要做到这一点,
zip
是一个重要的帮手。除了避免重复,代码也变得更短,更容易修改。一旦你习惯了,它就变得更容易阅读和推理。主要部分可能如下所示: