Удалить одну из двух легенд, созданных на этой фигуре Seaborn? - PullRequest
0 голосов
/ 19 июня 2019

Я только начал использовать морского рожка для производства своих фигур. Однако я не могу удалить одну из легенд, созданных здесь.

Я пытаюсь построить две точности друг против друга и нарисовать линию вдоль диагонали, чтобы было легче увидеть, какие из них работали лучше (если у кого-то есть лучший способ нанесения этих данных в морском рожке - дайте мне знать!). Легенда, которую я хотел бы сохранить, это та, что слева показывает разные цвета для '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

Я попытался установить для легенды kwarg значение 'full','rief 'и False для ax1 и ax2 (вместе и отдельно), и кажется, что он удаляет только левую или обе.

Я также пытался удалить оси с помощью 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 Ответ

1 голос
/ 19 июня 2019

Вы строите линейный график по (только) осям 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

...