首页 > 解决方案 > 带有两个 y 轴的 Pandas 中的 Plot():第二行存储在哪里?

问题描述

我正在使用 pandas 中的集成 plot() 函数来生成带有两个 y 轴的图形。这很好用,图例甚至指向第二个数据集的(右)y 轴。但恕我直言,传奇的位置很糟糕。

但是,当我更新图例位置时,我会在不方便的位置得到两个图例,正确的一个('A','B(右)'),以及所选位置的错误图例(仅'A')。

所以现在我想自己生成一个图例并且正在寻找第二个<matplotlib.lines.Line2D>,但它不包含在 ax 环境中。

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

标签: pythonpandasmatplotlib

解决方案


您创建两个轴。每个都包含一行。所以你需要在轴上循环并从每个轴上取线。

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

推荐阅读