Plotly:如何使用 go.Figure 和 go.Scatter 为每个 y 误差条设置单独的颜色?

Plotly: How to set individual color for each y error bar using go.Figure and go.Scatter?

我正在使用 Plotly 在 Python 中创建带有误差线的散点图。但是,我无法将颜色代码应用于错误栏。在 Plotly documentation 中,错误栏颜色将只需要一个 'single color',因此当我添加颜色列表时它会失败。我该如何解决这个问题?

我提供了示例代码和我得到的情节。如果我在错误字典中删除颜色命令中的#,代码将出错。

import numpy as np
import plotly.graph_objects as go

x_data = ['10 days', '20 days', '30 days']
y_data = [0.5, 0.8, 0.4]
err_y_data = [0.1, 0.2, 0.05]

colors = ['rgba(93, 164, 214, 0.7)', 'rgba(255, 144, 14, 0.7)', 'rgba(44, 160, 101, 0.7)']

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=x_data,
    y=y_data,
    text=np.round(y_data, 1),
    mode='markers+text',
    textposition='top center',
    error_y=dict(
        type='data',
        #color = colors,
        array=err_y_data,
        visible=True),
    marker=dict(color=colors, size=12)
))

fig.show()

我得到以下情节,

但是,理想情况下,我希望误差线与相应标记的颜色相同。我不能使用 plotly express,因为我必须创建子图,并且需要控制。

这完全没有问题,只要您像这里 err_y_data = [0.1, 0.2, 0.05] 一样获得 y_error 数据。您不能向 one trace 的误差条添加多种颜色,但您 can 为每个误差条添加一个 trace,除其他外,使用:

for i, bar in enumerate(err_y_data):
    fig.add_trace(go.Scatter(
                    x=[x_data[i]],
                    y=[y_data[i]],
                    error_y=dict( type='data',color = colors[i],array=[bar],visible=True),
                    marker=dict(color='rgba(0,0,0,0)', size=12),
                    showlegend=False
                ))

剧情:

完整代码:

import numpy as np
import plotly.graph_objects as go

x_data = ['10 days', '20 days', '30 days']
y_data = [0.5, 0.8, 0.4]
err_y_data = [0.1, 0.2, 0.05]

colors = ['rgba(93, 164, 214, 0.7)', 'rgba(255, 144, 14, 0.7)', 'rgba(44, 160, 101, 0.7)']

fig = go.Figure()

fig.add_trace(go.Scatter(x=x_data, y=y_data,
                            text=np.round(y_data, 1),
                            mode='markers+text',
                            textposition='top center',
                        #     error_y=dict(
                        #         type='data',
                        #         #color = colors,
                        #         array=err_y_data,
                        #         visible=True),
                            marker=dict(color=colors, size=12),
                            showlegend=False
            ))

for i, bar in enumerate(err_y_data):
    fig.add_trace(go.Scatter(
                    x=[x_data[i]],
                    y=[y_data[i]],
                   # text=np.round(y_data, 1),
                    mode='markers+text',
                    textposition='top center',
                    error_y=dict(
                        type='data',
                        color = colors[i],
                        array=[bar],
                        visible=True),
                    marker=dict(color='rgba(0,0,0,0)', size=12),
                    showlegend=False
                ))

fig.show()