Python - Folium Choropleth Map - неправильные цвета - PullRequest
0 голосов
/ 21 октября 2018

Моя проблема в том, что пригороды не отображают правильный цвет на карте Фолиума.Например, Данденонг и Франкстон должны быть закрашены самым темным цветом, поскольку они имеют наибольшее число в кадре данных, но они затенены более светлым цветом.

В кадре данных отсутствуют некоторые пригороды.Эти пригороды окрашены в самый темный цвет.

Другая проблема заключается в том, что у csv есть все пригороды в верхнем регистре, но у геойсона есть смесь случаев, таких как "Frankston", "St Kilda" или "McKinnon".Было бы полезно, если бы код choropleth не заботился о случае.Я могу изменить текст в кадре данных, чтобы сделать «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')

Dataframe Image

Legend

Map Image

1 Ответ

0 голосов
/ 25 октября 2018

Я все понял.Недостающие значения окрашены в серый цвет, а легенда настраивается с интервалами по моему выбору.Очистка геойсона, удаление пробелов и присвоение названий всех пригородов UPPERCASE решило множество проблем.

Файлы здесь

Demo image

Создать словарь

import pandas as pd
import csv 

csv_path='Data_tables_Criminal_Incidents_Visualisation_year_ending_June_2018.csv'
df=pd.read_csv(csv_path)

# sum the number of incidents recorded for each suburb
df=df.groupby(['Suburb/Town Name'])['Incidents Recorded'].agg(
    # make the numbers numeric otherwise it just concatenates strings
    lambda x: pd.to_numeric(x, errors='coerce').sum()
)

# create a dictionary, where keys are Suburb/Town Name and values are number of incidents
suburb_dict = df.to_dict()

Функция стиля

def style_function(feature):
    suburb = suburb_dict.get(feature['properties']['Suburb_Name'])
    return {
        'fillColor': '#gray' if suburb is None else colormap(suburb),
        'fillOpacity': 0.6,
        #borders
        'weight': 0.2,
    }

Карта фолиума

import folium

world_map = folium.Map(
        location=[-38.292102, 144.727880],
        zoom_start=6,
        tiles='openstreetmap'
        )

folium.GeoJson(
    data = 'vic_for_crime_2018.geojson',
    style_function = style_function    
).add_to(world_map)

Карта цветов

import branca

colormap = branca.colormap.linear.YlOrRd_09.scale(0, 8500)
colormap = colormap.to_step(index=[0, 1000, 3000, 5000, 8500])
colormap.caption = 'Incidents of Crime in Victoria (year ending June 2018)'
colormap.add_to(world_map)

world_map.save('vic_final.html')
...