Проблема с линиями сетки при изменении графика в виджете 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_()