首页 > 解决方案 > Plotly:如何使用 go.Figure 和 go.Scatter 为每个 y 误差条设置单独的颜色?

问题描述

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

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

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,因为我必须创建子图,并且需要控制。

标签: pythonplotplotlyscatter-plot

解决方案


这完全没有问题,只要您像这里一样获得 y_error 数据err_y_data = [0.1, 0.2, 0.05]。您不能为一条迹线的误差条添加多种颜色,但您可以为每个误差条添加一条迹线,其中包括:

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

推荐阅读