我希望你们中的一个能够提供帮助。我有一个带有一个y轴值和一个对应于这些y值的x轴的图。我想在图的右侧添加第二个y轴。出现在第二个y轴上的值是通过第一个y轴值通过某种关系确定的:例如,y2可能是y2 = y1**2 - 100。如何使第二个y轴的值由y1值确定,以便y2值正确地与y轴上的y1值对齐?
可以通过创建双轴来添加第二个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()
Run Code Online (Sandbox Code Playgroud)
从matplotlib 3.1开始,您可以使用secondary_yaxis。这样可以自动同步限制。作为输入,需要转换函数及其逆函数。
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()
Run Code Online (Sandbox Code Playgroud)
输出与上面相同,但是您可以看到不需要设置任何限制。