如何用Plotly创建各标记单独着色的3D散点图及相关问题
问题:Plotly 3D散点图实现按值着色及添加颜色条
问题背景
想要在Jupyter Notebook中用Plotly实现类似Matplotlib plt.scatter(x,y,c=z)的效果,让3D散点图每个标记按指定数值单独着色,并添加颜色条,尝试的代码如下:
cmap = matplotlib.colormaps['brg'] param = "elevation_deg" min_value = min(vector) max_value = max(vector) range_ = max_value - min_value colors = [] for value in vector: rgba = cmap((value-min_value)/range_) colors.append(f"rgb({int(255*rgba[0])},{int(255*rgba[1])},{int(255*rgba[2])})") # Configure the trace. trace = go.Scatter3d( x=x, y=y, z=z, mode='markers', marker=dict(colors, size=10) )
运行错误
执行代码后出现如下错误:
ValueError: dictionary update sequence element #0 has length 13; 2 is required
解决方案
错误原因
marker=dict(colors, size=10)写法错误:dict()需要接收键值对序列,你直接传入颜色列表会导致解析失败,正确做法是将颜色列表赋值给marker字典的color键;更简便的方式是直接利用Plotly内置的颜色映射功能,无需手动转换RGB值。
方法1:简化实现(推荐)
直接用Plotly内置功能,无需依赖Matplotlib,自动生成颜色条:
import plotly.graph_objects as go # 假设x、y、z、vector为对应数值数组 trace = go.Scatter3d( x=x, y=y, z=z, mode='markers', marker=dict( size=10, color=vector, # 传入用于着色的数值数组 colorscale='BrBG', # 对应Matplotlib的brg色卡,Plotly命名为BrBG colorbar=dict(title='elevation_deg') # 配置颜色条标题,替代plt.colorbar() ) ) # 生成并展示图表 fig = go.Figure(data=[trace]) fig.show()
方法2:修复原代码
如果坚持用Matplotlib的色卡,需修正marker的参数写法:
import matplotlib.pyplot as plt import plotly.graph_objects as go cmap = plt.colormaps['brg'] param = "elevation_deg" min_value = min(vector) max_value = max(vector) range_ = max_value - min_value colors = [] for value in vector: rgba = cmap((value - min_value)/range_) colors.append(f"rgb({int(255*rgba[0])},{int(255*rgba[1])},{int(255*rgba[2])})") # 修正marker参数结构 trace = go.Scatter3d( x=x, y=y, z=z, mode='markers', marker=dict( size=10, color=colors # 将颜色列表赋值给color键 ) ) # 注意:手动生成RGB的方式无法自动生成颜色条,如需颜色条建议用方法1 fig = go.Figure(data=[trace]) fig.show()
关键说明
- Plotly的色卡命名与Matplotlib略有差异,比如Matplotlib的
brg对应Plotly的BrBG,直接使用内置色卡名称即可,无需手动转换颜色值。 - 方法1中通过
colorbar参数可直接配置颜色条的标题、位置等属性,完全替代Matplotlib的plt.colorbar()功能。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

