2014-09-23 71 views
1

我有这种格式绘制世界地图上分类数据

____USA.csv____ 
    lats, long, users 
    37.3264, -117.1416, 5334, 
    37.3264, -117.1416, 435, 

现在我想告诉世界地图上对美国这一数据为5个国家的数据。 为此我尝试过。

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

# read input csv file 
filename = 'D:/22_sept_14/USA.csv' 
lats=[] 
lons=[] 
population=[] 
with open(filename) as f: 
    reader = csv.reader(f) 
    for row in reader: 
     lats.append(float(row[0])) 
     lons.append(float(row[1])) 
     population.append(float(row[2])) 



map = Basemap(projection='robin', resolution = 'l', area_thresh = 1000.0, 
       lat_0=0, lon_0=-130) 
map.drawcoastlines() 
map.drawcountries() 
map.fillcontinents(color = 'gray') 
map.drawmapboundary() 
map.drawmeridians(np.arange(0, 360, 30)) 
map.drawparallels(np.arange(-90, 90, 30)) 

min_marker_size = 2.5 
for lon, lat,pop in zip(lons, lats, population): 
    x,y = map(lon, lat) 
    if pop>1000: 
     color='ro' 
    elif pop<1000: 
     color='yo' 
    msize = pop * .01* min_marker_size 
    map.plot(x, y, color, markersize=msize,alpha=.3) 

plt.show() 

但问题是,此方法只绘制数据在“圆”。我还想要的是用定量信息/“数字”(与数据成比例的字体大小)填充这些圆圈。我怎样才能做到这一点 ?

出于测试目的,我想包括map.plot之前这条线(在上面的代码中最后第二条)

plt.text(lon,lat,'59%',fontsize=34,fontweight='bold',ha='center',va='center',color='b') 

但是,即使这并不帮助,因为只要我包括在上面一行代码,该行map.plot(x, y, color, markersize=msize,alpha=.3)未能提供其输出。相反,我所看到的只是文本“59%”,就是这样。 我可以绘制圆形或文字(即59%)。但不是他们两个在一起。这是为什么发生?

回答

2

这是为我工作。好样的,但现在好了。

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

mark_font=3 
lats=lons=population=[] 
filename = 'D:/22_sept_14/mvsf.csv' 
with open(filename) as f: 
    reader = csv.reader(f) 
    for row in reader: 
     lats.append(float(row[0])) 
     lons.append(float(row[1])) 
     population.append(float(row[2])) 

m = Basemap(projection='robin', resolution = 'l', area_thresh = 10000.0, 
       lat_0=0, lon_0=0) 
m.drawcoastlines() 
m.drawcountries() 
m.fillcontinents(color = 'gray') 
m.drawmapboundary(fill_color='aqua') 
m.drawmeridians(np.arange(0, 360, 30)) 
m.drawparallels(np.arange(-90, 90, 30)) 
# fill continents, set lake color same as ocean color. 
# draw parallels and meridians. 
# label parallels on right and top 
# meridians on bottom and left 
parallels = np.arange(0.,81,10.) 
# labels = [left,right,top,bottom] 
m.drawparallels(parallels,labels=[False,True,True,False]) 
meridians = np.arange(10.,351.,20.) 
m.drawmeridians(meridians,labels=[True,False,False,True]) 
# plot blue dot on Boulder, colorado and label it as such. 
lon, lat = -100.237, 49.125 # Location of Boulder 
# convert to map projection coords. 
# Note that lon,lat can be scalars, lists or numpy arrays. 
xpt,ypt = m(lon,lat) 
# convert back to lat/lon 
lonpt, latpt = m(xpt,ypt,inverse=True) 
m.plot(xpt,ypt,'go',markersize=17*mark_font,alpha=.8) # plot a blue dot there 
# put some text next to the dot, offset a little bit 
# (the offset is in map projection coordinates) 
plt.text(xpt,ypt,'17%' , fontsize=17,color='w') 


lon, lat = -104.237, 40.125 # Location of Boulder 
# convert to map projection coords. 
# Note that lon,lat can be scalars, lists or numpy arrays. 
xpt,ypt = m(lon,lat) 
# convert back to lat/lon 
lonpt, latpt = m(xpt,ypt,inverse=True) 
m.plot(xpt,ypt,'ro',markersize=16*mark_font,alpha=.8) # plot a blue dot there 
# put some text next to the dot, offset a little bit 
# (the offset is in map projection coordinates) 
plt.text(xpt,ypt,'16%' , fontsize=16,color='w') 

plt.show()