#python #seaborn #geopandas #kernel-density #geoplot
#python #seaborn #геопанды #плотность ядра #геоплот
Вопрос:
Я пытаюсь использовать geoplot для построения тепловой карты распределения преступности в округе Сан-Франциско. Проблема в том, что когда я использовал набор данных из geoplot для рисования карты SF, оси x, y не отображаются. Я использую эту карту для своей финальной презентации, поэтому решил, что она будет более удобочитаемой для моей аудитории, если для нее будут отображаться оси (долгота и широта в качестве осей). Я искал столько документов, сколько мог, и пытался использовать ax.axis (‘on’), но не сработало. Я был бы очень признателен за любые советы. Спасибо (кстати, я делаю это на jupyter) df — это фрейм данных, который я использовал, который содержал 500 тыс. записей о преступлениях с местоположениями, содержащими долготу и широту.
gdf1 = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.Longitude, df.Latitude))
sf = gpd.read_file(gplt.datasets.get_path("san_francisco"))
count = gdf1
ax = gplt.polyplot(sf, projection=gcrs.AlbersEqualArea(),figsize=(10,10))
gplt.kdeplot(count, cmap="Reds", shade=True, clip=sf, ax=ax, cbar=True)
Ответ №1:
Geoplot построен поверх cartopy, и возвращаемые объекты axis кажутся обычными GeoAxis
объектами cartopy, поэтому вы должны иметь возможность использовать любые настройки фигуры, доступные в этой библиотеке. По умолчанию картографические графики не включают метки / метки оси, поскольку библиотека часто используется для построения в проекции, где значения x и y не соответствуют широте / широте.
Чтобы добавить линии сетки в картографию, используйте ax.gridlines
. Они будут корректно обрабатывать вашу проекцию и рисовать линии широты / долготы в виде контуров на вашей карте.
Из документации по добавлению линий сетки карты и меток:
ax.gridlines(draw_labels=True, dms=True, x_inline=False, y_inline=False)
Существует множество аргументов для линий сетки и способов их настройки, но, надеюсь, это поможет вам начать.
Ответ №2:
Альтернативный подход, при котором доступно больше геометрии, — это график плотности mapbox. Дополнительные слои могут быть добавлены, если требуется сетка.
import requests
import pandas as pd
import plotly.express as px
df = pd.json_normalize(
requests.get("https://data.sfgov.org/resource/wg3w-h783.json").json()
)
px.density_mapbox(
df,
lat="latitude",
lon="longitude",
radius=10,
color_continuous_scale="reds",
center=dict(
lat=df["latitude"].astype(float).mean(),
lon=df["longitude"].astype(float).mean(),
),
zoom=10,
mapbox_style="carto-positron",
).update_layout(margin={"t":0,"b":0,"l":300,"r":300})