0

我想用 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()

该程序运行无故障,绘制如下图:

mwe1.py 的输出

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

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

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

这产生了以下混乱:

mwe2.py 的输出

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

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

这种方法还不尊重所需的颜色,到目前为止它有效:

mwe3.py 的输出

太糟糕了,我希望色彩得到尊重。这就是我尝试以下方法的原因:

# 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。所以我会很感激提示我如何控制添加的痕迹的颜色。

4

1 回答 1

1
  • 已多次阅读您的问题...我相信这样做
  • 实际上color_list是一个离散的颜色图,所以使用 value 来查找一个离散的颜色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()

构造图的情节

进一步提示:

  • 如果您不希望点(所谓的标记)出现在绘图中,请mode="lines"在调用go.Scatter(...).
  • 如果color_list包含超过 10 个索引,则该列表px.colors.qualitative.Plotly是不够的。看看这些选项
于 2021-10-27T16:01:29.817 回答