2017-02-13 27 views
1

Я хотел бы взять лучшее из this и this вопросов. А именно, у меня есть DataFrame, который содержит имя теста, дату выполнения и результат. И я хочу продемонстрировать, как процент неудачных случаев со временем уменьшался.100% уложенная область/гистограмма в matplotlib с датами по оси X

Мои данные выглядит следующим образом:

TestName;Date;IsPassed 
test1;12/8/2016 9:44:30 PM;0 
test1;12/8/2016 9:39:00 PM;0 
test1;12/8/2016 9:38:29 PM;1 
test1;12/8/2016 9:38:27 PM;1 
test2;12/8/2016 5:05:02 AM;1 
test3;12/7/2016 8:58:36 PM;0 
test3;12/7/2016 8:57:19 PM;1 
test3;12/7/2016 8:56:15 PM;1 
test4;12/5/2016 6:50:49 PM;0 
test4;12/5/2016 6:49:50 PM;0 
test4;12/5/2016 3:23:09 AM;1 
test4;12/4/2016 11:51:29 PM;1 

И я использовал этот код для построения дела отдельно:

fig, ax = plt.subplots() 
passed = tests[tests.IsPassed == 1] 
failed = tests[tests.IsPassed == 0] 
passed_dates = mdates.date2num(passed.Date.astype(datetime)) 
failed_dates = mdates.date2num(failed.Date.astype(datetime)) 
ax.hist(passed_dates, bins=10, color='g') 
ax.hist(failed_dates, bins=10, color='r') 
ax.xaxis.set_major_locator(mdates.AutoDateLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%y')) 
plt.show() 

Но сейчас я хотел бы

  1. Разделить временной интервал в настраиваемое количество ведер
  2. Подсчитайте количество t (без петель, так как в кадре данных много записей)
  3. Запланируйте либо диаграмму площади 100%, либо гистограмму с разбивкой на каждый ковш, так что количество с шага 2 равно 100%

Проблема для меня прямо сейчас в том, что идеально работающее решение с hist() берет на себя автоматическое подведение итогов, и я не вижу способа передать ему ось Y.

Update

Вот что я хотел бы, чтобы выполнить (взятый из другого источника): 100% Stacked columns

ответ

1

Использование аргумента stacked = True позволяет обеспечить несколько массивов в качестве входных данных для plt.hist.

ax.hist([passed_dates, failed_dates], bins=10, stacked=True, label=["passed", "failed"]) 

enter image description here

Использование относительных счетчиков требует, чтобы разделить на число абсолютных отсчетов в бункере. Эта функция не встроена в функцию hist. Вам нужно будет вычислить гистограммы вручную, а затем нарисуйте результат в виде уложенных графиков.

from __future__ import division 
import matplotlib.pyplot as plt 
import matplotlib.dates 
import datetime 
import numpy as np 
import pandas as pd 

dates = pd.date_range("2016/01/01","2016/06/01") 
dates2 = pd.date_range("2016/02/01","2016/03/17", freq="18H") 
dates = dates.append(dates2) 

passed = np.round(np.random.rand(len(dates))+0.231).astype(np.int8) 
tests = pd.DataFrame({"Date" : dates, "IsPassed": passed}) 

fig, ax = plt.subplots() 
passed = tests[tests.IsPassed == 1] 
failed = tests[tests.IsPassed == 0] 
all_dates = matplotlib.dates.date2num(tests.Date.astype(datetime.datetime)) 
passed_dates = matplotlib.dates.date2num(passed.Date.astype(datetime.datetime)) 
failed_dates = matplotlib.dates.date2num(failed.Date.astype(datetime.datetime)) 

hist, bins = np.histogram(all_dates, bins=10) 
histpassed, bins_ = np.histogram(passed_dates, bins=bins) 
histfailed, bins__ = np.histogram(failed_dates, bins=bins) 

binwidth=bins[1]-bins[0] 
ax.bar(bins[:-1]+binwidth/2., histpassed/hist, width=binwidth*0.8, label="passed") 
ax.bar(bins[:-1]+binwidth/2., histfailed/hist, width=binwidth*0.8, bottom=histpassed/hist, label="failed") 

ax.xaxis.set_major_locator(matplotlib.dates.AutoDateLocator()) 
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%d.%m.%y')) 
ax.legend() 
fig.autofmt_xdate() 
plt.savefig(__file__+".png") 
plt.show() 

enter image description here

+0

Nice! Спасибо за подсказку. Теперь есть способ перейти от абсолютного отсчета по оси Y к проценту? Прямо сейчас некоторые бункеры суммируются до более чем тысячи пробегов, а другие меньше 100 ... –

+0

См. Отредактированный ответ. Если это все равно не поможет, не стесняйтесь спрашивать дальше. – ImportanceOfBeingErnest

+0

Это именно то, что я искал! Спасибо, @ImportanceOfBeingErnest! Есть несколько вещей, которые хотели бы изменить, чтобы адаптироваться к моим потребностям, но это не относится к теме этого вопроса. –