多个y轴刻度,但仅一个可用于平移和缩放

7 投票
2 回答
2070 浏览
提问于 2025-04-17 18:27

考虑以下用于绘制matplotlib图形的Python代码:

import matplotlib.pylab as pp
import numpy as np

alpha = np.linspace(0, 2 * np.pi, 400)
sig1 = np.sin(alpha)
sig2 = np.sin(2 * alpha) + 2 * (alpha > np.pi)

ax1 = pp.subplot(111)
ax2 = ax1.twinx()

ax1.plot(alpha, sig1, color='b')
ax2.plot(alpha, sig2, color='r')
ax1.set_ylabel('sig1 value', color='b')
ax2.set_ylabel('sig2 value', color='r')
pp.grid()
pp.show()

这段代码给我生成了一个漂亮的图表。

在这里输入图片描述

我想知道如何禁用其中一个坐标轴的平移/缩放功能,这样当我使用平移/缩放工具时,只有ax2会重新缩放。例如,有没有办法做到这一点?我想通过编程的方式来实现。

2 个回答

0

这是一个稍微复杂一点的例子,里面有两个绘图区域和三个竖直的坐标轴。只有下方子图的公共横坐标轴和左侧竖坐标轴是可以互动的。

fig, ax_left = plt.subplots()
ax_right = ax_left.twinx()
ax_status = make_axes_locatable(ax_left).append_axes('top', size=1.2, pad=0., sharex=ax_left)
ax_status.xaxis.set_tick_params(labelbottom=False)
ax_right.set_navigate(False)
ax_status.set_navigate(False)

在我根据ali_m的回答添加了set_navigate(False)之前,下方图的两个竖坐标轴在你用鼠标上下拖动的时候都会受到影响,而状态轴则没有受到影响,这本来是应该的,但只在第一次拖动鼠标后才会这样。第一次拖动鼠标时,所有的坐标轴都会受到影响。这看起来像是matplotlib中的一个bug,已经被报告为#12613。

7

你可以通过使用 ax2.set_navigate(False) 来实现这个功能:

from matplotlib.pyplot import *
import numpy as np

fig,ax1 = subplots(1,1)
ax2 = ax1.twinx()
ax2.set_navigate(False)
x = np.linspace(0,2*np.pi,100)
ax1.plot(x,np.sin(x),'b')
ax1.set_xlabel('Scaleable axis')
ax1.set_ylabel('Scaleable axis')
ax2.plot(x,np.sin(x+1),'r')
ax2.set_ylabel('Static axis',weight='bold')

撰写回答