Проблема с линиями сетки при изменении графика в виджете Qt

Проблема

Я работаю над созданием графического интерфейса с использованием qtpy, где пользователь может переключать параметры карты. Некоторые из параметров, которые пользователь может переключать, - это границы страны, ширина и цвет линии, включение / выключение линий сетки и т. Д. В идеале я хотел бы настроить проекцию карты, а затем добавлять / удалять / изменять линии сетки по мере необходимости, однако Я не видел никакого реального способа сделать это, по крайней мере, тот, который работал бы, особенно когда дело доходит до обновленной ширины линий сетки, цветов и т. Д.

Итак, решение, которое я придумал, состоит в том, чтобы удалить предыдущий экземпляр оси и создать новый, когда будет запрошено изменение. Однако при вызове метода, я получаю следующую ошибку:

      Traceback (most recent call last):
  File "/home/kwodzicki/.pyenv/versions/3.8.1/lib/python3.8/site-packages/matplotlib/cbook/__init__.py", line 216, in process
    func(*args, **kwargs)
  File "/home/kwodzicki/.local/lib/python3.8/site-packages/cartopy/mpl/gridliner.py", line 366, in _draw_event
    self._update_labels_visibility(event.renderer)
  File "/home/kwodzicki/.local/lib/python3.8/site-packages/cartopy/mpl/gridliner.py", line 780, in _update_labels_visibility
    specs, _ = self._segment_angle_to_text_specs(angle, lonlat)
  File "/home/kwodzicki/.local/lib/python3.8/site-packages/cartopy/mpl/gridliner.py", line 713, in _segment_angle_to_text_specs
    transform = mtrans.offset_copy(
  File "/home/kwodzicki/.pyenv/versions/3.8.1/lib/python3.8/site-packages/matplotlib/transforms.py", line 2937, in offset_copy
    raise ValueError('For units of inches or points a fig kwarg is needed')

Эта ошибка возникает только при рисовании линий сетки. Если я не рисую линии сетки, удаление и перерисовка оси (и береговых линий) выполняется без ошибок. Также кажется, что новые линии сетки нарисованы правильно, но предыдущий экземпляр линий сетки подходит.

У меня вопрос, как лучше всего это сделать? Пропустил ли я способ обновить существующие веса линий сетки, цвета, метки и т. Д.? Или есть способ полностью удалить объект линии сетки?

Версии Python / пакета:

      python     = 3.8.1
qtpy       = 1.9.0
matplotlib = 3.1.3
cartopy    = 0.19.0.post1

MWE

      from qtpy.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout

import cartopy.crs as ccrs

from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure

class FigureWidget( FigureCanvas ):
  def __init__(self, figure = None):
    if figure is None: figure = Figure( figsize=(5, 3) )
    super().__init__( figure )
    self.axes      = None
    self.linewidth = 0 

  def replot(self, **kwargs):
    self.linewidth = (self.linewidth % 5) + 1
    print( f'Linewidth : {self.linewidth}' )

    if self.axes: self.axes.remove()                                            # If axis exists already, remove it

    proj            = getattr(ccrs, 'Orthographic')
    self.axes       = self.figure.add_subplot( projection = proj( ) )
    self.coastlines = self.axes.coastlines( linewidth = self.linewidth )
    self.gridlines  = self.axes.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)

    self.draw()

class BaseMap( QMainWindow ):

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

    self.midRow = self._initMidRow()
    self._main  = QWidget()

    layout = QVBoxLayout(self._main)
    layout.addWidget( self.midRow )

    self.setCentralWidget(self._main)

    self.show()

  def _initMidRow( self ):
    self.figure = FigureWidget()
    self.figure.replot( )

    self.button = QPushButton('Replot')
    self.button.clicked.connect( self.figure.replot )                           # Call figure replot command when button is pushed
    
    layout    = QVBoxLayout()
    layout.addWidget( self.figure )
    layout.addWidget( self.button )

    widget = QWidget()
    widget.setLayout( layout )

    return widget

if __name__ == "__main__":
  import sys
  app = QApplication( sys.argv )
  inst = BaseMap()
  app.exec_()

0 ответов

Другие вопросы по тегам