2017-01-26 10 views
1

Использование pandas & 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) 

Отлично работает в питоне. По причинам, которые не стоит входить, это изображение не будет отображаться правильно на сайте, на котором оно должно продолжаться. Поэтому я пытаюсь заговорить в первый раз.

Мне не удалось найти похожие функции. Я попытался создать отдельные штабелированные диаграммы, а затем объединить их, выполнив последовательный iplot, но он просто строит два отдельных графика. не например

iplot(fig) 
iplot(fig2) 

И пытается объединить инжир не годится (например iplot(fig, fig2)), который только участки данных в первой.

Любые предложения о том, как копировать в сюжете?

ответ

1

Граф может использовать некоторую настройку, но это определенно выполнимо с Plotly.

  • Добавить orientation='h' в обоих следов, чтобы сделать их h orizontal
  • Добавить barmode='stack' к вашему layout укладывать стержни
  • Убедитесь, что x и y матч правой оси
  • The x значения многослойная трассировка должна быть только разницей между двумя трассами, то есть x=df['best'] - df['last month']
  • Для прогнозируемых точек вы можете ei используйте диаграмму Scatter с 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) 
+0

Цените сообразительности. Я закончил тем, что взломал его, выполнив сложный бар + разброс с ошибками. – ScottieB

+0

Пересмотр, может быть, это может быть решена подзаголовками? – ScottieB

+0

@ScottieB Думал об этом, но не пытался –