Размер пузырей в графике. express .scatter_mapbox - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать карту с помощью plotly. express, на которой значения отображаются в виде пузырей (кружков).

В настоящее время значения варьируются от 16000 до 21500. У меня все работает, пузыри отображаются разными цветами, однако все они более или менее одинакового размера.

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

Так выглядит мой фрейм данных:

                 country       average       long        lat
0        Baden-Württemberg  19166.381092   9.179330  48.781956
1                   Bayern  18786.556728  11.572199  48.137859
2                   Berlin  21463.044514  13.387224  52.533707
3              Brandenburg  19622.567766  13.070526  52.405476
4                   Bremen  16197.013903   8.805129  53.081386
5                  Hamburg  18426.436184  10.001104  53.554158

и вот как я его отображаю:

fig = px.scatter_mapbox(all_data, lat="lat", lon="long", hover_name="country", hover_data=["country", "average"], 
                        color="average",
                        size="average", color_continuous_scale=px.colors.sequential.matter, size_max=20,
                        zoom=5, height=1000, mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

И вот как это выглядит: открытая карта улиц с пузырьками

Как я могу повлиять на размер пузырей, чтобы меньшее значение имело малый диаметр, а большее значение имело большой диаметр?

Я попытался поиграть со значением size_max, но все пузырьки по-прежнему будут иметь одинаковый размер, только все они будут больше или меньше.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Я обнаружил, что параметр size может принимать список значений, отражающих масштаб. Это не повлияет на масштаб, отображаемый справа от карты.

Итак, я сделал это:

# doing a little bit of math here to calculate a scale to reflect the difference between
# the minimum and the maximum of the average prices (could probably be done much more elegant,
# but this does the job)
# 
# first, calculate a ratio between max and min and divide it to have 16 steps

all_data_diffq = (all_data["mean"].max() - all_data["mean"].min()) / 16

# calculate the scale value by subtracting the minium value from the average price, divide 
# that by the ratio which will give the scale a value between 0...15 and add 1 to it so that
# the scale values start at 1 (to be visible on the map)
# add the according scale to each row
# the scale column will then be used for size=... parameter in the scatter_mapbox call below

all_data["scale"] = (all_data["mean"] - all_data["mean"].min()) / all_data_diffq + 1

Мой фрейм данных теперь выглядит так:

                   country          mean       long        lat      scale
0        Baden-Württemberg  19166.381092   9.179330  48.781956  10.021952
1                   Bayern  18786.556728  11.572199  48.137859   8.867916
2                   Berlin  21463.044514  13.387224  52.533707  17.000000
3              Brandenburg  19622.567766  13.070526  52.405476  11.408003
4                   Bremen  16197.013903   8.805129  53.081386   1.000000
5                  Hamburg  18426.436184  10.001104  53.554158   7.773747

И вызов scatter_mapbox () теперь использует столбец "масштаб" для параметра размера:

fig = px.scatter_mapbox(all_data, lat="lat", lon="long", hover_name="country", hover_data=["country", "mean"], 
                        color="mean",
                        size=all_data["scale"], color_continuous_scale=px.colors.sequential.Rainbow,
                        size_max=50, zoom=5, height=1000, mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

Теперь результат выглядит лучше:

применено масштабирование к размеру -параметр

0 голосов
/ 05 августа 2020

Ваш код правильный. Размер не был заметен из-за схожести данных субъекта с размером. Я намеренно изменил данные Бремена до большего размера, чтобы нарисовать график. Другое исправление - изменить size_max. Я также изменил цвет пузыря на цвет, который не смешивается с картой.

import pandas as pd
import numpy as np
import io

data = '''
 country average long lat
0 Baden-Württemberg  19166.381092 9.179330 48.781956
1 Bayern 18786.556728 11.572199 48.137859
2 Berlin 21463.044514 13.387224 52.533707
3 Brandenburg 19622.567766 13.070526 52.405476
4 Bremen 46197.013903 8.805129 53.081386 # average value update
5 Hamburg 18426.436184 10.001104 53.554158
'''

all_data = pd.read_csv(io.StringIO(data), sep='\s+')

import plotly.express as px

fig = px.scatter_mapbox(all_data, lat="lat", lon="long", hover_name="country", hover_data=["country", "average"], 
                        color="average",
                        size="average", color_continuous_scale=px.colors.sequential.Rainbow, size_max=40,
                        zoom=5, height=1000, mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})

fig.show()

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...