Matplotlib 添加与第一个y轴相关的第二个y轴

Matplotlib 添加与第一个y轴相关的第二个y轴,matplotlib,plot,Matplotlib,Plot,我希望你们中的一位能帮忙。我有一个绘图,其中一个y轴值和一个x轴对应于这些y轴值。我想在绘图的右侧添加第二个y轴。将出现在第二个y轴上的值通过某些关系通过第一个y轴值确定:例如,y2可能是y2=y1**2-100。如何制作第二个y轴,其值由y1值确定,以便y2值与y轴上的y1值正确对齐?twin axis 可以通过创建双轴来添加第二个y轴,ax2=ax.twinx()。 此轴的比例可以使用其限制来设置,ax2.set_ylim(y2min,y2max)。y2min,y2max的值可以使用左轴极限

我希望你们中的一位能帮忙。我有一个绘图,其中一个y轴值和一个x轴对应于这些y轴值。我想在绘图的右侧添加第二个y轴。将出现在第二个y轴上的值通过某些关系通过第一个y轴值确定:例如,y2可能是
y2=y1**2-100
。如何制作第二个y轴,其值由y1值确定,以便y2值与y轴上的y1值正确对齐?

twin axis 可以通过创建双轴来添加第二个y轴,
ax2=ax.twinx()
。 此轴的比例可以使用其限制来设置,
ax2.set_ylim(y2min,y2max)
y2min,y2max
的值可以使用左轴极限的一些已知关系(例如,作为函数实现)来计算

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

x = np.linspace(0,50,101)
y = np.cumsum(np.random.normal(size=len(x)))+20.

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

ax.plot(x,y, color="#dd0011")
ax.set_ylabel("Temperature [Celsius]")
ax2.set_ylabel("Temperature [Fahrenheit]")

# set twin scale (convert degree celsius to fahrenheit)
T_f = lambda T_c: T_c*1.8 + 32.
# get left axis limits
ymin, ymax = ax.get_ylim()
# apply function and set transformed values to right axis limits
ax2.set_ylim((T_f(ymin),T_f(ymax)))
# set an invisible artist to twin axes 
# to prevent falling back to initial values on rescale events
ax2.plot([],[])

plt.show()

次轴 从matplotlib 3.1开始,可以使用
辅助轴
。这将自动同步限制。作为输入,需要转换函数及其逆函数

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

x = np.linspace(0,50,101)
y = np.cumsum(np.random.normal(size=len(x)))+20.

# Convert celsius to Fahrenheit
T_f = lambda T_c: T_c*1.8 + 32.
# Convert Fahrenheit to Celsius
T_c = lambda T_f: (T_f - 32.)/1.8

fig, ax = plt.subplots()
ax2 = ax.secondary_yaxis("right", functions=(T_f, T_c))

ax.plot(x,y, color="#dd0011")
ax.set_ylabel("Temperature [Celsius]")
ax2.set_ylabel("Temperature [Fahrenheit]")

plt.show()

输出与上述相同,但正如您所见,不需要设置任何限制。

如@ImportanceOfBeingErnest in所回答的,可以自动将双轴与
ax同步。获取共享的y轴()。连接(ax,ax2)
@PierreH。该注释令人困惑,因为在这里的两个选项中,您都不想共享任何轴。您是对的,我忘了提到,只有在第二个轴使用函数格式设置器显示转换值时,共享比例才有意义。特别是对于答案的第一个示例,这将添加
ax2.yaxis.set\u major\u格式化程序(FuncFormatter(lambda x,pos:f“{T\u f(x):g}”)
@PierreH。我认为这是最不理想的,因为它会创建奇数标签,例如,在这种情况下,标签将是68、77、86。然而,如果你认为有这样的用例,你可以在这里免费提供另一个答案和完整的代码,因为人们可能不会从这些评论中理解它。事实上,我对我正在处理的一个个人用例有偏见。对于°C/°F标度或原始问题的示例(
y2=y1**2-100
),我提出的建议毫无意义。对不起,吵闹了。