如何在python底图图例中显示shapefile标签? [英] How to show shapefile label in python basemap legend?

查看:110
本文介绍了如何在python底图图例中显示shapefile标签?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

python底图中有两个内容:一个多线shapefile(IL_State_ln)和一个在底图范围内的随机点的散点图.我的兴趣是生成一个图例,该图例提供有关shapefile和散点的信息.现在,我只能在图例中包含点,而不能在shapefile中包含点.

The python Basemap has two contents plotted in it: A multiline shapefile (IL_State_ln) and a scatterplot of some random points within the basemap extent. My interest is in generating a legend that gives information about both shapefile and the scatter points. For now, I am only able to include the points in the legend and not the shapefile.

检查底图API文档不提供任何信息,因为函数readshapefile ()似乎没有任何 label 参数.

Checking the Basemap API documentation does not provide any information, as the function readshapefile() does not seem to have any label argument.

能否请我像在ArcGIS地图中那样在图例中添加shapefile指示器?

Could you please help me include the shapefile indicator in the legend like in the ArcGIS maps?

这是我的代码:

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

fname = "DATA/GIS/IL_State_ln"

m = Basemap(llcrnrlon=-92.,llcrnrlat=36.8,urcrnrlon=-86.5,urcrnrlat=43.,
             resolution='i', projection='tmerc', lat_0 = 36.5, lon_0 = -91.8)

m.readshapefile(fname, 'mygeom')

x,y = m([-90., -91.2, -88.], [38., 37.7, 42.])
m.scatter(x,y, marker='o', label="Points")

plt.legend(loc=3)
plt.show()

我正在使用Python 3.5,matplotlib 2.0和底图1.0.8.

I'm using Python 3.5, matplotlib 2.0 and basemap 1.0.8.

推荐答案

创建图例条目的想法是将形状绘制为多边形,然后将其添加到图例中.
因此,我们首先要停用drawboundsm.readshapefile(fn, 'shf', drawbounds = False).然后,我们可以从shapefile创建matplotlib.patches.Polygon并将其添加到轴plt.gca().add_artist(polygon).

The idea to create a legend entry would be to draw the shapes as polygons, which can then be added to the legend.
Therfore we would first deactivate drawbounds, m.readshapefile(fn, 'shf', drawbounds = False). We can then create a matplotlib.patches.Polygon from the shapefile and add it to the axes, plt.gca().add_artist(polygon).

然后可以使用该多边形更新图例

The legend can then be updated using this polygon

handles, labels = plt.gca().get_legend_handles_labels()
handles.extend([polygon])  
labels.extend(["Name of the shape"])                     
plt.legend(handles=handles, labels=labels)

现在有一些代码在起作用,它产生以下图像.它使用 ne_10m_admin_0_countries 文件.

Here is now some code in action, which produces the following images. It uses the ne_10m_admin_0_countries file.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

m = Basemap(llcrnrlon=-10,llcrnrlat=35,urcrnrlon=35,urcrnrlat=60.,
             resolution='i', projection='tmerc', lat_0 = 48.9, lon_0 = 15.3)

m.drawcoastlines()
m.drawcountries(zorder=0, color=(.9,.9,.9), linewidth=1)

fn = r"ne_10m_admin_0_countries\ne_10m_admin_0_countries"
m.readshapefile(fn, 'shf', drawbounds = False)

#Madrid
x,y = m([-3.703889],[40.4125])
m.plot(x,y, marker="o", color="blue", label="Madrid", ls="")

# some countries
countries = ['Switzerland', 'Ireland', "Belgium"]
colors= {'Switzerland':"red", 'Ireland':"orange", 'Belgium' : "purple"}
shapes = {}
for info, shape in zip(m.shf_info, m.shf):
    if info['NAME'] in countries:
        p= Polygon(np.array(shape), True, facecolor= colors[info['NAME']], 
                   edgecolor='none', alpha=0.7, zorder=2)
        shapes.update({info['NAME'] : p})

for country in countries:
    plt.gca().add_artist(shapes[country]) 


# create legend, by first getting the already present handles, labels
handles, labels = plt.gca().get_legend_handles_labels()
# and then adding the new ones
handles.extend([shapes[c] for c in countries])  
labels.extend(countries)                     
plt.legend(handles=handles, labels=labels, framealpha=1.)

plt.show()

现在,因为我们已经有了一个具有多边形的多边形,为什么不通过直接将形状绘制到图例中来使图例更加花哨.可以按照以下步骤进行.

Now because we already have a polygon with the shape, why not make the legend a bit more fancy, by directly plotting the shape into the legend. This can be done as follows.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

m = Basemap(llcrnrlon=-10,llcrnrlat=35,urcrnrlon=35,urcrnrlat=60.,
             resolution='i', projection='tmerc', lat_0 = 48.9, lon_0 = 15.3)

m.drawcoastlines()

fn = r"ne_10m_admin_0_countries\ne_10m_admin_0_countries"
m.readshapefile(fn, 'shf', drawbounds = False)

#Madrid
x,y = m([-3.703889],[40.4125])
m.plot(x,y, marker="o", color="blue", label="Madrid", ls="")

countries = ['Switzerland', 'Ireland', "Belgium"]
colors= {'Switzerland':"red", 'Ireland':"orange", 'Belgium' : "purple"}
shapes = {}
for info, shape in zip(m.shf_info, m.shf):
    if info['NAME'] in countries:
        p= Polygon(np.array(shape), True, facecolor= colors[info['NAME']], 
                   edgecolor='none', alpha=0.7, zorder=2)
        shapes.update({info['NAME'] : p})

for country in countries:
    plt.gca().add_artist(shapes[country]) 


class PolygonN(object):
    def legend_artist(self, legend, orig_handle, fontsize, handlebox):
        x0, y0 = handlebox.xdescent, handlebox.ydescent
        width, height = handlebox.width, handlebox.height
        aspect= height/float(width)
        verts = orig_handle.get_xy()
        minx, miny = verts[:,0].min(), verts[:,1].min()
        maxx, maxy = verts[:,0].max(), verts[:,1].max()
        aspect= (maxy-miny)/float((maxx-minx))
        nvx = (verts[:,0]-minx)*float(height)/aspect/(maxx-minx)-x0
        nvy = (verts[:,1]-miny)*float(height)/(maxy-miny)-y0

        p = Polygon(np.c_[nvx, nvy])
        p.update_from(orig_handle)
        p.set_transform(handlebox.get_transform())

        handlebox.add_artist(p)
        return p

handles, labels = plt.gca().get_legend_handles_labels()
handles.extend([shapes[c] for c in countries])  
labels.extend(countries)     
plt.legend(handles=handles, labels=labels, handleheight=3, handlelength=3, framealpha=1.,
           handler_map={Polygon: PolygonN()} )

plt.show()

这篇关于如何在python底图图例中显示shapefile标签?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆