如何在Plotly Express中为多组散点标记设置不同色阶?
问题描述
尝试绘制包含两组(或更多)点的3D散点图,每组点使用不同的色阶。修改Plotly Express示例代码后,所有点仍共用同一个inferno色阶,且仅显示一个颜色条。
非工作代码如下:
import numpy as np import pandas as pd import plotly.express as px npoints = 100 data1 = np.random.rand(npoints,4) columns = ['x','y','z','c'] df1 = pd.DataFrame(data1, columns=columns) fig = px.scatter_3d(df1, x='x', y='y', z='z', color='c', color_continuous_scale='inferno') fig.update_coloraxes(colorscale="inferno") fig.layout.coloraxis.colorbar.x = 1.1 # move 1st colorbar to make room for 2nd? data2 = 0.5*np.random.rand(npoints,4) df2 = pd.DataFrame(data2, columns=columns) fig2 = px.scatter_3d(df2, x='x', y='y', z='z', color='c', color_continuous_scale='viridis') fig2.update_coloraxes(colorscale="viridis") fig.add_traces(list(fig2.select_traces())) # add fig2 to fig fig.show()
实际结果:所有点使用同一inferno色阶,仅显示一个颜色条。
解决方法
核心问题是新增轨迹默认会关联到第一个coloraxis,导致共用色阶和颜色条。需为每组轨迹指定独立的颜色轴,并分别配置色阶与颜色条。
修正后的代码:
import numpy as np import pandas as pd import plotly.express as px npoints = 100 data1 = np.random.rand(npoints,4) columns = ['x','y','z','c'] df1 = pd.DataFrame(data1, columns=columns) fig = px.scatter_3d(df1, x='x', y='y', z='z', color='c', color_continuous_scale='inferno') # 调整第一组颜色条位置 fig.update_layout( coloraxis_colorbar=dict(x=1.1) ) data2 = 0.5*np.random.rand(npoints,4) df2 = pd.DataFrame(data2, columns=columns) fig2 = px.scatter_3d(df2, x='x', y='y', z='z', color='c', color_continuous_scale='viridis') # 为第二组轨迹指定独立颜色轴 for trace in fig2.select_traces(): trace['marker']['coloraxis'] = 'coloraxis2' # 将第二组轨迹加入主图 fig.add_traces(list(fig2.select_traces())) # 配置第二组颜色轴的色阶与颜色条位置 fig.update_layout( coloraxis2=dict( colorscale='viridis', colorbar=dict(x=1.3) ) ) fig.show()
关键说明
- 为第二组轨迹设置
coloraxis='coloraxis2',使其脱离默认的第一颜色轴 - 通过
update_layout分别定义两个颜色轴的色阶、颜色条位置,避免视觉重叠 - 最终两组点会使用各自的色阶,并显示对应的两个独立颜色条
内容的提问来源于stack exchange,提问作者sh37211
相关产品推荐
相关产品推荐

