python - 为什么 Seaborn 绘制两个图例,我如何删除一个并修复另一个?
问题描述
当我运行下面显示的代码时,我得到一个包含 2 个图例的图形。我无法弄清楚为什么要绘制两个并且我无法删除其中一个。我的目标是保留图形外部的图例,删除图形内部的图例,并以某种方式停止将图例右侧切断的奇怪裁剪。
我之前有一个问题问过类似的问题,但是通过使用 seaborns scatterplot 而不是 relplot 解决了这个问题。可悲的是,在该问题中有效的答案在这里都不起作用。如果这个问题是由绘制我试图制作的图形类型的“非常规”方式引起的,请告诉我。正确地做到这一点比破解解决方案要好...
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
#setup
sns.set(font_scale=2)
sns.set_context('poster')
#figure and axes
fig = plt.figure(figsize=(20,20))
axs = {i:fig.add_subplot(330+i) for i in range(1,10)}
#create random data
r = np.random.randint
N=10
df = pd.DataFrame(columns=['No.','x1','x2','x3','y1','y2','y3'])
for i in range(N):
df.loc[i] = i+1,r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100),r(50,high=100)
#create axes labels
x_labels = ['x1','x2','x3']
y_labels = ['y1','y2','y3']
xy_labels = [(x,y) for y in y_labels for x in x_labels ]
#plot on axes
for i,(x_label,y_label) in enumerate(xy_labels):
if i ==0:#if statement so only one of the plots has legend='full'
a = sns.scatterplot(
data=df,
x=x_label,
y=y_label,
legend='full', #create the legend
ax=axs[i+1],
hue='No.',
palette=sns.color_palette("hls", N)
)
fig.legend(bbox_to_anchor=(1, 0.7), loc=2, borderaxespad=0.) #Move the legend outside the plot
a.legend_.remove() #attempt to remove the legend
else:
a = sns.scatterplot(
data=df,
x=x_label,
y=y_label,
legend=False,
ax=axs[i+1],
hue='No.',
palette=sns.color_palette("hls", N)
)
#remove axes labels from specific plots
if i not in [0,3,6]: axs[i+1].set_ylabel('')
if i not in [6,7,8]: axs[i+1].set_xlabel('')
#add line plots and set limits
for ax in axs.values():
sns.lineplot(x=range(50,100),y=range(50,100), ax=ax, linestyle='-')
ax.set_xlim([50,100])
ax.set_ylim([50,100])
fig.tight_layout()
解决方案
您可以添加legend=False
代码的最后一部分。
#setup
sns.set(font_scale=2)
sns.set_context('poster')
#figure and axes
fig = plt.figure(figsize=(20,20))
axs = {i:fig.add_subplot(330+i) for i in range(1,10)}
#create axes labels
x_labels = ['x1','x2','x3']
y_labels = ['y1','y2','y3']
xy_labels = [(x,y) for y in y_labels for x in x_labels ]
#plot on axes
for i,(x_label,y_label) in enumerate(xy_labels):
if i ==0:#if statement so only one of the plots has legend='full'
a = sns.scatterplot(
data=df,
x=x_label,
y=y_label,
legend='full', #create the legend
ax=axs[i+1],
hue='No.',
palette=sns.color_palette("hls", N)
)
fig.legend(bbox_to_anchor=(1, 0.7), loc=2, borderaxespad=0.) #Move the legend outside the plot
a.legend_.remove() #attempt to remove the legend
else:
a = sns.scatterplot(
data=df,
x=x_label,
y=y_label,
legend=False,
ax=axs[i+1],
hue='No.',
palette=sns.color_palette("hls", N)
)
#remove axes labels from specific plots
if i not in [0,3,6]: axs[i+1].set_ylabel('')
if i not in [6,7,8]: axs[i+1].set_xlabel('')
#add line plots and set limits
for ax in axs.values():
sns.lineplot(x=range(50,100),y=range(50,100), ax=ax, linestyle='-', legend=False)
ax.set_xlim([50,100])
ax.set_ylim([50,100])
fig.tight_layout()
结果:
推荐阅读
- python - python 2.7.3的jupyter笔记本问题
- c# - swift和c#之间生成的base64字符串不同
- php - 如何从 Mysql 查询转换为 Codeigniter 语法?
- apache-spark - 在 pyspark 中获取分桶随机投影结果的最佳实践
- php - Laravel:如何统计每月注册的新生人数和在线学生人数?
- javascript - 使用它来保存函数中的变量?
- c# - 调用函数列表。如何获取它们的返回值并使用可能是已处置闭包的一部分的参数?
- java - 为什么 system.out.println() 让我的 Eclipse 没有响应
- c++ - 我试图想出一个程序来将用户输入(字符串)存储在一个向量中,并按长度降序输出它们
- r - lm() 的响应优化