将标签添加到Shapefile映射

时间:2018-09-26 23:06:37

标签: matplotlib maps label shapefile

我有一个shapefile,可将世界映射到销售地区。 shapefile记录列出了销售地区代码和名称。我希望能够在区域的中心添加区域代码,但是要使用ax.text,我需要区域的中心点。任何想法如何做到这一点?

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import shapefile
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.colors import rgb2hex, Normalize
from matplotlib.patches import Polygon
from matplotlib.colorbar import ColorbarBase
from matplotlib.collections import PatchCollection

plt.rcParams['figure.figsize'] = [16,12]
fig = plt.figure()
m = Basemap(llcrnrlon=-121,llcrnrlat=20,urcrnrlon=-62,urcrnrlat=51,
    projection='lcc',lat_1=32,lat_2=45,lon_0=-95)

shp_info = m.readshapefile('world_countries_boundary_file_world_2002','countries',drawbounds=True)

sf = shapefile.Reader('territory_map')   # Custom file mapping out territories
recs    = sf.records()
shapes  = sf.shapes()
Nshp    = len(shapes)
colors={}
territory_codes=[]
cmap = plt.cm.RdYlGn
# details is a pandas datafile with column "DELTA" that has data to plot 
vmin = details.DELTA.min()
vmax = details.DELTA.max()
norm = Normalize(vmin=vmin, vmax=vmax)

for index,row in details.iterrows():
    colors[row['TERRITORY_CODE']] = cmap((row['DELTA']-vmin)/(vmax-vmin))[:3]
    territory_codes.append(row['TERRITORY_CODE'])

ax = fig.add_subplot(111)

for nshp in range(Nshp):
    ptchs = []
    pts = np.array((shapes[nshp].points))
    prt = shapes[nshp].parts
    par = list(prt) + [pts.shape[0]]
    for pij in range(len(prt)):
        ptchs.append(Polygon(pts[par[pij]:par[pij+1]]))
    try:
        color = rgb2hex(colors[recs[nshp][0]])
    except:
        color = 'w'   # If no data, leave white (blank)

    ax.add_collection(PatchCollection(ptchs, facecolor=color, edgecolor='b', linewidths=.7))
    x, y = #  Coordinates that are center of region
    ax.text(x, y, recs[nshp][0])    # <---- this would be the text to add       

# Add colorbar    
ax_c = fig.add_axes([0.1, 0.1, 0.8, 0.02])
cb = ColorbarBase(ax_c,cmap=cmap,norm=norm,orientation='horizontal')
cb.ax.set_xlabel('Daily Change, USD')

#Set view to United States
ax.set_xlim(-150,-40)
ax.set_ylim(15,70)

plt.show()

Resulting Map of Code without Territory Names

1 个答案:

答案 0 :(得分:0)

您可能正在寻找采用多边形形状的所有x坐标和所有y坐标的平均值。

我无法测试,但看起来可能像这样:

x,y = pts[0].mean(), pts[1].mean()

或者这个:

x,y = pts[:,0].mean(), pts[:,1].mean()

取决于您的numpy数组的大小。