Matplotlib - 可以用寄生轴制作子图吗?

2024-05-18

我正在尝试制作一个包含两个子图的图表,每个子图都有一个寄生轴,如文档中所示here https://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html。然而,虽然我可以用单个图复制该示例,但它似乎不适用于 2 个子图。 Matplotlib 是否有能力做到这一点?

这是我的代码:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

host = host_subplot(111, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

plt.subplot(2,1,1)

par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par2,
                                    offset=(offset, 0))

par1.axis["right"].toggle(all=True)
par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())

#####2#####
plt.subplot(2,1,2)
par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par2,
                                    offset=(offset, 0))

par1.axis["right"].toggle(all=True)
par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())    


plt.draw()
plt.show()

当我运行它时,我最终得到一组空白的子图:

抱歉,如果我做了一些愚蠢的事情!

多谢, 亚历克斯


你在那里犯了一些小错误。首先plt.subplot()命令覆盖你的host_subplot()命令(参见matplotlib.pyplot.subplot() 文档中的注释 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html:“创建子图将删除任何与其重叠且超出共享边界的现有子图”)。此外,您必须分别跟踪两个图的实例。我像这样解决了我创建的问题host1, par11, and par12为了第一Axes and host2, par21, and par22第二个Axes。整个代码现在看起来像这样:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

fig = plt.figure()

host1 = host_subplot(211, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

par11 = host1.twinx()
par12 = host1.twinx()

offset = 60
new_fixed_axis = par12.get_grid_helper().new_fixed_axis
par12.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par12,
                                    offset=(offset, 0))

par11.axis["right"].toggle(all=True)
par12.axis["right"].toggle(all=True)

host1.set_xlim(0, 2)
host1.set_ylim(0, 2)

host1.set_xlabel("Distance")
host1.set_ylabel("Density")
par11.set_ylabel("Temperature")
par12.set_ylabel("Velocity")

p1, = host1.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par11.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par12.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par11.set_ylim(0, 4)
par12.set_ylim(1, 65)

host1.legend()

host1.axis["left"].label.set_color(p1.get_color())
par11.axis["right"].label.set_color(p2.get_color())
par12.axis["right"].label.set_color(p3.get_color())

#####2#####
host2 = host_subplot(212, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)
par21 = host2.twinx()
par22 = host2.twinx()

offset = 60
new_fixed_axis = par22.get_grid_helper().new_fixed_axis
par22.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par22,
                                    offset=(offset, 0))

par21.axis["right"].toggle(all=True)
par22.axis["right"].toggle(all=True)

host2.set_xlim(0, 2)
host2.set_ylim(0, 2)

host2.set_xlabel("Distance")
host2.set_ylabel("Density")
par21.set_ylabel("Temperature")
par22.set_ylabel("Velocity")

p1, = host2.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par21.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par22.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par21.set_ylim(0, 4)
par22.set_ylim(1, 65)

host2.legend()

host2.axis["left"].label.set_color(p1.get_color())
par21.axis["right"].label.set_color(p2.get_color())
par22.axis["right"].label.set_color(p3.get_color())    

fig.tight_layout()

plt.draw()
plt.show()

这是结果:

希望这可以帮助。

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

Matplotlib - 可以用寄生轴制作子图吗? 的相关文章

随机推荐

  • 使 .net web api 队列请求以“单线程”方式运行

    我们有一个 c net Web API 服务调用代码 该代码无法一次处理多个数据库请求 该系统适用于需求相对较小的账单在线支付 我们无法控制代码来进行可以解决问题的更改 另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • Inc 函数 Inno Setup

    这可能非常简单 但是当我尝试编译包含以下内容的程序时 Inc Count 在 Inno Setup 中我不断得到 未知标识符 Inc 我相信这就是在 Pascal 中递增整数的方式 并且对如何继续这里感到困惑 我正在使用 Inno Setu
  • Rails 资源单数还是复数?

    我有一条搜索路线 我想将其设为单数 但是当我指定单数路线时 它仍然会生成复数控制器路线 这是应该的样子吗 resource search Gives me search POST search format action gt create
  • 在 Windows 7 中使用 ActivePerl @ARGV 为空

    我有以下 Perl 脚本 我正在尝试使用 ActivePerl 在 Windows 7 中运行它 c Perl64 bin perl exe w use strict my mp3splt exe c Program Files x86 m
  • 为 PostgreSQL 查询选择正确的索引

    简化表 CREATE TABLE products product no integer PRIMARY KEY sales integer status varchar 16 category varchar 16 CREATE INDE
  • 如何在 Swift 中获取字典中最后输入的值?

    如何获取 Swift 字典中最后输入的值 例如 我如何从下面获取值 CCC var dictionary Dictionary
  • Eslint 从另一个文件确定全局变量

    我试图以这样的方式设置 ESLint 使其在对实际目标文件进行 linting 之前解析全局声明文件 这样我就不必将所有确实是全局的函数和变量声明为全局 而是让解析器弄清楚 In 一些 模块 js function do something
  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但
  • Python-将标题写入csv

    目前我正在用 python 编写查询 将数据从 oracle dbo 导出到 csv 文件 我不知道如何在文件中写入标题 try connection cx Oracle connect user pass tns name cursor
  • 在真实设备上展示测试广告

    这是我的代码 let request GADRequest request testDevices kGADSimulatorID XXXX2F32d69CCA859FFB559D0FEA3CF6483D08A6 adView load r
  • Python最大递归,关于sys.setrecursionlimit()的问题

    我有一个问题sys setrecursionlimit 来自蟒蛇docs https docs python org 2 library sys html sys setrecursionlimit这个函数 将Python解释器堆栈的最大深
  • Pyqt5 中的 QThreads:这是官方 QThread 文档的正确 C++ 到 Python 翻译吗?

    关于如何实例化和使用的官方文档QThread可以在这里找到 http doc qt io qt 5 qthread html http doc qt io qt 5 qthread html 该文档描述了两种基本方法 1 工作对象方法和 2
  • 如何将 tf.contrib.seq2seq.Helper 用于非嵌入数据?

    我正在尝试使用 tf contrib seq2seq 模块对某些数据 仅 float32 向量 进行预测 但我使用 TensorFlow 中的 seq2seq 模块找到的所有示例都用于翻译 因此用于嵌入 我正在努力准确理解 tf contr
  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 无法连接到 macOS 上的 Docker 守护进程

    我通常更喜欢使用brew 来管理我的OSX 上的应用程序 我能够安装 docker docker compose 和 docker machine docker version Docker version 17 05 0 ce build
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • 在 jQuery .live() 方法中模拟“焦点”和“模糊”

    Update 从 jQuery 1 4 开始 live 现在支持focusin and focusout events jQuery http www jquery com currently1 doesn t support blur o
  • Matplotlib - 可以用寄生轴制作子图吗?

    我正在尝试制作一个包含两个子图的图表 每个子图都有一个寄生轴 如文档中所示here https matplotlib org examples axes grid demo parasite axes2 html 然而 虽然我可以用单个图复