python - 带有两个 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'])
.
解决方案
您创建两个轴。每个都包含一行。所以你需要在轴上循环并从每个轴上取线。
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()
推荐阅读
- python - Python Tkinter 循环在 INSERT SQLITE 之前验证条目
- android-studio - 如何让 onclick 方法在 onCreate() 之外工作?
- r - scale_alpha_continuous 对数刻度
- python - 如何从具有某些值的列表的熊猫数据框列中获取行
- excel - 批量电子邮件提取器。需要添加一个Regxp - excel VBA
- python - Python:使用 lxml xpath 从所有 HTML 子元素文本中获取文本
- powershell - 参数化值会导致 powershell/msbuild 命令出错
- mongodb - 嵌入 mongodb 到 spring-boot 应用程序 java 异常
- sql - 在 SQL Server 中将 getdate() 转换为 dd/mm/yyyy
- html - 内容的过渡不起作用