繁体   English   中英

plot错误栏用plotly快递不行

[英]plot error bar with plotly express not work

我尝试 plot 错误栏与 plotly 表达但它报告错误:输入元素是 3 但它说 error_y 大小是 6:

ValueError: All arguments should have the same length. The length of argument `error_y` is 6, whereas the length of  previously-processed arguments ['x', 'y'] is 3

代码:

import plotly.express as px
import pandas as pd
import numpy as np
from io import StringIO

def save_fig(fig,pngname):
    fig.write_image(pngname,format="png", width=800, height=300, scale=1)
    print("[[%s]]"%pngname)
    #plt.show()
    return

def date_linspace(start, end, steps):
    delta = (end - start) / (steps-1)
    increments = range(0, steps) * np.array([delta]*steps)
    return start + increments

def plot_timedelta(x,y,colors,pngname):
    fig = px.scatter(
        x=x,
        y=y,
        color=colors,
        error_y=dict(
            type='data',
            symmetric=False,
            arrayminus=y,
            array=[0] * len(y),
            thickness=1,
            width=0,
        ),         
    )
    
    tickvals = date_linspace(x.min(),x.max(),15)
    print(x.min(),x.max())
    layout =dict(
        title="demo",
        xaxis_title="X",
        yaxis_title="Y",
        title_x=0.5,   
        margin=dict(l=10,t=20,r=0,b=40),
        height=300,
        xaxis=dict(
            tickangle=-25,
            tickvals = tickvals,
            ticktext=[d.strftime('%m-%d %H:%M:%S') for d in tickvals]
        ),
        yaxis=dict(
            showgrid=True,
            zeroline=False,
            showline=False,
            showticklabels=True
        )
    )

    fig.update_traces(
        marker_size=14,
    )    
    fig.update_layout(layout)
    
    save_fig(fig,pngname)
    return

def get_delta(df):
    df['delta'] = df['ts'].diff().dt.total_seconds()
    df['prev'] = df['ts'].shift(1)
    print("delta min:",df['delta'].min())
    print("delta max:",df['delta'].max())
    #df = df[df['delta'] >= 40]    
    return df

data = """ts,source
2022-12-12 15:46:20.350,izat
2022-12-12 15:46:36.372,skyhook
2022-12-12 15:46:37.181,skyhook
"""

csvtext = StringIO(data)

df = pd.read_csv(csvtext, sep=",")
df['ts'] = pd.to_datetime(df['ts'])
df = get_delta(df)
df['delta'] = df['delta'].fillna(0)
plot_timedelta(df['ts'],df['delta'],df['source'],"demo.png")

发生这种情况是因为px.scatter期望error_yerror_y_minus参数都是(str or int or Series or array-like)并且它正在评估您传递给error_y的字典的长度。

我相信您混淆了px.scattergo.Scattererror_y参数类型,因为如果您使用 go.Scatter(如此处所示),您只将字典传递给 error_y 参数。

如果您想继续使用px.scatter ,您可以通过以下方式实现负误差条(并且没有正误差条):

fig = px.scatter(
    x=x,
    y=y,
    color=colors,
    error_y=[0] * len(y),
    error_y_minus=y       
)

进行此更改后,您的代码运行,我将save_fig(fig,pngname)替换为fig.show()以检查 output:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM