2015-11-23 38 views
1

我想根據散景的map of US unemployment製作一張chloropleth地圖,我對這個圖書館並不是很熟悉,但我對熊貓有些熟悉。我有一個國家數據框和我們系統的優先級。我無法獲得正確顯示的優先級。我認爲我錯誤地使用了fill_color屬性,但除了散景文檔中列出的one line之外,我找不到關於它的更多信息。散熱圖不顯示正確的結果

我的預期輸出是針對高優先級顯示爲紅色,中等優先級顯示爲綠色,低優先級顯示爲黃色。 (顏色方案不是我的選擇。)如果狀態沒有優先級,它們應該顯示爲白色。然而,輸出並不符合 - 顏色似乎是隨機放置的。一些低優先級的國家是紅色的,一些是黃色的;一些中等優先的國家是白色的,有些是紅色的;等等

我想錯誤在於我的state_colors列表。現在我正在循環並更新每個狀態的優先級,但由於某種原因它沒有正確更新。有沒有辦法在patch()方法內更改fill_color屬性,以便顏色對應於優先級值?或者我只是搞亂state_colors名單?

from bokeh.models import ColumnDataSource 
from bokeh.sampledata import us_states 
from bokeh.plotting import figure, show, output_file 
import pandas as pd 

df2 = pd.read_excel(filename, sheetname='2012 Master', header=1, skip_footer=4, parse_cols='A,B,L,P') 

usa_states = us_states.data.copy() 
state_xs = [usa_states[code]["lons"] for code in usa_states] 
state_ys = [usa_states[code]["lats"] for code in usa_states] 
df2.fillna(value="", inplace=True) 

state_colors = [] 
for state in df2["State"]: 
    for priority in df2["Priority"]: 
     if priority == "High": 
      state_colors.append("#FF0000") 
     elif priority == "Medium": 
      state_colors.append("#008000") 
     elif priority == "Low": 
      state_colors.append("#FFFF00")  
    else: 
     state_colors.append("#FFFFFF") 

source = ColumnDataSource(
    data=dict(
     st = df2['State'], 
     priority = df2['Priority'] 
    ) 
) 
p = figure(title="Title", tools= TOOLS, toolbar_location="above", plot_width=1100, plot_height=700, x_range=[-128,-64], y_range=[23,50]) 

p.patches(state_xs, state_ys, fill_color = state_colors, source=source, fill_alpha=1, line_color="black", line_width=1) 
hover = p.select(dict(type=HoverTool)) 
hover.tooltips= [ 
    ("State","@st"), 
    ("Priority","@priority"), 
] 
show(p) 

我的數據幀(DF2):

State  Priority 
Alabama  Low 
Arizona 
Arkansas  
California Medium 
Colorado  
Connecticut 
Delaware  
District of Columbia  
Florida  High 
Georgia  Medium 
Idaho  High 
Illinois Low 
... 
Wisconsin High 
Wyoming  Low 

我使用熊貓0.17.1。 Here是散景使用的usa_states代碼。 Here是我當前的輸出。

回答

0

我覺得你對你的state_colors列表使用不好的熊貓。

嘗試類似的東西來取代你的循環:

def get_color(priority): 
    if priority == "High": 
     return "#FF0000" 
    elif priority == "Medium": 
     return "#008000" 
    elif priority == "Low": 
     return "#FFFF00" 
    else: 
     return "#FFFFFF" 

df2["color"] = df2["Priority"].apply(get_color) 

然後

source = ColumnDataSource(
    data=dict(
     st = df2['State'], 
     priority = df2['Priority'], 
     state_colors = df2['color'] 
    ) 
) 

下面是一段代碼爲界,補丁沒有經過測試的工作代替源。

df1['color'] = df1['value'].apply(lambda value: rgb2hex(m.to_rgba(value))) 
df1['alpha'] = 0.3 

output_notebook() 

source1 = ColumnDataSource(data = dict(
    longitude = df1['longitude'], 
    latitude = df1['latitude'], 
    color = df1['color'], 
    alpha = df1['alpha'] 
)) 

# The Google Maps plot 
x_range = Range1d() 
y_range = Range1d() 
style = [{"stylers":[{"hue":"#ff1a00"},{"invert_lightness":True},{"saturation":-100},{"lightness":33},{"gamma":0.5}]},{"featureType":"water","elementType":"geometry","stylers":[{"color":"#2D333C"}]}] 
map_style = json.dumps(style) 
map_options = GMapOptions(lat=40.7339773, lng=-73.9888841, zoom=13, map_type="roadmap"), styles=map_style) 
plot = GMapPlot(x_range=x_range, y_range=y_range, map_options=map_options, plot_width=1000, plot_height=700, 
       title="my title") 
plot.title_text_font_size = '1em' 

circle = Circle(x="longitude", y="latitude", size=10, fill_color="color", line_color="black", fill_alpha="alpha", line_alpha=0) 
plot.add_glyph(source1, circle) 

pantool = PanTool() 
wheelzoomtool = WheelZoomTool() 
plot.add_tools(pantool, wheelzoomtool) 

show(plot)