使用 pandas 绘图时,图例仅显示一个标签

2024-03-08

我有两个 Pandas DataFrame,我希望将它们绘制成单个图形。我正在使用 IPython 笔记本。

我希望图例显示两个 DataFrame 的标签,但到目前为止我只能显示后一个。此外,任何关于如何以更合理的方式编写代码的建议将不胜感激。我对这一切都很陌生,并且不太了解面向对象的绘图。

%pylab inline
import pandas as pd

#creating data

prng = pd.period_range('1/1/2011', '1/1/2012', freq='M')
var=pd.DataFrame(randn(len(prng)),index=prng,columns=['total'])
shares=pd.DataFrame(randn(len(prng)),index=index,columns=['average'])

#plotting

ax=var.total.plot(label='Variance')
ax=shares.average.plot(secondary_y=True,label='Average Age')
ax.left_ax.set_ylabel('Variance of log wages')
ax.right_ax.set_ylabel('Average age')
plt.legend(loc='upper center')
plt.title('Wage Variance and Mean Age')
plt.show()

这确实有点令人费解。我认为这可以归结为 Matplotlib 如何处理辅助轴。熊猫可能会叫ax.twinx()在第一个轴上叠加第二个轴的地方,但这实际上是一个单独的轴。因此也有单独的线条和标签以及单独的图例。呼唤plt.legend()仅适用于其中一个轴(活动轴),在您的示例中是第二个轴。

幸运的是,Pandas 确实存储了两个轴,因此您可以从它们中获取所有线条对象并将它们传递给.legend()命令自己。鉴于您的示例数据:

您可以完全按照您的方式绘制:

ax = var.total.plot(label='Variance')
ax = shares.average.plot(secondary_y=True, label='Average Age')

ax.set_ylabel('Variance of log wages')
ax.right_ax.set_ylabel('Average age')

两个轴对象都可用ax(左轴)和ax.right_ax,这样你就可以从中抓取线条对象。 Matplotlib 的.get_lines()返回一个列表,以便您可以通过简单的添加来合并它们。

lines = ax.get_lines() + ax.right_ax.get_lines()

线对象有一个 label 属性,可用于读取标签并将其传递给.legend()命令。

ax.legend(lines, [l.get_label() for l in lines], loc='upper center')

其余的情节:

ax.set_title('Wage Variance and Mean Age')
plt.show()

edit:

如果您更严格地将 Pandas(数据)和 Matplotlib(绘图)部分分开,可能不会那么混乱,因此避免使用 Pandas 内置绘图(无论如何它只包装 Matplotlib):

fig, ax = plt.subplots()

ax.plot(var.index.to_datetime(), var.total, 'b', label='Variance')
ax.set_ylabel('Variance of log wages')

ax2 = ax.twinx()
ax2.plot(shares.index.to_datetime(), shares.average, 'g' , label='Average Age')
ax2.set_ylabel('Average age')

lines = ax.get_lines() + ax2.get_lines()
ax.legend(lines, [line.get_label() for line in lines], loc='upper center')

ax.set_title('Wage Variance and Mean Age')
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pandas 绘图时,图例仅显示一个标签 的相关文章

随机推荐

  • 初始化惰性实体的标准 JPA 方法

    我正在使用 JPA Hibernate 作为我的 JPA 提供程序 我真的想避免 hibernate 细节并使用 JPA 规范 我有一个初始化惰性实体的函数 不幸的是 它使用 Hibernate 特定的功能 这是我的功能 private T
  • Joomla 2.5 自定义字段列表未在显示中选择

    我在我的组件 models fields time php 中使用以下 php 创建了一个自定义字段类型 defined JPATH BASE or die jimport joomla form formfield class JForm
  • 为什么我无法在 openCV 中打开 avi 视频?

    我刚刚用openCV2 3 1写了一个简单的视频读取示例 但似乎无论如何我都无法打开avi视频 VideoCapture capture guitarplaying avi if capture isOpened std cout lt l
  • CouchDB 每用户 db 具有共享数据可扩展性

    I have an application with the following architecture 主 couchdb 需要在用户之间共享数据 EG 如果 user 1 将数据写入云 则会复制到主服务器并返回到 user 2 和 u
  • 如何在一定时间后停止纹理滚动

    我下面有这段代码 只是用四边形制作滚动背景 我的问题是如何在一段时间后停止背景的滚动 例如 我希望在到达滚动图像的末尾后 将最后一个可见的部分锁定为关卡其余部分的背景 由于我的播放器速度恒定 我想象这样的事情 大约 20 秒后 停止滚动并保
  • 将 git 子树移动到不同的存储库中

    我尝试将目录及其所有历史记录从存储库移动到另一个存储库 提取目录的完整历史记录很容易git subtree split 这将创建一个新分支 可以轻松地将其提取到其他存储库 现在我用了git subtree add将目录粘贴回第二个存储库 如
  • 谷歌 reCaptcha - [“缺少输入响应”,“缺少输入秘密”]

    我从 Google API 对 ReCaptcha RequestMethod Post php 进行了一些更改 class Post implements RequestMethod URL to which requests are P
  • Django allauth 不发送 https 链接

    我希望 Django Allauth 发送确认电子邮件或重置密码等链接https 像这样的事情 https example com ca accounts confirm email picuwfpjpptjswi50x5zb4gtsqpt
  • phpmyadmin:MySQL 的表行计数不正确

    我有一个表 根据 phpmyadmin 的行数约为 76 000 行 显示行 0 99 总共约 76 853 行 查询花费了 0 0322 秒 然而 当尝试在 4950 个条目后从 phpmyadmin 浏览时 我得到空结果 没有显示任何内
  • 如何为 Linux:KDE、Gnome 等设置应用程序的桌面图标?

    我有一个可以在 Windows Linux 和 Macintosh 上运行的跨平台程序 我的 Windows 版本有一个图标 但我不知道如何为我的 Linux 版本制作一个图标 KDE Gnome 等有标准格式吗 还是我必须为每一种格式做一
  • 为什么使用“using 指令”时 ADL 不起作用?

    这是一个类似的问题 https stackoverflow com questions 24384020 why does the compiler stops the name lookup on overloads 但是在这个问题中它有
  • 如何排除私有标头出现在源浏览器中?

    我已经设定SOURCE BROWSER NO and VERBATIM HEADERS YES因为我希望客户端能够看到头文件 但是 我只想让他们看到某些标题 最好的方法是如何做到这一点 预先感谢您的任何帮助 EDIT 这似乎可行 但我对其他
  • 使用 CMake 的详细 NMake Makefile

    我一直遵循常见问题解答中的说明 是否可以选择生成更多 详细 编译 http www cmake org Wiki CMake FAQ Is there an option to produce more 27verbose 27 compi
  • Angular 和 p5.js - p5.loadSound 不是函数

    当我想在我的 Angular 项目中使用 p5 js 时遇到问题 我使用 Angular CLI 将 p5 js 包含在我的 angular cli json file scripts node modules p5 lib p5 min
  • Django 模型中的隐藏字段

    不久前我做了一个模型类 我为它制作了几个 ModelForm 效果非常好 我最近不得不向其中添加另一个可选 blank True null True 字段 以便我们可以存储用户之间的一些关系数据 它本质上是一个推荐系统 问题是添加这个新字段
  • 为什么在 TestNG 中 @DataProvider 注解在 @BeforeClass 之前运行?

    Using TestNG http testng org 为什么 DataProvider之前运行 BeforeClass 似乎有时 DataProvider之前运行 BeforeClass有时不是 有谁知道原因吗 这就是今天的实施方式 这
  • 使用 php 将文件上传到网站

    我是 php 新手 我正在尝试从这里修改代码 http www w3schools com php php file upload asp http www w3schools com php php file upload asp文件上传
  • 打开chm文件目录的特定部分c#或vb.net

    我有一个名为 help 的 chm 文件 在该文件中我有一个如下结构 Introduction item1 item2 Topic1 item1 item2 Topic2 item1 item2 Topic3 现在我想在 c 或 vb ne
  • 我在哪里可以获得 OpenJDK (Windows) 的预构建 JavaFX 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 Windows 上进行开发 并用 OpenJDK 替换了 Oracle JDK 我注意到 Ope
  • 使用 pandas 绘图时,图例仅显示一个标签

    我有两个 Pandas DataFrame 我希望将它们绘制成单个图形 我正在使用 IPython 笔记本 我希望图例显示两个 DataFrame 的标签 但到目前为止我只能显示后一个 此外 任何关于如何以更合理的方式编写代码的建议将不胜感