如何将matplotlib ax range设置为正数并围绕证书值镜像

2024-04-20 08:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python2.7下用matplotlib2.0绘制一个数据和函数。你知道吗

函数的x值是随时间而变化的,x先减小到某个值,然后再增大。你知道吗

如果函数是按时间绘制的,则它显示的函数类似于此数据按时间绘制的函数

plot of data against time

我需要同样的x轴演化来绘制真实的x值。不幸的是,由于前后两部分的x值相同,所以这两个值混合在一起。这给了我错误的数据图:

enter image description here

在本例中,这意味着我需要x轴从值2.4开始,然后减小到1.0,然后再增加到2.4。我发誓我以前就发现这是可能的,但不幸的是我再也找不到任何线索了。你知道吗


Tags: 数据函数错误时间绘制线索本例
2条回答

一种选择是使用两个轴,并在每个轴上分别绘制两个时间跨度。你知道吗

例如,如果您有以下数据:

myX = np.linspace(1,2.4,100)
myY1 = -1*myX
myY2 = -0.5*myX-0.5
plt.plot(myX,myY, c='b')
plt.plot(myX,myY2, c='g')

enter image description here

相反,您可以创建两个子图,两个子图具有共享的y轴且两个轴之间没有间距,分别绘制每个时间跨度,最后调整其中一个x轴的限制以反转点的顺序

fig, (ax1,ax2) = plt.subplots(1,2, gridspec_kw={'wspace':0}, sharey=True)
ax1.plot(myX,myY1, c='b')
ax2.plot(myX,myY2, c='g')
ax1.set_xlim((2.4,1))
ax2.set_xlim((1,2.4))

enter image description here

默认情况下,matplotlib轴是线性增加的。更重要的是,必须有一个数线到轴单位的内射映射。因此,更改数据范围并不是一个真正的选择(至少在目标是保持简单的情况下是这样)。你知道吗

因此,最好保持原始数字,只更改轴上的记号和记号标签。例如,您可以使用FuncFormatter将原始数字映射到

np.abs(x-tp)+tp

其中tp将是转折点。你知道吗

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker

x = np.linspace(-10,20,151)
y = np.exp(-(x-5)**2/19.)

plt.plot(x,y)

tp = 5
fmt = lambda x,pos:"{:g}".format(np.abs(x-tp)+tp)
plt.gca().xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(fmt))

plt.show()

enter image description here

相关问题 更多 >