Matplotlib: 次要轴,其值从主要轴映射

2024-09-27 04:25:10 发布

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

我有一个图表显示了x4和y: graph

y是其他变量的对数,比如q(即y=log(q)) q的值是外行在阅读这张图时能理解的。在

我想在图形的右侧设置一个辅助轴,其中的直线与左侧的轴处于相同的垂直位置,但是标签被替换为相等的q值-即exp(y)-小数点后2位。在

有没有一种有效的方法来创建从主y轴映射的次轴?在

我正在使用来自matplotlibpyplot。一些起始代码示例:

import numpy as np
import matplotlib.pyplot as plt

q = np.random.rand(100,)
y = np.log(q)
x4 = np.random.rand(100,)

plt.scatter(x4, y)

我想添加第二个轴,它与主轴具有相同的垂直位置和间距,但是标签被exp(y)替换。还包括轴标签“q”。在

谢谢你


Tags: importlog图形matplotlibasnp图表对数
2条回答

你可以用双轴。想法如下:

  • 创建一个双轴并在两个轴上绘制相同的数据。这将确保两个y轴上的记号位置是轴限制相同的。在
  • 获取字符串形式的刻度标签,将它们转换为整数,并使用np.exp()将它们四舍五入到小数点后2位。在
  • 将新标签指定给右侧y轴
  • 您还需要确保两个轴的刻度数和范围与@ImportanceOfBeingEarnest在下面的注释中建议的一样

import numpy as np; np.random.seed(123)
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

q = np.random.rand(100,)
y = np.log(q)
x4 = np.random.rand(100,)

ax.scatter(x4, y)
ax.set_xlabel('x4', fontsize=16)
ax.set_ylabel('y', fontsize=16)

ax2 = ax.twinx()
ax2.scatter(x4, y)

ax2.set_yticks(ax.get_yticks())
ax2.set_ylim(ax.get_ylim())
fig.canvas.draw()

labels = [int(i.get_text()[1:-1]) for i in ax2.get_yticklabels()]
labels_new = [np.round(np.exp(i), 2) for i in labels]

ax2.set_yticklabels(labels_new);
ax2.set_ylabel('q', fontsize=16)
plt.show()

enter image description here

我在这里的建议是使用一个双轴,并分享它将原来的轴,以固定滴答位置。然后您可以使用FuncFormatter来给记号加上正确的标签。这样做的好处是,您不需要事先确定绘图的限制,并且可以在绘图内自由缩放和平移。在

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


f = lambda q: np.log(q)
finv = lambda x: np.exp(x)

x = np.random.rand(100,)
y = f(np.random.rand(100,))


fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.get_shared_y_axes().join(ax,ax2)

ax.scatter(x, y)

ax2.yaxis.set_major_formatter(FuncFormatter(lambda x,pos: f"{finv(x):.2f}"))
plt.show()

enter image description here

相关问题 更多 >

    热门问题