Python 在鼠标悬停时使用绘图注释底图

Python 在鼠标悬停时使用绘图注释底图,python,matplotlib,event-handling,popup,matplotlib-basemap,Python,Matplotlib,Event Handling,Popup,Matplotlib Basemap,我正在用basemap绘制一幅欧洲地图,我试图让它尽可能地具有交互性。我想让这张地图显示一些选定国家的一些数据(例如:能源消耗),作为给定年份的颜色。如果我用鼠标在一个国家上空盘旋,我希望出现一个图,向我展示过去几年这种消费是如何演变的。我的问题是:如何用这样的图来注释底图。我已经找到了一种用文本(见下文)而不是用绘图进行注释的方法 以下是我迄今为止所取得的成就。首先,我生成底图 import numpy as np import matplotlib.pyplot as plt from mp

我正在用basemap绘制一幅欧洲地图,我试图让它尽可能地具有交互性。我想让这张地图显示一些选定国家的一些数据(例如:能源消耗),作为给定年份的颜色。如果我用鼠标在一个国家上空盘旋,我希望出现一个图,向我展示过去几年这种消费是如何演变的。我的问题是:如何用这样的图来注释底图。我已经找到了一种用文本(见下文)而不是用绘图进行注释的方法

以下是我迄今为止所取得的成就。首先,我生成底图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pandas as pd
import shapefile

from matplotlib.collections import PolyCollection
from matplotlib.patches import Polygon
from matplotlib import cm

%matplotlib nbagg

fig = plt.figure(figsize=(8,6.4))
ax = plt.subplot(111)

m = Basemap(projection='lcc', resolution='l', lat_0 = 50, lon_0 = 15, \
              llcrnrlon = -9, llcrnrlat = 32, urcrnrlon= 40, urcrnrlat = 63) 
请注意,为了仅为某些选定的国家/地区着色,我使用的形状文件不是来自basemap本身,而是来自。文件名为
ne\u 10m\u admin\u 0\u countries

sfile = 'ne_10m_admin_0_countries/ne_10m_admin_0_countries' 
m.readshapefile(sfile, 'areas', linewidth=0.1)  

shp = shapefile.Reader(sfile) 
shapes = shp.shapes() 
records = shp.records() 
请注意,我使用basemap绘制了所有国家,但我将在稍后的循环中为我感兴趣的国家着色。在进入该循环之前,我创建了一个列表,其中包含我绘制的国家的多边形面片以及链接到它们的注释

poly_with_annotation = []
数据可在数据框中找到,其中每列为不同的国家,每行为不同的年份。(这里,
dict_country
只是一本字典,其中包含了国家名称和要查看的形状文件记录之间的对应关系。这并不重要,基本上我们只绘制了感兴趣的国家。)

现在是重要的部分。我知道如何用文字注释它。以下是我所拥有的:

        lon0 = 10
        lat0 = 50
        annotation = ax.annotate(\
                                 "Mouse over country %s" % country, \
                                 xy=m(lon0,lat0), xycoords='data', \
                                 xytext=m(lon0+2,lat0+2), textcoords='data', \
                                 horizontalalignment="left", \
                                 bbox=dict(boxstyle="round", facecolor="w", \
                                           edgecolor="0.5", alpha=0.9) \
                                )
        # by default, disable the annotation visibility
        annotation.set_visible(False)
        poly_with_annotation.append([polys, annotation])
        # When my mouse hovers above a given patch (country), execute the on_move function
        on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move)
        
其中
on_move
功能定义为

def on_move(event):
    visibility_changed = False
    for poly, annotation in poly_with_annotation:
        should_be_visible = (poly.contains(event)[0] == True) 
        if should_be_visible != annotation.get_visible(): 
            visibility_changed = True # on change la visibilité de l'annotation
            annotation.set_visible(should_be_visible)
    if visibility_changed:        
        plt.draw()
这很有效(见图,我的鼠标在法国上方)

但我希望这不是“鼠标滑过国家FRA”,而是显示该国多年来数据演变的曲线图(类似于
df_-mean.plot(y='FRA')

请注意,以下答案启发了这一点:

  • 以及其中的链接:
def on_move(event):
    visibility_changed = False
    for poly, annotation in poly_with_annotation:
        should_be_visible = (poly.contains(event)[0] == True) 
        if should_be_visible != annotation.get_visible(): 
            visibility_changed = True # on change la visibilité de l'annotation
            annotation.set_visible(should_be_visible)
    if visibility_changed:        
        plt.draw()