2

我有以下情况:我有一个带有两个 y 轴的图,左边是对数刻度并显示 quantitiy y(x)x在 x 轴上是线性的。在第二个y轴上,我想要绘制在第一个轴上的相同值的附加自然对数刻度。y所以想象我在第一个轴上有以下刻度:

10^0       10^1       10^2

然后在第二个y轴上我会有一个比例

exp(10^0)  exp(10^1)  exp(10^2)

使用此示例中的代码,我设法正确设置了第二个轴的限制。但是,由于标度与对数不同,因此两者之间的值以错误的方式放置。由于exp(10^2)非常大, 和 的刻度exp(10^1)exp(10^0)轴的底部彼此非常接近,而10^1恰好位于第一个 y 轴的中间。

我想我可以使用自定义比例,但示例非常复杂,我认为可能有更简单的方法来做到这一点。如果没有,我仍然可以自己手动标记蜱虫,这是一个非常肮脏的解决方案。


一个例子:

#!/usr/bin/python2

from numpy import arange, exp
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = plt.twinx()
ax1.set_yscale("log")
ax2.set_yscale("log")
ax1.grid(True)

# the conversion
def time(energy):
    return exp(energy)

# the callback to adjust the limits
def update_ax2(ax1):
   y1, y2 = ax1.get_ylim()
   ax2.set_ylim(time(y1), time(y2))
   ax2.figure.canvas.draw()
ax1.callbacks.connect("ylim_changed", update_ax2)

# plot some function
xvals = arange(0,4,0.1)
ax1.plot(xvals, exp(xvals), '-')

plt.show()

生成的图片如下所示:

剧情

如您所见,上下轴限制在左右刻度上匹配,而中点不匹配,因为右轴上的缩放比例不同。虽然我最终为我的图片手动放置了所需的刻度,但如果有一个简单的解决方案来解决这个问题,那就太好了。转换函数就是exp(y),wheny是左轴上的勾号。

4

1 回答 1

0

您可能想尝试使用 FuncFormatter:


from matplotlib.ticker import FuncFormatter

...

def ticks2(y, pos):
    return '%1.1e' % exp(y)

xvals = arange(0,4,0.1)
ax1.plot(xvals, exp(xvals), '-')
ax2.set_ylim(ax1.get_ylim())
ax2.yaxis.set_major_formatter(FuncFormatter(ticks2))

plt.show()

请注意,我或多或少地绕过了您的回调,使用ax2.set_ylim(ax1.get_ylim()). 上面的内容似乎并不多,但它确实有一个缺点,即刻度数的间距不是很好(如果你尝试这个,你会看到)。

再说一次,我仍在试图弄清楚你试图在第二个 y 轴上绘制什么,以及以这种方式显示它是否真的有用(我看到提到了时间和能量,所以能量是什么,时间随着能量呈指数增长?)。但这是另一个问题。

于 2012-07-27T14:51:25.653 回答