为了账号安全,请及时绑定邮箱和手机立即绑定

当轴关系根据经验推导时,如何在matplotlib图中配置次轴?

当轴关系根据经验推导时,如何在matplotlib图中配置次轴?

翻翻过去那场雪 2022-09-06 21:07:50
我试图遵循这个文档https://matplotlib.org/3.1.0/gallery/subplots_axes_and_figures/secondary_axis.html在辅助轴变换的第三种情况下,即,当“我们希望将变换中的轴与数据临时的,并且是经验推导的”时,因此,将“正向和逆变换函数设置为从一个数据集到另一个数据集的线性插值”。但我无法取得令人满意的结果。例如,考虑本文档第一个示例的简单图:具有两个水平轴的正弦波,其中一个是同一图上弧度到度的转换。下面的代码波纹管给出了正确的结果,其中底部轴以弧度为单位,顶部轴以度为单位import matplotlib.pyplot as pltimport numpy as npfig, ax = plt.subplots(constrained_layout=True)x = np.linspace(0, 2*np.pi, 1000)y = np.sin(x)ax.plot(x, y)def deg2rad(x):    return x * np.pi / 180def rad2deg(x):    return x * 180 / np.pisecax = ax.secondary_xaxis('top', functions=(rad2deg,deg2rad))plt.show()但是,下面的代码试图模拟“度轴”将来自经验数据(数组变量,可能是其他值),但它没有给出正确的结果(遵循文档的插值函数)。xnewimport matplotlib.pyplot as pltimport numpy as npfig, ax = plt.subplots(constrained_layout=True)x = np.linspace(0, 2*np.pi, 1000)y = np.sin(x)ax.plot(x, y)xold = xxnew = x * 180 / np.pidef forward(x):    return np.interp(x, xold, xnew)def inverse(x):    return np.interp(x, xnew, xold)secax = ax.secondary_xaxis('top', functions=(forward,inverse))plt.show()我错过了什么?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

问题在于,对于略微超出给定 x 值范围的值,同时调用正向函数和反函数。例如,它们用于 xlims。(可以在这些函数中添加一个,看看它们是如何被调用的。print(x)


如果将这些函数编写为简单的线性变换(如示例中所示),则没有问题。该函数在其边界之外同样工作。但是 a 在其范围之外没有很好的线索,因此它返回其下限或上限。这种截止会导致不需要的蜱虫标签。deg2radnp.interp


对于零件,这可以通过设置紧密的x轴来补救,因此没有默认发生的填充:


plt.autoscale(enable=True, axis='x', tight=True)

但即便如此,400的不受欢迎的蜱虫也会弹出。


更好的解决方案是使两个函数的范围比旧 x 轴上显示的限制(包括填充)稍宽。例如,设置


xold = np.linspace(x[0]-0.5, x[-1]+0.5, 100)

xnew = xold * 180 / np.pi

请注意,在链接的示例中,他们设置了 ,但随后仅从第三个索引开始执行绘图,以便为填充创建足够的空间:。xold = np.arange(0, 11, 0.2)ax.plot(xold[3:], xnew[3:])


完整的示例可能如下所示:


import matplotlib.pyplot as plt

import numpy as np


fig, ax = plt.subplots(constrained_layout=True)

x = np.linspace(0, 2*np.pi, 1000)

y = np.sin(x)

ax.plot(x, y)


xold = np.linspace(x[0]-0.5, x[-1]+0.5, 100)

xnew = xold * 180 / np.pi


def forward(x):

    return np.interp(x, xold, xnew)


def inverse(x):

    return np.interp(x, xnew, xold)


secax = ax.secondary_xaxis('top', functions=(forward,inverse))


plt.show()

//img1.sycdn.imooc.com//6317465d000148e717640669.jpg

查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号