如何在matplotlib中的两个子图之间反向共享x轴?

toiithl6  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(132)

我想显示一个对象的两个不同的解剖视图,前视图和后视图,我希望这两个视图之间的坐标保持一致,同时还显示您自然看到的视图。这意味着X轴应该在前视图中向右增加,在后视图中向左增加。
我希望导航操作(平移、缩放)同时影响两个视图。例如,如果我在前视图中缩放主体的左肩(位于图像的右侧),我希望后视图也缩放左肩(位于图像的左侧)。
通常,这是通过共享sharexsharey参数来实现的。但是,正如我所说的,我希望第二个子情节中的X轴(并且只有X轴)被反转,并且该选项强制两个子情节上的限制以相同的方式进行。
有没有办法做到这一点?

ohtdti5x

ohtdti5x1#

好吧,它看起来不像是已经实现了我试图实现的特定功能,所以经过一点修补,这是我能够想出的最简单的。
我正在将其集成到Qt应用程序中,并且已经修改了导航工具栏,隐藏了一些操作并更改了一些快捷方式。最后我做的是从我的自定义导航工具栏类中覆盖以下方法:

class CustomNavigationToolbar(NavigationToolbar):
    ...

    def release_zoom(self, event) -> None:
        zoom_axes = self._zoom_info.axes[0]
        other_axes = [a for a in self.canvas.figure.get_axes() if a != zoom_axes][0]
        super().release_zoom(event)
        other_axes.set_ylim(zoom_axes.get_ylim())
        other_axes.set_xlim(reversed(zoom_axes.get_xlim()))
        self.canvas.draw_idle()

    def drag_pan(self, event) -> None:
        pan_axes = self._pan_info.axes[0]
        other_axes = [a for a in self.canvas.figure.get_axes() if a != pan_axes][0]
        super().drag_pan(event)
        other_axes.set_ylim(pan_axes.get_ylim())
        other_axes.set_xlim(reversed(pan_axes.get_xlim()))
        self.canvas.draw_idle()

对于缩放操作,当鼠标按钮被释放时,视图被更新(release_zoom方法),所以我首先获得其他轴,在调用super()之后,我基于缩放的轴更新X和Y限制。平移操作也是如此,但这是在拖动鼠标时更新的(drag_pan方法)。
请注意,这适用于我的用例,因为我保证只有两个轴,但适应两个以上的轴并不困难。

相关问题