我可以在图中叠加两个堆积的条形图吗?

时间:2017-01-26 22:28:48

标签: pandas matplotlib plotly

使用熊猫& matplotlib我为我们的团队创建了一个方便的图形来监控收入。对于我们的每个客户,它显示上个月(浅灰色),最佳月份(深灰色)和本月的预测范围(绿色)。

revenue with forecast

它基本上是两个不同宽度的堆叠条形图。

ax = df.plot(kind='barh', x='company', y=['last_month', 'best-last'], width=0.2, color=context_colors, lw=0, stacked=True)

df.plot(kind='barh', x='company', y=['forecast_low', 'hi-lo'], stacked=True, colors=range_colors, lw=0, ax=ax)

在python中运行得很好。由于不值得进入的原因,此图片不会在需要继续播放的网站上显示正确大小。所以我第一次尝试了。

我还没有找到类似的功能。我尝试构建单独的堆叠图表,然后通过运行顺序iplot来组合它们,但它只是构建了两个单独的图。 例如

iplot(fig)
iplot(fig2)

尝试组合无花果并不好(例如iplot(fig, fig2)),它只是在第一个数据中绘制数据。

关于如何在剧情中复制的任何建议?

1 个答案:

答案 0 :(得分:2)

图表可以使用一些调整,但它绝对可以与Plotly一起使用。

  • orientation='h'添加到两个跟踪中,使其h orizo​​ntal
  • barmode='stack'添加到layout以堆叠栏
  • 确保xy与右轴匹配
  • 堆叠跟踪的x值应该只是两条跟踪之间的差异,即x=df['best'] - df['last month']
  • 对于预测点,您可以使用散布图,mode设置为markers或添加shapes(下图同时显示)。

enter image description here

import plotly.plotly as py
import plotly.graph_objs as go
import pandas as pd

df = pd.DataFrame(
    {'last month': [10, 15, 12],
     'best': [13, 20, 16],
     'forecast': [11, 17, 14],
     'animal': ['giraffe', 'orangutan', 'monkey']
     }
)

trace1 = go.Bar(
    y=df['animal'],
    x=df['last month'],
    name='last month',
    orientation='h'
)
trace2 = go.Bar(
    y=df['animal'],
    x=df['best'] - df['last month'],
    name='best month',
    orientation='h',
)
trace3 = go.Scatter(
    y=df['animal'],
    x=df['forecast'],
    name='forecasst',
    mode='markers',
    marker= {'size': 20, 'symbol': 'square'}
)
data = [trace1, trace2, trace3]

shapes = list()
for i, x in enumerate(df['animal']):
    shapes.append({
        'type': 'rect',
        'x0': df.forecast[i] - 1,
        'x1': df.forecast[i] + 1,
        'y0': i - 0.5,
        'y1': i + 0.5,
        'line': {
            'color': 'rgba(0, 128, 0, 1)',
            'width': 2,
            },
        'fillcolor': 'rgba(0, 128, 0, 0.5)'
        }
    )
layout = go.Layout(
    barmode='stack',
    shapes=shapes
)

fig = go.Figure(data=data, layout=layout)
plot_url = py.plot(fig)