python - 使用非线性刻度将 twinx 与第二轴对齐

标签 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

最佳答案

正如评论中所建议的,新尺度的定义非常有效。 引用以下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轴上添加新绘图,则需要在应用新的自定义比例之前进行绘图。

关于python - 使用非线性刻度将 twinx 与第二轴对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49874482/

相关文章:

python - 在指定时间内查找所有排列匹配

python - pandas 按多个值过滤列值

python - 使用 matplotlib 在 x 轴上绘制 datetimeindex 在 pandas 0.15 和 0.14 中创建错误的刻度

python - 如何向箱线图异常值添加注释

python绘制3D彩色 map

python - 如何将 "stdout"重定向到 Label 小部件?

python - 在 Python 中实现深度优先树迭代器

python - 链接 mysql 和 django 时出错

python - plt.show() 不显示数据,而是将其保留用于下一个图(spyder)

python - Matplotlib:外部图例,分布在多个子图中