Нанесение категориальных данных на карту мира
У меня есть данные для 5 стран в этом формате
____USA.csv____
lats, long, users
37.3264, -117.1416, 5334,
37.3264, -117.1416, 435,
Теперь я хочу показать эти данные о США на карте мира. За что я попробовал это.
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%). Но не они оба вместе. Почему это происходит?
1 ответ
Это то, что сработало для меня. Ну вроде как, но пока хорошо.
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()