Plotly:如何获取跟踪颜色属性以绘制具有相同颜色的选定标记?

Chr*_*ian 8 python colors plotly plotly-python

我正在尝试为我的每个跟踪绘制一个选定的标记。我想为标记和线条分配相同的颜色。有没有办法获得我的痕迹的颜色属性?

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

ves*_*and 10

更新版本的 plotly 的更新答案:

对于最近的绘图版本,绘​​图图形对象的大量属性可以通过fig.data. 现在,您可以在不定义线条或遵循颜色循环的情况下检索线条的颜色:

fig.data[0].line.color
Run Code Online (Sandbox Code Playgroud)

与我的原始答案相比,为了使事情更加灵活,我整理了一个示例,您可以在同一行上有多个标记。标记在字典中组织如下:

markers = {'trace01':[[2,5], [4,9]],
           'trace02':[[3,9]]}
Run Code Online (Sandbox Code Playgroud)

我获得下面情节的方法的本质是这个片段:

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)
                                     )
                          )
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到我实际上并没有使用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]:
Run Code Online (Sandbox Code Playgroud)

阴谋:

在此处输入图片说明

完整代码:

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()
Run Code Online (Sandbox Code Playgroud)

旧版本的原始答案

您可以使用以下方法检索跟踪的颜色:

fig['data'][0]['line']['color']
Run Code Online (Sandbox Code Playgroud)

但是您必须指定跟踪的颜色才能这样做。或者您可以确保标记的颜色与迹线的顺序相同。但是,如果这实际上是您要完成的任务,我们可以了解所有详细信息:

在此处输入图片说明

如果您研究下面的代码片段,您会发现我与您不同,没有在与行相同的过程中定义标记。相反,我已将跟踪添加为纯线条,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()
Run Code Online (Sandbox Code Playgroud)

编辑 1:如何通过引用默认颜色序列来做同样的事情

默认情况下,plotly 遵循可以使用px.colors.qualitative.Plotly以下方法找到的颜色序列:

['#636EFA',
 '#EF553B',
 '#00CC96',
 '#AB63FA',
 '#FFA15A',
 '#19D3F3',
 '#FF6692',
 '#B6E880',
 '#FF97FF',
 '#FECB52']
Run Code Online (Sandbox Code Playgroud)

以下代码段将生成与之前完全相同的图形,但无需定义迹线的颜色。

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()
Run Code Online (Sandbox Code Playgroud)

  • `fig['data'][0]['line']['color']` 对我来说总是返回 `None` 。 (3认同)
  • 同样的问题 - 如果没有首先显式定义颜色“fig.data[0].line.color”,则无法检索颜色。在至少相当新的绘图版本 5.3.1 中也不能按预期工作,但是可以获得绘图对象的默认颜色(如果尚未明确设置并且只需要复制已用于其他对象的默认颜色,则很有用) `color=px.colors.qualitative.Plotly[trace_index]` (3认同)