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()
我想使用 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()