【问题标题】:Plotly: How to get the trace color attribute in order to plot selected marker with same color?Plotly:如何获取跟踪颜色属性以绘制具有相同颜色的选定标记?
【发布时间】:2020-08-04 18:57:01
【问题描述】:

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

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()

【问题讨论】:

    标签: python colors plotly plotly-python


    【解决方案1】:

    更新了 plotly 版本的答案:

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

    fig.data[0].line.color
    

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

    markers = {'trace01':[[2,5], [4,9]],
               'trace02':[[3,9]]}
    

    而我获得下图的方法的本质是这个 sn-p:

    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']
    

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

    如果您研究下面的代码 sn-p,您会发现我与您不同,没有在与行相同的过程中定义标记。相反,我使用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']
    

    下面的 sn-p 将生成与之前完全相同的图形,但无需定义迹线的颜色。

    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()
    

    【讨论】:

    • fig['data'][0]['line']['color'] 总是为我返回 None。
    • 同样的问题 - 如果不先明确定义颜色,则无法检索颜色 fig.data[0].line.color 。在至少相当新的 plotly 版本 5.3.1 中也不能按预期工作,但是可以通过color=px.colors.qualitative.Plotly[trace_index]
    【解决方案2】:

    除了上面的答案,记住px.colors.qualitative.Plotly中的Plotly是当前模板中使用的配色方案的名称,默认为Plotly。您可以使用其他配色方案,通过这样做检查它们的名称和颜色

    import plotly.express as px
    
    fig = px.colors.qualitative.swatches()
    fig.show()
    

    [参考:https://plotly.com/python/discrete-color/]

    【讨论】:

      【解决方案3】:

      @vestland 答案的变化使用相同的迭代器但使用update_traces 和selector。 适用于本示例,但可能不适用于更复杂的颜色配置?
      实际上,我认为这只是将标记颜色设置为空,然后选择默认颜色序列。

      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()
      

      【讨论】:

        猜你喜欢
        • 2018-06-13
        • 1970-01-01
        • 2020-07-12
        • 2021-09-16
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多