График () в Pandas с двумя осями Y: где хранится вторая строка? - PullRequest
0 голосов
/ 06 января 2020

Я использую встроенную функцию plot () в pandas, чтобы сгенерировать график с двумя осями Y. Это работает хорошо, и легенда даже указывает на (правую) ось Y для второго набора данных. Но имхо положение легенды плохое.

Однако, когда я обновляю положение легенды, я получаю две легенды: правильную ('A', 'B (справа)') в неудобном месте и неправильную. (Только 'A') в выбранном месте.

Итак, теперь я хочу создать легенду самостоятельно и искал вторую <matplotlib.lines.Line2D>, но она не содержится в среде топора.

import pandas as pd
df = pd.DataFrame({"A":[1,2,3],"B":[1/4,1/5,1/6]})
ax = df.plot(secondary_y=['B'])
len(ax.lines)
>>> 1

Моя конечная цель - иметь возможность перемещать правильную легенду, но я уверен, что мог бы вручную разместить легенду, если бы только у меня был доступ к контейнеру второй строки.

Если Я собирался подавить оригинальную легенду, вызвав df.plot(...,legend=None) и сделать что-то вроде plt.legend([ax.lines[0],ax.lines[1]],['A','B (right)'],loc='center left',bbox_to_anchor=(1.2, 0.5)). Но ax хранит только первую строку «A», где вторая?

Также ax.get_legend_handles_labels() содержит только ([<matplotlib.lines.Line2D at 0x2630e2193c8>], ['A']).

1 Ответ

2 голосов
/ 06 января 2020

Вы создаете две оси. Каждый содержит строку. Таким образом, вам нужно l oop по осям и взять строки из каждой из них.

import numpy as np
import pandas as pd

df = pd.DataFrame({"A":[1,2,3],"B":[1/4,1/5,1/6]})
ax = df.plot(secondary_y=['B'])

lines = np.array([axes.lines for axes in ax.figure.axes]).flatten()
print(lines)

Для создания отдельной легенды вы можете использовать легенду фигуры,

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"A":[1,2,3],"B":[1/4,1/5,1/6]})
ax = df.plot(secondary_y=['B'], legend=False)

ax.figure.legend()
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...