【问题标题】:How to create plotly stacked bar chart with lines connecting the bars at corners如何创建带有连接角落条形的线条的堆积条形图
【发布时间】:2018-02-21 04:05:16
【问题描述】:

我正在尝试创建一个堆叠条形图,其中包含连接条形角的线条,如提供的图像中所示(条形之间的黑色虚线)。我在 Spyder 中离线使用 plotly 进行此操作。 我还想在这些(虚线)线上显示百分比变化。

我想要的:

到目前为止我的代码:

import plotly
import plotly.offline as offline
import plotly.plotly as py 
import plotly.graph_objs as go

trace1 = go.Bar(
    x=['(M)', '(DM)', '(RM)'],
    y=[8.12, 7.3, 8.14],
    name='travel'
    )
trace2 = go.Bar(
    x=['(M)', '(DM)', '(RM)'],
    y=[24.2, 23.2, 23],
    name='service'
    )
trace3 = go.Bar(
    x=['(M)', '(DM)', '(RM)'],
    y = [6.7, 5.7, 5.6],
    name='utility'
    )
trace4 = go.Scatter(
    x=['(M)', '(DM)', '(RM)'],
    y=[39.02, 36.2, 36.74],
    )
data=[trace1, trace2, trace3, trace4]
layout= go.Layout(
    barmode= 'stack',
    title='Realization: 0, 0',
    xaxis=dict(title='Model'),
    yaxis=dict(title='Time (minutes)')
    )
fig= go.Figure(data=data, layout=layout)
offline.plot(fig, image='png', filename='stacked-bar')

它会产生这个:

【问题讨论】:

    标签: python plotly stacked-chart


    【解决方案1】:

    我有类似的问题,但对于序数数据。或许您可以在此基础上再接再厉:

    import plotly.graph_objects as go
    from plotly.offline import plot
    
    width = [0.5 for i in x]
    
    x = [1, 2, 4, 5]
    y_dict = {'A': [20, 14, 23, 5],
              'B': [12, 18, 29, 8],
              'C': [18, 10, 5, 2]}
    
    data = [go.Bar(name=key, x=x, y=y_dict[key], width=width) for key in y_dict]
    layout = go.Layout(barmode= 'stack')
    
    fig = go.Figure(data=data, layout=layout)
    
    for i in range(len(x)-1):
        for j, _ in enumerate(y_dict):
            x1 = x[i]
            x2 = x[i+1]
    
            y1 = 0
            y2 = 0
            for key in list(y_dict.keys())[:j+1]:
                y1 += y_dict[key][i]
                y2 += y_dict[key][i+1]
    
            fig.add_trace(go.Scatter(
                x=[x1+width[0]/2, x2-width[0]/2],
                y=[y1, y2],
                mode="lines",
                showlegend=False,
                line={'dash': 'dash', 'color': "#000000"}
            ))
    
    plot(fig)
    

    【讨论】: