Субграфик карты хлорофилла Plotly

Вопрос или проблема

Субграфик карты хлорофилла 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()

Пояснение к коду:

  1. Преобразование геометрии: Мы преобразуем геометрию в формате Polygon в JSON, используя метод to_json(). Это необходимо для корректной работы с Plotly.

  2. Создание субплотов: Мы используем make_subplots() с указанием, что тип каждого субплота будет "choropleth".

  3. Добавление данных: Мы добавляем гео-карты в каждый субплот, используя метод add_trace(). Здесь можно адаптировать данные для каждого сабплота.

  4. Обновление настроек карт: Используется метод update_geos(), чтобы настроить отображение карты.

  5. Вывод результата: Используется show(), чтобы визуализировать график.

Таким образом, следуя данным шагам, вы сможете успешно создать субплоты с картами на основе вашего GeoDataFrame.

Оцените материал
Добавить комментарий

Капча загружается...