我有一张图显示x4与y:
y是其他变量的对数,例如q(即y = log(q)) q的值是外行人在阅读此图时将理解的内容。我想在图形的右侧设置一个辅助轴,其中线与左侧轴在相同的垂直位置,但是标签被等效的q值代替-即exp(y )-小数点后2位。
是否有一种有效的方法来创建辅助轴,该轴是否从主要y轴进行映射?
我正在使用pyplot
中的matplotlib
。一些示例起始代码:
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”。
谢谢
答案 0 :(得分:1)
您可以使用双轴。想法如下:
np.exp()
将其取整,将其舍入到小数点后两位。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()
答案 1 :(得分:1)
我在这里的建议是使用双轴并将其与原始轴共享以固定刻度位置。然后,您可以使用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()