首页 > 解决方案 > 在 Plotly 中,如何在组中使用色标时为图例点选择特定颜色?

问题描述

我正在 Plotly 中绘制一个 3d 散点图,类似于下面的示例。(尽管在实际图中,我在各个图层中绘制了更多数据组,因此图例中有多个条目。)我必须将色阶中的颜色添加到每组点。这有一个不幸的副作用,即导致图例中散点中的颜色本质上是该色标中的随机颜色,而不是指定的颜色(例如,在较暗的一端)。要查看此效果,请更改_ = nprand.sample(1)行中的数字几次,您应该会看到图例点中的蓝色阴影发生了变化。

import plotly.graph_objects as go
import numpy as np
import numpy.random as nprand

nprand.seed(1)
x = nprand.sample(100)
y = nprand.sample(100)
z = nprand.sample(100)
_ = nprand.sample(1)
color = nprand.sample(100)

trace = go.Scatter3d(x=x,
                     y=y,
                     z=z,
                     name="sample",
                     mode='markers',
                     marker=dict(
                         symbol='circle',
                         size=20,
                         color=color,
                         colorscale="Blues"))

fig = go.Figure(trace)
fig.update_layout(showlegend=True, legend=dict(bordercolor='black', itemwidth=100))
fig.show()

如何为图例中的点指定特定颜色?

标签: pythonplotly

解决方案


通常,图例元素的标题和颜色反映了它们所代表的迹线的属性。所以,如果你有blue踪迹,你就会得到一个blue传奇。在您在此处描述的情况下,图例的颜色会有所不同,因为与特定值关联的颜色会有所不同。而那个特殊的价值似乎是第一个元素:

fig.data[0].marker.color

示例内容:

array([0.8118587 , 0.87496164, 0.68841325, 0.56949441, 0.16097144,
       0.46688002, 0.34517205, 0.22503996, 0.59251187, 0.31226984,
       0.91630555, 0.90963552, 0.25711829, 0.1108913 , 0.19296273,
       0.49958417, 0.72858567, 0.20819444, 0.24803356, 0.85167187,
       0.41584872, 0.61668507, 0.23366614, 0.10196726, 0.51585702,
       0.47714099, 0.15267164, 0.62180623, 0.54401012, 0.65413735,
       0.14454554,

因此,在您的情况下,您可以将第一个元素设置为1在图例中获得较深的颜色。或者0在图例中获得较浅的颜色。像这样的方法当然有很多缺点,但这就是它的工作原理。

黑暗的fig.data[0].marker.color[0] = 1

在此处输入图像描述

fig.data[0].marker.color[0] = 0

在此处输入图像描述

完整代码:

import plotly.graph_objects as go
import numpy as np
import numpy.random as nprand

nprand.seed(1)
x = nprand.sample(100)
y = nprand.sample(100)
z = nprand.sample(100)
# _ = nprand.sample(1)
color = nprand.sample(100)

trace = go.Scatter3d(x=x,
                     y=y,
                     z=z,
                     name="sample",
                     mode='markers',
                     marker=dict(
                         symbol='circle',
                         size=20,
                         color=color,
                         colorscale="Blues"))

fig = go.Figure(trace)
fig.update_layout(showlegend=True, legend=dict(bordercolor='black', itemwidth=100))
fig.data[0].marker.color[0] = 0

fig.show()

推荐阅读