删除此Seaborn人物中产生的两个传说之一?

时间:2019-06-19 10:03:50

标签: python matplotlib graph seaborn figure

我刚刚开始使用seaborn来制作我的人物。但是,我似乎无法删除此处产生的传说之一。

我正在尝试相互绘制两个精度并沿对角线画一条线,以使其更容易看出效果更好(如果有人能以更好的方式在seaborn中绘制此数据,请告诉我!)。我想保留的图例是左侧的图例,它为“ N_bands”显示不同的颜色,为“主题编号”显示不同的形状

ax1 = sns.relplot(y='y',x='x',data=df,hue='N bands',legend='full',style='Subject No.',markers=['.','^','<','>','8','s','p','*','P','X','D','H','d']).set(ylim=(80,100),xlim=(80,100))
ax2 = sns.lineplot(x=range(80,110),y=range(80,110),legend='full')

enter image description here

我尝试将ax1和ax2的kwarg图例设置为“ full”,“ brief”和False(一起和分别),并且似乎只删除了左边的一个或两个。

我也尝试过使用matplotlib删除轴

ax1.ax.legend_.remove()
ax2.legend_.remove()

但这会导致相同的行为(左图例消失)。

更新:这是一个可以自己运行的最小示例:

test_data = np.array([[1.,2.,100.,9.],[2.,1.,100.,8.],[3.,4.,200.,7.]])
test_df = pd.DataFrame(columns=['x','y','p','q'], data=test_data)

sns.set_context("paper")
ax1=sns.relplot(y='y',x='x',data=test_df,hue='p',style='q',markers=['.','^','<','>','8'],legend='full').set(ylim=(0,4),xlim=(0,4))
ax2=sns.lineplot(x=range(0,5),y=range(0,5),legend='full')

enter image description here

尽管由于正确的图例被涂上颜色,这不能完全重现错误(我不知道该如何重现此错误-创建数据框的方式是否有所作为?)。但是问题的实质仍然是-如何删除右侧的图例,而保留左侧的图例?

1 个答案:

答案 0 :(得分:1)

您正在通过FacetGrid生成的relplot的(仅)轴上绘制线图。这是非常不常规的,因此可能会发生奇怪的事情。

一个删除FacetGrid的图例但保留在线图中的选项为

g._legend.remove()

完整代码(我还在其中纠正了网格和轴的混淆命名)

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

test_data = np.array([[1.,2.,100.,9.],[2.,1.,100.,8.],[3.,4.,200.,7.]])
test_df = pd.DataFrame(columns=['x','y','p','q'], data=test_data)

sns.set_context("paper")
g=sns.relplot(y='y',x='x',data=test_df,hue='p',style='q',markers=['.','^','<','>','8'], legend='full')

sns.lineplot(x=range(0,5),y=range(0,5),legend='full', ax=g.axes[0,0])

g._legend.remove()

plt.show()

enter image description here

请注意,这是一种破解,可能会在以后的Seaborn版本中破坏。

另一种选择是不使用FacetGrid,而只是在一个轴上绘制散点图和线图,

ax1 = sns.scatterplot(y='y',x='x',data=test_df,hue='p',style='q',
                      markers=['.','^','<','>','8'], legend='full')

sns.lineplot(x=range(0,5),y=range(0,5), legend='full', ax=ax1)

plt.show()

enter image description here