Python - Folium Choropleth Map - неправильные цвета

Моя проблема в том, что окраины отображают неправильный цвет на карте 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')

Изображение фрейма данных

Легенда

Изображение карты


person Harley    schedule 21.10.2018    source источник


Ответы (1)


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

Файлы здесь

Демо-изображение

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

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')
person Harley    schedule 25.10.2018
comment
Как плательщик ставок Франкстона, спасибо, что поместили Франкстон на карту :) - person al76; 21.05.2021