簡體   English   中英

如何在 matplotlib 中的兩個子圖之間反向共享 x 軸?

[英]How to share the x axis in reverse between two subplots in matplotlib?

我想展示一個主題的兩個不同解剖視圖,正面和背面,我希望兩者之間的坐標保持一致,同時還顯示它們,就像您自然看到的那樣。 這意味着 X 軸應該在前視圖中向右增加,在后視圖中向左增加。

我希望導航操作(平移、縮放)同時影響兩個視圖。 例如,如果我在前視圖中放大對象的左肩(位於圖像的右側),我希望后視圖也放大左肩(位於圖像的左側)圖片的一側)。

通常這是通過與sharexsharey參數共享軸來實現的。 然而,正如我所說,我希望第二個子圖中的 X 軸(並且只有 X 軸)被反轉,並且該選項以相同的方式將兩個子圖中的限制強制為 go。

有什么辦法可以做到這一點?

好吧,似乎沒有針對我要實現的目標已經實現的特定功能,所以經過一些修改之后,這是我能夠想到的最簡單的功能。

我將其集成到一個 Qt 應用程序中,我已經修改了導航工具欄以隱藏一些操作並更改一些快捷方式。 我最終做的是從我的自定義導航工具欄 class 覆蓋以下方法:

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方法)。

請注意,這適用於我的用例,因為我保證只有兩個軸,但適應兩個以上的軸並不困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM