2013-11-11 3 views
11

Мне нужно воссоздать диаграмму, аналогичную приведенной ниже, созданной в Excel. Я надеялся использовать matplotlib, но, похоже, не нашел примеров или ссылок на то, как это сделать. Мне нужно, чтобы полосы были окрашены в зависимости от порога производительности, а также отображали порог. Может кто-то указать мне верное направление? Однако мне нужно иметь возможность сделать это с помощью Python. plot examplematplotlib advanced bar plot

+0

Я действительно ценю ответ ниже. Я вижу, что я был проголосован, но я никоим образом не ожидал кода, только надеялся на толкание в правильном направлении, поскольку я искал весь день для него и пришел пустым. –

ответ

17

Я должен бежать, но вот что-то, чтобы вы начали:

import numpy as np 
import matplotlib 
matplotlib.rcParams['text.usetex'] = False 
import matplotlib.pyplot as plt 
import pandas 

df = pandas.DataFrame(np.random.uniform(size=37)*100, columns=['A']) 
threshold = 75 
fig, ax = plt.subplots(figsize=(8,3)) 

good = df['A'][df['A'] >= threshold] 
bad = df['A'][df['A'] < threshold] 

ax.bar(left=good.index, height=good, align='center', color='ForestGreen', zorder=5) 
ax.bar(left=bad.index, height=bad, align='center', color='Firebrick', zorder=5) 

ax.axhline(y=threshold, linewidth=2, color='ForestGreen', zorder=0) 

ax.set_xticks(df.index) 
ax.set_xlim(left=df.index[0]-0.75, right=df.index[-1]+0.75) 

def annotateBars(row, ax=ax): 
    if row['A'] < 20: 
     color = 'black' 
     vertalign = 'bottom' 
     vertpad = 2 
    else: 
     color = 'white' 
     vertalign = 'top' 
     vertpad = -2 

    ax.text(row.name, row['A'] + vertpad, "{:.1f}%".format(row['A']), 
      zorder=10, rotation=90, color=color, 
      horizontalalignment='center', 
      verticalalignment=vertalign, 
      fontsize=8, weight='heavy') 

junk = df.apply(annotateBars, ax=ax, axis=1) 

И это дает мне: annotated bar plot

+0

Большое спасибо, это здорово !! Очень ценю, сэр. –

+0

@ Dave_750 без проблем. в то время я работал над чем-то подобным. проверьте изменения для окончательной версии –

+0

Треска выше не работает. Я получаю «ValueError: (« Значение истинности серии неоднозначно ». Используйте команды a.empty, a.bool(), a.item(), a.any() или a.all(). ', U'occurred при индексе 0 ') "error – alwbtc