Моя проблема в том, что окраины отображают неправильный цвет на карте Folium. Например, Данденонг и Франкстон должны быть затенены самым темным цветом, поскольку они имеют наибольшее количество во фрейме данных, но они затенены более светлым цветом.
Во фрейме данных отсутствуют некоторые пригороды. Эти пригороды раскрашивают самым темным цветом.
Другая проблема заключается в том, что в csv все пригороды указаны ВЕРХНИМ РЕГИСТРАТОМ, но в geojson есть смесь случаев, таких как «Франкстон», «Сент-Килда» или «Маккиннон». Было бы полезно, если бы код хороплета не заботился о регистре. Я могу изменить текст во фрейме данных, сделав «FRANKSTON», «Frankston» и «ST KILDA», «St Kilda», но «MCKINNON» на «McKinnon» оказывается немного сложнее.
Создать фрейм данных
import csv
import pandas as pd
csv_path='Data_tables_Criminal_Incidents_Visualisation_year_ending_June_2018.csv'
df=pd.read_csv(csv_path)
with open(csv_path, 'r') as csvfile:
# creating a csv reader object
csvreader = csv.reader(csvfile)
# create a list of headings from the first row of the csv file
headings = next(csvreader)
# create a dictionary, where keys are Suburb/Town Name and values are number of occurences
# index 2 of the headings list are the suburbs
neighborhood_dict = df[headings[2]].value_counts().to_dict()
# make first letter uppercase eg St Kilda
neighborhood_dict = dict((k.title(), v) for k, v in neighborhood_dict.items())
# make neighborhood_list from neighborhood_dict
neighborhood_list=[]
for key, value in neighborhood_dict.items():
temp = [key,value]
neighborhood_list.append(temp)
# make dataframe from neighborhood_list
df = pd.DataFrame(neighborhood_list, columns=['Suburb','Count'])
print(df.to_string())
Создать карту
import folium
world_map = folium.Map(
location=[-38.292102, 144.727880],
zoom_start=6,
tiles='openstreetmap'
)
world_map.choropleth(
geo_data='vic.geojson',
data=df,
columns=['Suburb','Count'],
key_on='feature.properties.Suburb_Name',
fill_color='YlOrRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Crime Rate in Victoria'
)
world_map.save('index.html')