2015-10-16 3 views
1

У меня возникла проблема с получением моих данных на карте с помощью Basemap и изменения этих точек в цвете. Я читал много разных вещей в Интернете о том, как это сделать, но я все равно получаю карту без очков. Вот мой код:Изменение цвета точки на matplolib и базовая карта не работает

import pandas as pd 
import numpy as np 
import pickle 
from IPython.display import SVG, display_svg 
from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import matplotlib.colors as co 

d3data = pickle.load(open("9_28_2015to10_04_2015.pickle", "rb")) 

lons = d3data['longitude'].tolist() 
lats = d3data['latitude'].tolist() 
normcts = co.Normalize(d3data['GrossCounts']) 

plt.figure(figsize=(20,10)) 

m = Basemap(projection='cass', lat_0 = 40.108004, lon_0 = -88.228878, 
    resolution = 'h', area_thresh = 0.1, 
    llcrnrlon=-88.238399, llcrnrlat=40.097942, 
    urcrnrlon=-88.219345, urcrnrlat=40.116158) 

m.drawcountries() 
m.fillcontinents(color='white') 
m.drawmapboundary() 
m.readshapefile('mhj_shapes/lines', 'lines') 
cmap = plt.cm.RdYlBu_r 
norm = co.Normalize(vmin=d3data['GrossCounts'].min(), 
    vmax=d3data['GrossCounts'].max()) 
pointcolors = plt.cm.ScalarMappable(norm, cmap) 

for i in range(0, len(d3data)): 
    col = pointcolors.to_rgba(d3data['GrossCounts'][i]) 
    x,y = m(d3data['longitude'][i],d3data['latitude'][i]) 
    m.scatter(x, y, marker = 'o', s=10, color=col, cmap=cmap) 

plt.show() 

Моя проблема заключается в том, что мой файл форма генерирует карту просто отлично, но я не получаю никаких очков на нем. Я хочу построить столбцы dataframe d3data['GrossCounts'] поверх карты и иметь цветовую шкалу с (целочисленным) значением d3data['GrossCounts'].

Любые предложения были бы высоко оценены!

ответ

0

Проблема решена!

Оказалось, что это описано в `map.scatter` on basemap not displaying markers (хотя я не искал правильные условия, когда здесь я искал Google). Вот те изменения, которые в конце концов сработало:

m.drawcountries() 
m.fillcontinents(color='white', zorder=0) # <--zorder!!! 
m.drawmapboundary() 
m.readshapefile('mhj_shapes/lines', 'lines') 
cmap = plt.cm.jet 

x, y = m(lons, lats) 
norm = co.Normalize(vmin=d3data.GrossCounts.min(), vmax=250) 
pointcolors = plt.cm.ScalarMappable(norm, cmap) 
col = pointcolors.to_rgba(d3data.GrossCounts) 
m.scatter(x, y, s=10, c=col, cmap=plt.cm.jet) 

Я не знаю, почему я никогда не видел ZOrder ни в одном из интернет-примеров, которые я нашел, но добавив это убеждается, что сама карта отправляется на спине поэтому очки выводятся на передний план. Спасибо за вашу помощь!

0

Трудно проверить без вашего файла данных/формы и т. Д., Но проблема может быть вашей петлей. Может быть, попробовать без петли:

col = pointcolors.to_rgba(d3data['GrossCounts']) 
x, y = m(d3data['longitude'], d3data['latitude']) 
m.scatter(x, y, marker='o', s=10, color=col, cmap=cmap) 

т.е. если я:

plt.figure(figsize=(8,5)) 

m = Basemap(projection='cass', lat_0 = 0, lon_0 = 0, 
    resolution = 'l', area_thresh = 0.1, 
    llcrnrlon=-10, llcrnrlat=-10, 
    urcrnrlon=10, urcrnrlat=10) 

m.drawcountries() 
m.fillcontinents(color='white') 
m.drawmapboundary() 
#m.readshapefile('mhj_shapes/lines', 'lines') 
cmap = plt.cm.RdYlBu_r 

x, y = m([0, 5], [0, 5]) 
df = pd.DataFrame({'a': [1,2]}) 
norm = co.Normalize(vmin=df.a.min(), vmax=df.a.max()) 
pointcolors = plt.cm.ScalarMappable(norm, cmap) 
col = pointcolors.to_rgba(df.a) 
m.scatter(x, y, s=10, color=col) 

plt.show() 

я получаю:

map with scatter plot

Это то, что вы после этого?

+0

Интересно. Я подключил ваш код и до сих пор не вижу никаких моментов в своем заговоре. [link] (https://www.flickr.com/photos/[email protected]/shares/4896Z1). Я вижу, что переменные (например, col) заполняются правильно. Это что-то в заговоре, что я должен поступать неправильно. –

+0

Я предполагаю, что вы уже проверили, но что такое min/max d3data ['longitude'] и d3data ['latitude']? –

+0

Я проверил и подтвердил, что они находятся в ограничивающей рамке, установленной на карте. –

Смежные вопросы