Plotly:如何在单个 plotly 地图图中使用两个色标?

Plotly: How to use two color scales in a single plotly map figure?

我想使用 plotly 在 choropleth_mapbox 绘图上绘制 scatter_mapbox 绘图。我想将 Picnic 用于 scatter_mapbox 图的色标。当我 运行 时,scatter_mapbox 色标设置为与 choropleth_mapbox 属性相同的属性。即,它使用 Viridis 色标而不是 Picnic,并使用 choropleth 的数值标度。如何制作散点图野餐的色阶。

import numpy as np
import pandas as pd
import geopandas as gpd
import plotly.express as px
import geopandas as gpd
import shapely

df = px.data.election()
df = gpd.GeoDataFrame.from_features(
    px.data.election_geojson()["features"]
).merge(df, on="district").set_index("district")
df = df.loc[df['geometry'].map(lambda x: type(x) == shapely.geometry.polygon.Polygon)]
df2 = df.copy()
df2['geometry'] = df2['geometry'].map(lambda x: x.exterior.coords[0]).map(shapely.geometry.Point)


#make the charts
map_fig = px.choropleth_mapbox(
    df, 
    geojson=df.geometry, 
    locations=df.index, 
    color='Bergeron',
    center= { 'lon': df2.geometry.x.iloc[0], 'lat': df2.geometry.y.iloc[0]}, 
    color_continuous_scale="Viridis",
    mapbox_style="carto-positron",
    opacity = 0.2,
)

map_fig2 = px.scatter_mapbox(
    df2,
    lat=df2.geometry.y,
    lon=df2.geometry.x,
    size='Bergeron',
    zoom=12,
    color='Bergeron', color_continuous_scale='Picnic', 
    opacity = 1, 
    size_max=10
)

map_fig.add_trace(map_fig2.data[0])
map_fig.update_geos(fitbounds="locations", visible=False)


map_fig.show()

正确方向的一步是添加这个,它将 scatter_mapbox 放在单独的色轴上,但将色标设置为绘图默认值 Plasma,而不是指定的 Picnic。它还覆盖了颜色条。

    'color' : np.array(df2['Bergeron']),
    'coloraxis' : 'coloraxis2',
    'opacity' : 1,
    'colorscale' : 'Picnic',
    'sizemode' : 'area',
    'sizeref' : .01,
    'autocolorscale' : False
}

如果这是您的目标:

除了您已经执行的操作之外,还可以执行以下步骤:

1.fig2 窃取色轴,其中 color='Picnic'fig 与:

fig.layout.coloraxis2 = fig2.layout.coloraxis

2. 包含第二条轨迹:

fig.add_trace(fig2.data[0])

3. 为第二条迹线分配颜色:

fig['data'][1]['marker'] = {    'color' : np.array(df2['Bergeron']),
                                    'coloraxis' : 'coloraxis2',
                                }

4. 将第二个颜色条移动到更合适的位置:

fig.layout.coloraxis2.colorbar.x = -0.2

第三步通过'coloraxis' : 'coloraxis2'

使第二条迹线的颜色可用

我希望这就是您要找的。如果没有,请随时告诉我!

完整代码:

(抱歉,我厌倦了输入 map_fig,所以我将引用更改为仅 fig

import numpy as np
import pandas as pd
import geopandas as gpd
import plotly.express as px
import geopandas as gpd
import shapely

df = px.data.election()
df = gpd.GeoDataFrame.from_features(
    px.data.election_geojson()["features"]
).merge(df, on="district").set_index("district")
df = df.loc[df['geometry'].map(lambda x: type(x) == shapely.geometry.polygon.Polygon)]
df2 = df.copy()
df2['geometry'] = df2['geometry'].map(lambda x: x.exterior.coords[0]).map(shapely.geometry.Point)


#make the charts
fig = px.choropleth_mapbox(
    df, 
    geojson=df.geometry, 
    locations=df.index, 
    color='Bergeron',
    center= { 'lon': df2.geometry.x.iloc[0], 'lat': df2.geometry.y.iloc[0]}, 
    color_continuous_scale="Viridis",
    mapbox_style="carto-positron",
    opacity = 0.2,
)

fig2 = px.scatter_mapbox(
    df2,
    lat=df2.geometry.y,
    lon=df2.geometry.x,
    size='Bergeron',
    zoom=12,
    color='Bergeron',
    color_continuous_scale='picnic',
    opacity = 1, 
    size_max=10
)

fig.add_trace(fig2.data[0])
fig.layout.coloraxis2 = fig2.layout.coloraxis
fig['data'][1]['marker'] = {    'color' : np.array(df2['Bergeron']),
                                    'coloraxis' : 'coloraxis2',
                                    'opacity' : 1,
                                    'sizemode' : 'area',
                                    'sizeref' : .01,
                                    'autocolorscale' : False
                                }

fig.update_geos(fitbounds="locations", visible=False)
fig.layout.coloraxis2.colorbar.x = -0.2
fig.show()