底图实例重用

时间:2018-12-20 16:18:42

标签: python matplotlib window matplotlib-basemap reusability

我想使用Tkinter后端用实时信息更新实时地图窗口。 matplotlib底图图包含恒定特征和临时特征。

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

0 个答案:

没有答案