Plotly:一条线,不同的颜色

Plotly: one line, different colors

我想用 Plotly 或 Plotly.Express 制作一个二维图,其中图形的单条线有不同的颜色。也就是说,我有一个 x 值列表和一个 y 值列表,它们指向我的图表上应该连接的点。连接线的颜色取决于第三个给定列表。 (当你熟悉我的例子时,你会注意到 color_list 的最后一个条目不用于给线条着色。但这不是问题,也不是这个问题的主题。)
列表 x_listy_listcolor_list 应该被认为有很多条目(而不是我的示例中的六个)。

一开始,我只是简单地使用了Plotly.Express来绘制散点图:

# file mwe1.py

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

x_list = [1,2,3,4,5,6]
y_list = [5,1,1,4,1,3]
color_list = [0,2,0,2,2,1]

px.scatter(x=x_list,
           y=y_list,
           color=color_list).show()

这个程序运行没有问题,画出下图:

除了很亮很难看的黄色,这个还不错
我想做的改变是:用线连接点(我将使用“水平-垂直”模式,但如果这是一个限制,模式不是太重要。)如果颜色被识别也会很棒作为定性尺度,而不是连续尺度。

为了尝试获得点之间的连接线,我编写了以下程序:

# file mwe2.py

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

x_list = [1,2,3,4,5,6]
y_list = [5,1,1,4,1,3]
color_list = [0,2,0,2,2,1]

px.line(x=x_list,
        y=y_list,
        color=color_list).show()

这产生了以下混乱:

Plotly 认为我想要每种颜色一个图形,这当然是一个很酷的功能,但在这种情况下不适合我的需要。 (然而,颜色图例现在更好了,而不是之前的连续比例。)
由于我在互联网上搜索没有成功(该问题在 Whosebug 上经常弹出,但似乎没有针对所需绘图的简单解决方案),我尝试自己构建图形。以下代码说明了这种方法:

# file mwe3.py

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

x_list = [1,2,3,4,5,6]
y_list = [5,1,1,4,1,3]
color_list = [0,2,0,2,2,1]

fig = make_subplots()

# now add the segments manually
for i in range(5):
    fig.add_trace(go.Scatter(
                             x=x_list[i:i+2],
                             y=y_list[i:i+2],
                             line_shape='hv'
                            )
                 )

fig.show()

这种方法还没有考虑到所需的颜色,但到目前为止它是有效的:

太糟糕了,我想要尊重颜色。这就是我尝试以下操作的原因:

# file mwe4.py

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

x_list = [1,2,3,4,5,6]
y_list = [5,1,1,4,1,3]
color_list = [0,2,0,2,2,1]

fig = make_subplots()

# now add the segments manually
for i in range(5):
    fig.add_trace(go.Scatter(
                             x=x_list[i:i+2],
                             y=y_list[i:i+2],
                             line_shape='hv',
                             color=color_list[i]
                            )
                 )

fig.show()

此程序 运行 不正确。我收到一条很长的错误消息,其本质是没有有效的 属性 称为 color

我能做什么?本着 mwe1.pymwe2.py 的精神,我几乎已经放弃希望有一个简单的解决方案。所以我会很感激提示我如何控制添加的轨迹的颜色。

  • 已多次阅读您的问题...我相信这样做
  • 实际上 color_list 是离散颜色映射,因此使用值从 px.colors.qualitative.Plotly
  • 中查找离散颜色
  • 为每对坐标生成轨迹
import plotly.graph_objects as go
import plotly.express as px

x_list = [1, 2, 3, 4, 5, 6]
y_list = [5, 1, 1, 4, 1, 3]
color_list = [0, 2, 0, 2, 2, 1]


go.Figure(
    [
        go.Scatter(
            x=x_list[tn : tn + 2],
            y=y_list[tn : tn + 2],
            line_shape="hv",
            line_color=px.colors.qualitative.Plotly[color_list[tn]],
            showlegend=False,
        )
        for tn in range(len(x_list))
    ]
).show()

进一步提示:

  • 如果您不希望点(所谓的标记)出现在您的绘图中,请在调用 go.Scatter(...) 时使用参数 mode="lines"
  • 如果 color_list 包含超过 10 个索引,列表 px.colors.qualitative.Plotly 是不够的。看看 these options.