Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib basemap中绘制状态缩写_Python_Matplotlib_Shapefile_Matplotlib Basemap - Fatal编程技术网

Python 在matplotlib basemap中绘制状态缩写

Python 在matplotlib basemap中绘制状态缩写,python,matplotlib,shapefile,matplotlib-basemap,Python,Matplotlib,Shapefile,Matplotlib Basemap,我正在底图上绘制一些数据,并在背景中使用州边界,使用: 这是在地图上画州名的一种方式吗(例如加利福尼亚州) @Serenity的答案是正确的,但对于一些小的州(如佛罗里达州),应手动更改缩写的位置 可以在这些点上画一个凸包,并使用这些点的平均值,而不是一个州多边形的所有点的平均值。这不会改变很多事情,但可能对某些人有用 还有一个问题,一些州有几个小岛,我们在这里没有画它们(当印刷的名字中有简短的名字时跳过这些小岛)。以密歇根州和威斯康星州为例,这些岛屿排在主要州之前,因此不会被划出。我查了一下,

我正在底图上绘制一些数据,并在背景中使用州边界,使用:

这是在地图上画州名的一种方式吗(例如加利福尼亚州)


@Serenity的答案是正确的,但对于一些小的州(如佛罗里达州),应手动更改缩写的位置

可以在这些点上画一个凸包,并使用这些点的平均值,而不是一个州多边形的所有点的平均值。这不会改变很多事情,但可能对某些人有用

还有一个问题,一些州有几个小岛,我们在这里没有画它们(当印刷的名字中有简短的名字时跳过这些小岛)。以密歇根州和威斯康星州为例,这些岛屿排在主要州之前,因此不会被划出。我查了一下,主密歇根州是4号,威斯康星州是3号,所以我们只画了第四密歇根州和第三威斯康星州的州名

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
from scipy.spatial import ConvexHull, Voronoi
import pdb

short_state_names = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'AS': 'American Samoa',
        'AZ': 'Arizona',
        'CA': 'California',
        'CO': 'Colorado',
        'CT': 'Connecticut',
        'DC': 'District of Columbia',
        'DE': 'Delaware',
        'FL': 'Florida',
        'GA': 'Georgia',
        'GU': 'Guam',
        'HI': 'Hawaii',
        'IA': 'Iowa',
        'ID': 'Idaho',
        'IL': 'Illinois',
        'IN': 'Indiana',
        'KS': 'Kansas',
        'KY': 'Kentucky',
        'LA': 'Louisiana',
        'MA': 'Massachusetts',
        'MD': 'Maryland',
        'ME': 'Maine',
        'MI': 'Michigan',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MP': 'Northern Mariana Islands',
        'MS': 'Mississippi',
        'MT': 'Montana',
        'NA': 'National',
        'NC': 'North Carolina',
        'ND': 'North Dakota',
        'NE': 'Nebraska',
        'NH': 'New Hampshire',
        'NJ': 'New Jersey',
        'NM': 'New Mexico',
        'NV': 'Nevada',
        'NY': 'New York',
        'OH': 'Ohio',
        'OK': 'Oklahoma',
        'OR': 'Oregon',
        'PA': 'Pennsylvania',
        'PR': 'Puerto Rico',
        'RI': 'Rhode Island',
        'SC': 'South Carolina',
        'SD': 'South Dakota',
        'TN': 'Tennessee',
        'TX': 'Texas',
        'UT': 'Utah',
        'VA': 'Virginia',
        'VI': 'Virgin Islands',
        'VT': 'Vermont',
        'WA': 'Washington',
        'WI': 'Wisconsin',
        'WV': 'West Virginia',
        'WY': 'Wyoming'
}

m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
            projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
# data from U.S Census Bureau
# http://www.census.gov/geo/www/cob/st2000.html
shp_info = m.readshapefile('./data/us_states_st99/st99_d00','states',drawbounds=True)
printed_names = []
mi_index = 0
wi_index = 0
for shapedict,state in zip(m.states_info, m.states):
    draw_state_name = True
    short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])]
    if short_name in printed_names and short_name not in ['MI', 'WI']: 
        continue
    if short_name == 'MI':
        if mi_index != 3:
            draw_state_name = False
        mi_index += 1
    if short_name == 'WI':
        if wi_index != 2:
            draw_state_name = False
        wi_index += 1
    # center of polygon
    x, y = np.array(state).mean(axis=0)
    hull = ConvexHull(state)
    hull_points = np.array(state)[hull.vertices]
    #center of convex hull over the polygon points
    x, y = hull_points.mean(axis=0)
    if draw_state_name:
        # You have to align x,y manually to avoid overlapping for little states
        plt.text(x+.1, y, short_name, ha="center")
    printed_names += [short_name,] 

m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0])
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1])
plt.title('The United States of North America')
plt.show()
如果您关心其他州的其他岛屿,您应该对这些岛屿执行类似的操作(例如,不要继续,绘制多边形,但不要绘制名称,或者您需要执行的任何操作)


Thank@Serenity,我认为密歇根州和威斯康星州存在问题,似乎与代码无关,您是否了解为什么会将其放在那里?发现密歇根州和威斯康星州有几个岛屿,您的代码在这些岛屿上绘制了州缩写,应该跳过那些岛屿,在州的主要部分画上名字。你在哪里下载了你的底图?这个链接似乎不再起作用了。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon

short_state_names = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'AS': 'American Samoa',
        'AZ': 'Arizona',
        'CA': 'California',
        'CO': 'Colorado',
        'CT': 'Connecticut',
        'DC': 'District of Columbia',
        'DE': 'Delaware',
        'FL': 'Florida',
        'GA': 'Georgia',
        'GU': 'Guam',
        'HI': 'Hawaii',
        'IA': 'Iowa',
        'ID': 'Idaho',
        'IL': 'Illinois',
        'IN': 'Indiana',
        'KS': 'Kansas',
        'KY': 'Kentucky',
        'LA': 'Louisiana',
        'MA': 'Massachusetts',
        'MD': 'Maryland',
        'ME': 'Maine',
        'MI': 'Michigan',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MP': 'Northern Mariana Islands',
        'MS': 'Mississippi',
        'MT': 'Montana',
        'NA': 'National',
        'NC': 'North Carolina',
        'ND': 'North Dakota',
        'NE': 'Nebraska',
        'NH': 'New Hampshire',
        'NJ': 'New Jersey',
        'NM': 'New Mexico',
        'NV': 'Nevada',
        'NY': 'New York',
        'OH': 'Ohio',
        'OK': 'Oklahoma',
        'OR': 'Oregon',
        'PA': 'Pennsylvania',
        'PR': 'Puerto Rico',
        'RI': 'Rhode Island',
        'SC': 'South Carolina',
        'SD': 'South Dakota',
        'TN': 'Tennessee',
        'TX': 'Texas',
        'UT': 'Utah',
        'VA': 'Virginia',
        'VI': 'Virgin Islands',
        'VT': 'Vermont',
        'WA': 'Washington',
        'WI': 'Wisconsin',
        'WV': 'West Virginia',
        'WY': 'Wyoming'
}

m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
            projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
# data from U.S Census Bureau
# http://www.census.gov/geo/www/cob/st2000.html
shp_info = m.readshapefile('st99_d00','states',drawbounds=True)
printed_names = []
for shapedict,state in zip(m.states_info, m.states):
    short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])]
    if short_name in printed_names: continue
    # center of polygon
    x, y = np.array(state).mean(axis=0)
    # You have to align x,y manually to avoid overlapping for little states
    plt.text(x+.1, y, short_name, ha="center")
    printed_names += [short_name,] 

m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0])
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1])
plt.title('The United States of North America')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
from scipy.spatial import ConvexHull, Voronoi
import pdb

short_state_names = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'AS': 'American Samoa',
        'AZ': 'Arizona',
        'CA': 'California',
        'CO': 'Colorado',
        'CT': 'Connecticut',
        'DC': 'District of Columbia',
        'DE': 'Delaware',
        'FL': 'Florida',
        'GA': 'Georgia',
        'GU': 'Guam',
        'HI': 'Hawaii',
        'IA': 'Iowa',
        'ID': 'Idaho',
        'IL': 'Illinois',
        'IN': 'Indiana',
        'KS': 'Kansas',
        'KY': 'Kentucky',
        'LA': 'Louisiana',
        'MA': 'Massachusetts',
        'MD': 'Maryland',
        'ME': 'Maine',
        'MI': 'Michigan',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MP': 'Northern Mariana Islands',
        'MS': 'Mississippi',
        'MT': 'Montana',
        'NA': 'National',
        'NC': 'North Carolina',
        'ND': 'North Dakota',
        'NE': 'Nebraska',
        'NH': 'New Hampshire',
        'NJ': 'New Jersey',
        'NM': 'New Mexico',
        'NV': 'Nevada',
        'NY': 'New York',
        'OH': 'Ohio',
        'OK': 'Oklahoma',
        'OR': 'Oregon',
        'PA': 'Pennsylvania',
        'PR': 'Puerto Rico',
        'RI': 'Rhode Island',
        'SC': 'South Carolina',
        'SD': 'South Dakota',
        'TN': 'Tennessee',
        'TX': 'Texas',
        'UT': 'Utah',
        'VA': 'Virginia',
        'VI': 'Virgin Islands',
        'VT': 'Vermont',
        'WA': 'Washington',
        'WI': 'Wisconsin',
        'WV': 'West Virginia',
        'WY': 'Wyoming'
}

m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
            projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
# data from U.S Census Bureau
# http://www.census.gov/geo/www/cob/st2000.html
shp_info = m.readshapefile('./data/us_states_st99/st99_d00','states',drawbounds=True)
printed_names = []
mi_index = 0
wi_index = 0
for shapedict,state in zip(m.states_info, m.states):
    draw_state_name = True
    short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])]
    if short_name in printed_names and short_name not in ['MI', 'WI']: 
        continue
    if short_name == 'MI':
        if mi_index != 3:
            draw_state_name = False
        mi_index += 1
    if short_name == 'WI':
        if wi_index != 2:
            draw_state_name = False
        wi_index += 1
    # center of polygon
    x, y = np.array(state).mean(axis=0)
    hull = ConvexHull(state)
    hull_points = np.array(state)[hull.vertices]
    #center of convex hull over the polygon points
    x, y = hull_points.mean(axis=0)
    if draw_state_name:
        # You have to align x,y manually to avoid overlapping for little states
        plt.text(x+.1, y, short_name, ha="center")
    printed_names += [short_name,] 

m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0])
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1])
plt.title('The United States of North America')
plt.show()