我在对齐两个不同 y 轴的刻度时遇到一些问题,第一个轴的刻度为线性范围,第二个轴的刻度为非线性范围,如下图所示。
HS, TMN = np.meshgrid(hs, period)
r = function(HS, TMN)
cax = plt.contourf(HS, TMN, np.log10(HS), cmap=plt.cm.RdYlGn_r)
ax = plt.gca()
ax2 = ax.twinx()
ticks2 = get_y2values(ax.get_yticks()) # Non linear function
ax2.yaxis.set_major_locator(mpl.ticker.FixedLocator(ticks))
ax2.set_ylim([0, 700])
ax.grid()
ax.set_ylabel('Y1', fontsize=14)
ax2.set_ylabel('Y2', fontsize=14)
plt.show()
更准确地说,右轴需要与左轴不同的比例。作为最终结果,想法是将左侧的刻度值与右侧的刻度值对齐(由于下面描述的非线性函数)。例如:Y1 中的值 8.08 与 101.5 对齐; 16.07 与 309.5 对齐...
需要新比例才能在新比例中插入新图。
最佳答案
正如评论中所建议的,新尺度的定义非常有效。
引用以下link中定义的SegmentedScale
,对我有用的代码如下:
hs = np.linspace(0.1, 15, 1000) # [meters]
period = np.linspace(0.1, 35, 1000) # [seconds]
HS, TMN = np.meshgrid(hs, period)
cax = plt.contourf(HS, TMN, np.log10(HS), cmap=plt.cm.RdYlGn_r)
ax1 = plt.gca()
ax2 = ax.twinx()
ticks = get_y2values(ax1.get_yticks()) # Non linear function
ax2.set_yscale('segmented', points=ticks)
ax1.grid()
ax1.set_yticks(ax1.get_yticks())
ax2.set_yticks(ticks)
ax1.set_ylabel('Y1', fontsize=14)
ax2.set_ylabel('Y2', fontsize=14)
plt.show()
如果需要在ax2
轴上添加新绘图,则需要在应用新的自定义比例之前进行绘图。
关于python - 使用非线性刻度将 twinx 与第二轴对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49874482/