Добавление меток на карту шейп-файла - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть шейп-файл, который отображает мир на территории продаж.Записи шейп-файла содержат код и название территории продаж.Я хотел бы иметь возможность добавлять код территории в центре региона, но для использования 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()

Результирующая карта кода без названий территорий

1 Ответ

0 голосов
/ 27 сентября 2018

вы, вероятно, хотите взять среднее всех координат x и среднее всех координат y вашей формы многоугольника.

Я не могу проверить это, но это может выглядеть примерно так:

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

или это:

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

в зависимости от размеров вашего массива numpy.

...