【问题标题】:Remove one of the two legends produced in this Seaborn figure?删除这个 Seaborn 人物中产生的两个传说之一?
【发布时间】:2019-06-19 20:27:24
【问题描述】:

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

我正在尝试绘制两个精度,并沿着对角线画一条线,以便更容易看出哪个表现更好(如果有人有更好的方法在 seaborn 中绘制这些数据 - 请告诉我!)。我想保留的图例是左侧的图例,它显示了“N_bands”的不同颜色和“Subject No”的不同形状

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')

我尝试将 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')

虽然这并不能完美地重现错误,因为正确的图例是彩色的(我不知道如何重现这个错误 - 我的数据框的创建方式会有所不同吗?)。但问题的本质仍然存在——如何去掉右边的图例而保留左边的图例?

【问题讨论】:

  • 您是否有机会提供我们可以使用的可运行代码?目前我们甚至无法运行您的代码
  • 由于您似乎是 Stack Overflow 的新手,您应该阅读How to create a Minimal, Complete, and Verifiable example
  • 不是 100% 确定,但我认为如果您将 legend='full' 更改为 legend=Falserelplotlineplot,应该删除一个图例。
  • 恐怕我已经尝试过了,它似乎只会删除两个图例或我想保留的那个!

标签: python matplotlib graph seaborn figure


【解决方案1】:

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

删除 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()

请注意,这是一种 hack,它可能会在未来的 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()

【讨论】:

  • 在散点图顶部绘制线条的常规方法是什么?我应该使用一些东西而不是 relpot 吗?
  • @bidby : 一个简单的plt.plot() 怎么样?
  • 我会同意的,但我的主管特别告诉我使用 seaborn - 虽然我猜他们永远不会知道我是否只使用 plt.plot() 作为线路......
  • 我用我认为“常规”的绘制方式更新了答案。
  • 这给了我一个AttributeError: 'AxesSubplot' object has no attribute '_legend' 错误
猜你喜欢
  • 2021-07-27
  • 2019-10-20
  • 2023-03-21
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多