Plotly:如何获取轨迹颜色属性以绘制具有相同颜色的选定标记?
Plotly: How to get the trace color attribute in order to plot selected marker with same color?
我正在尝试为我的每条轨迹绘制一个选定的标记。我想为标记和线条分配相同的颜色。有没有办法获取我的痕迹的颜色属性?
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines+markers',
marker=dict(size=[0, 0, 30, 0, 0, 0],
color=[0, 0, 10, 0, 0, 0])
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines+markers',
marker=dict(size=[0, 0, 0, 30, 0, 0],
color=[0, 0, 0, 10, 0, 0])
))
fig.show()
plotly 新版本的更新答案:
对于最近的 plotly 版本,通过 fig.data
可以读取 plotly 图形对象的大量属性。现在您可以检索线条的颜色而无需定义它或遵循颜色循环:
fig.data[0].line.color
为了使事情比我原来的答案更灵活一些,我整理了一个示例,您可以在同一行上放置多个标记。标记在字典中组织如下:
markers = {'trace01':[[2,5], [4,9]],
'trace02':[[3,9]]}
我获得下面情节的方法的本质是这个片段:
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
fig.add_traces(go.Scatter(x=[m[0]], y = [m[1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=d.line.color,size=15)
)
)
在这里您可以看到我实际上并没有使用 fig.data[0].line.color
,而是 color=d.line.color
,因为我已经通过 :
将标记与轨迹的名称进行了匹配
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
剧情:
完整代码:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
line=dict(color='blue'),
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
line=dict(color='red'),
mode='lines'
))
markers = {'trace01':[[2,5], [4,9]],
'trace02':[[3,9]]}
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
fig.add_traces(go.Scatter(x=[m[0]], y = [m[1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=d.line.color,size=15)
)
)
fig.show()
旧版本的原始答案
您可以使用以下方法检索轨迹的颜色:
fig['data'][0]['line']['color']
但是您必须指定轨迹的颜色才能这样做。或者您可以确保标记的颜色遵循与轨迹相同的顺序。但如果这实际上是您想要完成的,我们可以了解所有细节:
如果您研究下面的代码片段,您会发现与您不同的是,我没有在定义线条的同时定义标记。相反,我使用 mode='lines'
添加了作为纯线的轨迹,然后使用 mode='markers'
为标记添加了单独的轨迹。在执行后者时,我在循环中使用 color=data['line']['color']
检索了相应行的颜色:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
line=dict(color='blue'),
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
line=dict(color='red'),
mode='lines'
))
markers = [[2,5],
[3,9]]
for i, data in enumerate(fig['data']):
#print(data['line']['color'])
fig.add_trace(go.Scatter(x=[markers[i][0]], y=[markers[i][1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=data['line']['color'],
size=15
)))
fig.show()
编辑 1:如何通过引用默认颜色序列来实现同样的效果
默认情况下,plotly 遵循可以使用 px.colors.qualitative.Plotly
:
找到的颜色序列
['#636EFA',
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
以下代码片段将生成与之前完全相同的图形,但无需定义轨迹的颜色。
import plotly.graph_objects as go
import plotly.express as px
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines'
))
colors = px.colors.qualitative.Plotly
markers = [[2,5],
[3,9]]
for i, data in enumerate(fig['data']):
#print(data['line']['color'])
fig.add_trace(go.Scatter(x=[markers[i][0]], y=[markers[i][1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=colors[i],
size=15
)))
fig.show()
添加到上面的答案中,记住px.colors.qualitative.Plotly
中的Plotly
是当前模板中使用的配色方案的名称,默认为Plotly
。您可以使用其他配色方案,通过这样做检查它们的名称和颜色
import plotly.express as px
fig = px.colors.qualitative.swatches()
fig.show()
使用相同迭代器但使用 update_traces
和 selector
的 @vestland 答案的变体。
适用于此示例,但可能不适用于更复杂的颜色配置?
实际上,我认为这只是将标记颜色设置为空,然后选择默认颜色序列。
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines+markers',
marker=dict(size=[0, 0, 30, 0, 0, 0],
color=[0, 0, 10, 0, 0, 0])
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines+markers',
marker=dict(size=[0, 0, 0, 30, 0, 0],
color=[0, 0, 0, 10, 0, 0])
))
# Set marker line color to same color as marker for each trace
for i, data in enumerate(fig['data']):
fig.update_traces(marker_color=data['line']['color'],
selector=dict(name=data['name']))
fig.show()
我正在尝试为我的每条轨迹绘制一个选定的标记。我想为标记和线条分配相同的颜色。有没有办法获取我的痕迹的颜色属性?
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines+markers',
marker=dict(size=[0, 0, 30, 0, 0, 0],
color=[0, 0, 10, 0, 0, 0])
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines+markers',
marker=dict(size=[0, 0, 0, 30, 0, 0],
color=[0, 0, 0, 10, 0, 0])
))
fig.show()
plotly 新版本的更新答案:
对于最近的 plotly 版本,通过 fig.data
可以读取 plotly 图形对象的大量属性。现在您可以检索线条的颜色而无需定义它或遵循颜色循环:
fig.data[0].line.color
为了使事情比我原来的答案更灵活一些,我整理了一个示例,您可以在同一行上放置多个标记。标记在字典中组织如下:
markers = {'trace01':[[2,5], [4,9]],
'trace02':[[3,9]]}
我获得下面情节的方法的本质是这个片段:
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
fig.add_traces(go.Scatter(x=[m[0]], y = [m[1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=d.line.color,size=15)
)
)
在这里您可以看到我实际上并没有使用 fig.data[0].line.color
,而是 color=d.line.color
,因为我已经通过 :
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
剧情:
完整代码:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
line=dict(color='blue'),
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
line=dict(color='red'),
mode='lines'
))
markers = {'trace01':[[2,5], [4,9]],
'trace02':[[3,9]]}
for d in fig.data:
if d.name in markers.keys():
for m in markers[d.name]:
fig.add_traces(go.Scatter(x=[m[0]], y = [m[1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=d.line.color,size=15)
)
)
fig.show()
旧版本的原始答案
您可以使用以下方法检索轨迹的颜色:
fig['data'][0]['line']['color']
但是您必须指定轨迹的颜色才能这样做。或者您可以确保标记的颜色遵循与轨迹相同的顺序。但如果这实际上是您想要完成的,我们可以了解所有细节:
如果您研究下面的代码片段,您会发现与您不同的是,我没有在定义线条的同时定义标记。相反,我使用 mode='lines'
添加了作为纯线的轨迹,然后使用 mode='markers'
为标记添加了单独的轨迹。在执行后者时,我在循环中使用 color=data['line']['color']
检索了相应行的颜色:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
line=dict(color='blue'),
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
line=dict(color='red'),
mode='lines'
))
markers = [[2,5],
[3,9]]
for i, data in enumerate(fig['data']):
#print(data['line']['color'])
fig.add_trace(go.Scatter(x=[markers[i][0]], y=[markers[i][1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=data['line']['color'],
size=15
)))
fig.show()
编辑 1:如何通过引用默认颜色序列来实现同样的效果
默认情况下,plotly 遵循可以使用 px.colors.qualitative.Plotly
:
['#636EFA',
'#EF553B',
'#00CC96',
'#AB63FA',
'#FFA15A',
'#19D3F3',
'#FF6692',
'#B6E880',
'#FF97FF',
'#FECB52']
以下代码片段将生成与之前完全相同的图形,但无需定义轨迹的颜色。
import plotly.graph_objects as go
import plotly.express as px
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines',
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines'
))
colors = px.colors.qualitative.Plotly
markers = [[2,5],
[3,9]]
for i, data in enumerate(fig['data']):
#print(data['line']['color'])
fig.add_trace(go.Scatter(x=[markers[i][0]], y=[markers[i][1]],
mode='markers',
name=None,
showlegend=False,
marker=dict(color=colors[i],
size=15
)))
fig.show()
添加到上面的答案中,记住px.colors.qualitative.Plotly
中的Plotly
是当前模板中使用的配色方案的名称,默认为Plotly
。您可以使用其他配色方案,通过这样做检查它们的名称和颜色
import plotly.express as px
fig = px.colors.qualitative.swatches()
fig.show()
使用相同迭代器但使用 update_traces
和 selector
的 @vestland 答案的变体。
适用于此示例,但可能不适用于更复杂的颜色配置?
实际上,我认为这只是将标记颜色设置为空,然后选择默认颜色序列。
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[0, 3, 5, 7, 9, 11],
name='trace01',
mode='lines+markers',
marker=dict(size=[0, 0, 30, 0, 0, 0],
color=[0, 0, 10, 0, 0, 0])
))
fig.add_trace(go.Scatter(
x=[0, 1, 2, 3, 4, 5],
y=[3, 5, 7, 9, 11, 13],
name='trace02',
mode='lines+markers',
marker=dict(size=[0, 0, 0, 30, 0, 0],
color=[0, 0, 0, 10, 0, 0])
))
# Set marker line color to same color as marker for each trace
for i, data in enumerate(fig['data']):
fig.update_traces(marker_color=data['line']['color'],
selector=dict(name=data['name']))
fig.show()