Вопрос или проблема
Субграфик карты хлорофилла Plotly
У меня есть dataframe geopandas, как показано ниже. Я хочу создать подграфики, где каждая подграфика будет картой.
Мне удалось сделать один график, используя plotly express.
p4 = px.choropleth(s_new_cp, geojson=s_new_cp.geometry, color = "usage", locations = s_new_cp.index)
p4.update_geos(fitbounds="locations", visible = False)
Но я не могу заставить это работать с подграфиками. Есть идеи, как нарисовать карты в подграфиках?
p5 = make_subplots(rows = 1, cols = 2, specs = [[{"type":"mapbox"},{"type" :"mapbox"}]])
p5.add_trace(go.Choroplethmapbox(
geojson=s_new_cp.geometry,
locations = s_new_cp.index,
z = s_new_cp.usage
), row = 1, col = 1)
>>> TypeError: Объект типа Polygon не может быть сериализован в JSON
DataFrame: s_new_cp
print(s_new_cp)
area new usage n_obs y estimate geometry
0 BARINGO 1 0.347646 0 0 0.000000 POLYGON ((35.7839 1.65557, 35.78496 1.65554, 3...
1 BOMET 1 0.816969 0 0 0.000000 POLYGON ((35.4736 -0.3992, 35.47845 -0.40663, ...
2 BUNGOMA 1 0.465844 29 29 0.227280 POLYGON ((34.62017 1.10228, 34.62133 1.1016, 3...
3 BUSIA 1 0.713608 40 39 0.445942 POLYGON ((34.36097 0.7773, 34.36172 0.77696, 3...
4 ELGEYO MARAKWET 1 0.168763 1 0 0.027333 POLYGON ((35.69818 1.28225, 35.69788 1.27905, ...
Ответ или решение
Для создания субплотов с картами в Plotly, используя GeoPandas DataFrame, необходимо учитывать, что геометрия в формате Polygon не может быть напрямую сериализована в JSON. Вместо этого, вам нужно конвертировать вашу геометрию в формат, который поддерживается Plotly, например, с помощью метода to_json()
.
Ниже приведен пример кода, который демонстрирует, как создать субплоты с картами, используя ваши данные:
import geopandas as gpd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import json
# Пример вашего GeoDataFrame
s_new_cp = gpd.read_file('path_to_your_geodatafile.geojson') # должен быть заменён на актуальный путь к вашим данным
# Преобразуйте геометрию в JSON
s_new_cp['geometry'] = s_new_cp['geometry'].apply(lambda x: json.loads(x.to_json()))
# Создайте субплоты
p5 = make_subplots(rows=1, cols=2, specs=[[{"type":"choropleth"},{"type" :"choropleth"}]])
# Добавьте первый субплот
p5.add_trace(go.Choropleth(
geojson=s_new_cp['geometry'],
locations=s_new_cp.index,
z=s_new_cp['usage'],
colorscale='Viridis',
marker_line_color='white',
colorbar_title='Usage'
), row=1, col=1)
# Добавьте второй субплот (можно использовать аналогичные данные или другую метрику)
p5.add_trace(go.Choropleth(
geojson=s_new_cp['geometry'],
locations=s_new_cp.index,
z=s_new_cp['n_obs'], # пример другой метрики
colorscale='Viridis',
marker_line_color='white',
colorbar_title='Observations'
), row=1, col=2)
# Обновите настройки карты
p5.update_geos(fitbounds="locations", visible=False)
# Отобразите фигуру
p5.show()
Пояснение к коду:
-
Преобразование геометрии: Мы преобразуем геометрию в формате Polygon в JSON, используя метод
to_json()
. Это необходимо для корректной работы с Plotly. -
Создание субплотов: Мы используем
make_subplots()
с указанием, что тип каждого субплота будет "choropleth". -
Добавление данных: Мы добавляем гео-карты в каждый субплот, используя метод
add_trace()
. Здесь можно адаптировать данные для каждого сабплота. -
Обновление настроек карт: Используется метод
update_geos()
, чтобы настроить отображение карты. - Вывод результата: Используется
show()
, чтобы визуализировать график.
Таким образом, следуя данным шагам, вы сможете успешно создать субплоты с картами на основе вашего GeoDataFrame.