将twinx与第二轴对齐,非线性刻度

时间:2018-04-17 09:27:58

标签: python matplotlib

我在两个不同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()

Example of the result obtained

更确切地说,右轴需要与左侧不同的刻度。并且作为最终结果,想法是让左边的刻度值与右边的刻度值对齐(由于下面描述的非线性函数)。例如:Y1的值8.08与101.5对齐; 16.07与309.5 ...

对齐

为了在新比例中插入新图,需要新比例。

Function relating y1 with y2

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,新规模的定义非常有效。 参考以下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()

enter image description here

如果需要在ax2轴上添加新图,则需要在应用新的自定义比例之前进行绘图。