Повторное использование экземпляра базовой карты - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу обновить окно живой карты с информацией в реальном времени, используя бэкэнд Tkinter.График matplotlib Basemap содержит постоянные и временные объекты.

plt.pause () сохраняет окно рисунка и объекты открытыми при цикле.При построении следующих временных объектов они перекрывают старые.Отдельное удаление предыдущих временных функций не вариант.plt.clf () удаляет предыдущие временные элементы, но также и постоянные элементы на рисунке.Повторное создание постоянных объектов каждый раз занимает слишком много времени.

Чтобы повысить производительность, я хотел бы повторно использовать экземпляры базовой карты определенной точки кода (например, как обсуждалось здесь: https://github.com/matplotlib/basemap/issues/354). Однако удаление с помощью m = pickles.loads () не обновляет уже открытое окно, но каждый раз открывает новое окно. Что-то вроде plt.hold (True) не помогает.

Как назначитьБазовая карта не зарезервирована в уже открывшемся окне? Или есть другой способ обойти?

Вот упрощенная разбивка:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pickle
import datetime 

def plot_on_map(i): #points, splines, circles ...
    x,y =m(10*i,20)
    current_position = m.plot(x, y, color='red', marker='o', markersize=5)

#set re-usable Basemap
fig = plt.figure()
fig.canvas.set_window_title('Title')
m = Basemap(projection='mill',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
x,y =m(0,0)
m.plot(x, y, color='blue', marker='o', markersize=5) #some permanent features of the map

m_pkl = pickle.dumps(m)  #save object state before plotting temporary stuff on the map

i=0
while i<10: #re-use Basemap
    m = pickle.loads(m_pkl)  #unpickle pre-state 
    date = datetime.datetime.utcnow()
    #temporary features of the map:
    current_shade = m.nightshade(date)
    plot_on_map(i)
    plt.pause(0.05)
    i=i+1
    #plt.clf()#dismiss temporary features
...