Ich versuche, this example mit County Daten für Michigan zu ändern. Kurz gesagt, es funktioniert, aber es scheint hier und da einige zusätzliche Formen hinzuzufügen, während die Grafschaften gezeichnet werden. Ich vermute, dass in einigen Fällen (wo es Kreise mit Inseln gibt) der Insel-Teil als eine separate "Grafschaft" aufgeführt werden muss, aber ich bin mir nicht sicher über den anderen Fall, wie zum Beispiel mit Wayne County in der unteren der rechte Teil des Staates.Bokeh Mapping Counties
Hier ist ein Bild von dem, was ich habe zur Zeit:
Hier ist, was ich bisher getan:
- Get Kreis Daten von Bokeh der Probe Kreisdaten nur den Zustand Abkürzung pro Zustandsnummer zu erhalten (meine zweite, Hauptdatenquelle hat nur Zustandszahlen). Für dieses Beispiel werde ich es vereinfachen, indem ich nur nach Status Nummer 26 filtere).
- Get state coordinates ('500k' Datei) von der Grafschaft aus der U.S. Census site.
- Verwenden Sie den folgenden Code, um eine "interaktive" Karte von Michigan zu generieren.
Hinweis: pip Shape-Datei installieren (wirklich pyshp), ich glaube, ich die .whl Datei von here herunterladen musste und dann installieren Sie pip [Pfad zur Datei .whl].
import pandas as pd
import numpy as np
import shapefile
from bokeh.models import HoverTool, ColumnDataSource
from bokeh.palettes import Viridis6
from bokeh.plotting import figure, show, output_notebook
shpfile=r'Path\500K_US_Counties\cb_2015_us_county_500k.shp'
sf = shapefile.Reader(shpfile)
shapes = sf.shapes()
#Here are the rows from the shape file (plus lat/long coordinates)
rows=[]
lenrow=[]
for i,j in zip(sf.shapeRecords(),sf.shapes()):
rows.append(i.record+[j.points])
if len(i.record+[j.points])!=10:
print("Found record with irrular number of columns")
fields1=sf.fields[1:] #Ignore first field as it is not used (maybe it's a meta field?)
fields=[seq[0] for seq in fields1]+['Long_Lat']#Take the first element in each tuple of the list
c=pd.DataFrame(rows,columns=fields)
try:
c['STATEFP']=c['STATEFP'].astype(int)
except:
pass
#cns=pd.read_csv(r'Path\US_Counties.csv')
#cns=cns[['State Abbr.','STATE num']]
#cns=cns.drop_duplicates('State Abbr.',keep='first')
#c=pd.merge(c,cns,how='left',left_on='STATEFP',right_on='STATE num')
c['Lat']=c['Long_Lat'].apply(lambda x: [e[0] for e in x])
c['Long']=c['Long_Lat'].apply(lambda x: [e[1] for e in x])
#c=c.loc[c['State Abbr.']=='MI']
c=c.loc[c['STATEFP']==26]
#latitudex, longitude=y
county_xs = c['Lat']
county_ys = c['Long']
county_names = c['NAME']
county_colors = [Viridis6[np.random.randint(1,6, size=1).tolist()[0]] for l in aland]
randns=np.random.randint(1,6, size=1).tolist()[0]
#county_colors = [Viridis6[e] for e in randns]
#county_colors = 'b'
source = ColumnDataSource(data=dict(
x=county_xs,
y=county_ys,
color=county_colors,
name=county_names,
#rate=county_rates,
))
output_notebook()
TOOLS="pan,wheel_zoom,box_zoom,reset,hover,save"
p = figure(title="Title", tools=TOOLS,
x_axis_location=None, y_axis_location=None)
p.grid.grid_line_color = None
p.patches('x', 'y', source=source,
fill_color='color', fill_alpha=0.7,
line_color="white", line_width=0.5)
hover = p.select_one(HoverTool)
hover.point_policy = "follow_mouse"
hover.tooltips = [
("Name", "@name"),
#("Unemployment rate)", "@rate%"),
("(Long, Lat)", "($x, $y)"),
]
show(p)
Ich bin auf der Suche nach einer Möglichkeit, die zusätzlichen Linien und Formen zu vermeiden.
Vielen Dank im Voraus!