Matplotlib Python程序中缩放时重置数据范围异常问题求助
Matplotlib Python程序中缩放时重置数据范围异常问题求助
大家好,我最近开发了一个用来显示高采样率剖面数据的Python程序,遇到了一些棘手的问题,想向各位请教。
背景说明
我处理的是6个通道的数据:mag[0..2] 和 diff[0..2],采样率达到30kHz。我把它们分成3组剖面展示,每组对应mag[i]和diff[i],所有图表共享同一个x轴(nptime,是numpy的datetime64类型),mag和diff通道使用不同的y轴刻度范围。
为了提升显示速度,我会根据x轴的显示窗口对数据进行切片,还会根据x轴的跨度选择1、10或100的降采样率。这个逻辑是绑定在第0个轴的xlim_changed事件回调里的,大体逻辑能跑通,但在设置y轴范围时出了问题。
具体问题
- mag通道的异常:3个mag面板里,有2个能正确把y轴范围设置为当前窗口数据的范围(额外加了10%的余量),但我刚才进行缩放操作的那个面板,y轴范围始终停留在缩放框的范围,不会更新为新计算的数据范围。
- diff通道的异常:我设置了
ax[3]到ax[5]共享y轴,所以只需要设置ax[3]的y轴范围即可,但set_ylim完全被忽略了!不管怎么操作,diff通道的y轴范围始终是缩放时的范围,而我实际想要让它固定在self.min_diff到self.max_diff的固定值。
核心代码
def reset_data(self, ax): # the viewLim extents are decimal days, so some coordinate conversion is required width = ax.viewLim.width*86400 start=np.datetime64(pd.to_datetime(self.nptime[0]).date()) +np.timedelta64(int(ax.viewLim.min[0]%1*8.64e10),'us') idx0 = self.find_nearest(self.nptime, start) end=np.datetime64(pd.to_datetime(self.nptime[0]).date()) +np.timedelta64(int(ax.viewLim.max[0]%1*8.64e10),'us') idx1 = self.find_nearest(self.nptime[idx0:], end) + idx0 # the get_rate function returns 1 of 3 desample factors 1, 10 or 100 rate = self.get_rate(width) xdata = self.nptime[idx0:idx1:rate] for i in range(3): ydata = self.mag[i, idx0:idx1:rate] ymin = ydata.min() ymax = ydata.max() diff = (ymax - ymin)*.1 # self.lines is an array of the plots returned by self.ax[].plot() self.lines[i][0].set_data(xdata,ydata) self.ax[i].set_ylim(ymin-diff, ymax+diff) for i in range(3): ydata = self.diff[i, idx0:idx1:rate] self.lines[i+3][0].set_data(xdata,ydata) self.ax[3].set_ylim(self.min_diff, self.max_diff)
现象展示
缩放前:[缩放前效果示意图]
缩放后:[缩放后效果示意图]
缩放后可以看到:
- mag(蓝色)通道的第2、3个面板y轴范围是数据范围加10%的余量,但我缩放的第1个面板还是保持缩放框的范围;
- 粉色的diff通道三个面板的y轴范围都是7.5到27(缩放操作的范围),完全不是我设置的固定值。
抱歉内容有点长,但实在没法更简洁地描述清楚问题了,希望能得到大家的帮助!
内容来源于stack exchange
相关产品推荐
相关产品推荐

