自定义Matplotlib缩放:日志(Ln(x))

自定义Matplotlib缩放:日志(Ln(x)),plot,matplotlib,scale,Plot,Matplotlib,Scale,我有以下情况:我有一个有两个y轴的图,左边的是对数标度,显示了数量yx。x在x轴上是线性的。在第二个y轴上,我需要一个与第一个轴上绘制的值相同的附加自然对数刻度。假设在第一个y轴上有以下记号: 然后在第二个y轴上,我会有一个介于 exp(10^0) exp(10^1) exp(10^2) 使用此代码,我成功地正确设置了第二个轴的限制。但是,由于标度不同于对数,因此两者之间的值以错误的方式放置。由于Exp101 2是非常大的,所以Exp10^ 1和Exp10^ 0的刻度在轴的底部非常接近,而

我有以下情况:我有一个有两个y轴的图,左边的是对数标度,显示了数量yx。x在x轴上是线性的。在第二个y轴上,我需要一个与第一个轴上绘制的值相同的附加自然对数刻度。假设在第一个y轴上有以下记号:

然后在第二个y轴上,我会有一个介于

exp(10^0)  exp(10^1)  exp(10^2)
使用此代码,我成功地正确设置了第二个轴的限制。但是,由于标度不同于对数,因此两者之间的值以错误的方式放置。由于Exp101 2是非常大的,所以Exp10^ 1和Exp10^ 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()
生成的图片如下所示:


如您所见,上下轴限制在左右比例上匹配,而中点不匹配,因为右轴上的比例不同。虽然我最终为我的图片手动设置了所需的刻度,但如果有一个简单的解决方案,那就太好了。当y是左轴上的记号时,转换函数只是expy。

您可能需要尝试使用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_ylimax1.get_ylim行。 上面这句话看起来并不是什么乱七八糟的话,但它确实有一个缺点,即刻度数字的间距并不像您尝试这个方法时看到的那样好


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

您可能想尝试使用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_ylimax1.get_ylim行。 上面这句话看起来并不是什么乱七八糟的话,但它确实有一个缺点,即刻度数字的间距并不像您尝试这个方法时看到的那样好


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

你能发布示例代码和数字吗?除了自定义比例,我想不出其他任何方法。你可以发布示例代码和数字吗?除了自定义比例,我想不出其他任何方法