簡體   English   中英

縮放 cartopy plot 時更新緯度/經度軸

[英]Update lat/lon axes when zooming on cartopy plot

我在 cartopy 中繪制一些數據。 我希望能夠放大 map 的區域並更新緯度/經度軸以反映放大的區域。 相反,當我放大時,它們會完全消失。我該如何解決這個問題?

這是我生成軸的代碼

plt.figure()
ax = plt.axes(projection=cartopy.crs.PlateCarree())
ax.add_feature(cartopy.feature.LAND, edgecolor='black')
gl = ax.gridlines(crs=cartopy.crs.PlateCarree(), draw_labels=True,
                  linewidth=2, color='gray', alpha=0.5, linestyle='--')
# plot some stuff here

可以在交互模式下更新 cartopy 網格線,但您需要對 Navigation 工具欄進行子類化。

在下面的示例中,我使用了 PySide/QT5 示例代碼,它允許我替換子類工具欄,然后合並到 gridliner 示例代碼中。 每次使用 zoom/pan/home 時,重載的工具欄回調都會重新創建網格線。

我用過python3.8、matplotlib-3.4.2、cartopy-0.20

import sys
from PySide2 import QtWidgets
from PySide2.QtWidgets import QVBoxLayout

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import cartopy.crs as ccrs


class CustomNavigationToolbar(NavigationToolbar):
    toolitems = [t for t in NavigationToolbar.toolitems if t[0] in ('Home', 'Pan', 'Zoom', 'Save')]

    def __init__(self, canvas, parent, coordinates=True, func_recreate_gridlines=None):
        print('CustomNavigationToolbar::__init__')
        super(CustomNavigationToolbar, self).__init__(canvas, parent, coordinates)
        self.func_recreate_gridlines = func_recreate_gridlines

    def home(self, *args):
        print('CustomNavigationToolbar::home')
        super(CustomNavigationToolbar, self).home(*args)
        if self.func_recreate_gridlines is not None:
            self.func_recreate_gridlines()

    def release_pan(self, event):
        print('CustomNavigationToolbar::release_pan')
        super(CustomNavigationToolbar, self).release_pan(event)
        if self.func_recreate_gridlines is not None:
            self.func_recreate_gridlines()

    def release_zoom(self, event):
        print('CustomNavigationToolbar::release_zoom')
        super(CustomNavigationToolbar, self).release_zoom(event)
        if self.func_recreate_gridlines is not None:
            self.func_recreate_gridlines()


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        print('ApplicationWindow::__init__')
        super().__init__()

        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        self.layout = QVBoxLayout(self._main)

        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.toolbar = CustomNavigationToolbar(self.canvas, self,
                                               coordinates=True,
                                               func_recreate_gridlines=self.recreate_gridlines)
        self.layout.addWidget(self.canvas)
        self.addToolBar(self.toolbar)

        # figure setup taken from gridlines example at
        # https://scitools.org.uk/cartopy/docs/latest/matplotlib/gridliner.html
        projection = ccrs.RotatedPole(pole_longitude=120.0, pole_latitude=70.0)
        self.ax = self.canvas.figure.add_subplot(1, 1, 1, projection=projection)
        self.ax.set_extent([-6, 3, 48, 58], crs=ccrs.PlateCarree())
        self.ax.coastlines(resolution='10m')

        self._gl = None
        self.recreate_gridlines()

    def recreate_gridlines(self):
        print('ApplicationWindow::recreate_gridlines')

        print(' remove old gridliner artists')
        if self._gl is not None:
            for artist_coll in [self._gl.xline_artists, self._gl.yline_artists, self._gl.xlabel_artists, self._gl.ylabel_artists]:
                for a in artist_coll:
                    a.remove()
            self.ax._gridliners = []

        print(' self.ax.gridlines()')
        self._gl = self.ax.gridlines(crs=ccrs.PlateCarree(),
                                     draw_labels=True, dms=True, x_inline=False, y_inline=False)


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

暫無
暫無

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

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