2015-08-21 5 views
-1

Я пытаюсь построить три линии на одном и том же участке в Matplotlib. Это InvoicesThisYear, DisputesThisYear и PercentThisYear (которые являются спорами/счетами)Линии, которые не отображаются на графике Matplotlib

Исходный ввод - это два столбца дат - один для даты зарегистрированного спора и один для даты зарегистрированного счета-фактуры.

Я использую даты для подсчета количества споров и счетов-фактур в месяц в течение определенного года.

Затем я пытаюсь его нарисовать, но он появляется пустым. Я начал с того, что просто пытался распечатать PercentThisYear и InvoicesThisYear.

PercentThisYear = (DisputesFYThisYear/InvoicesFYThisYear).fillna(0.0) 

#Percent_ThisYear.plot(kind = 'line') 
#InvoicesFYThisYear.plot(kind = 'line') 
plt.plot(PercentThisYear) 


plt.xlabel('Date') 
plt.ylabel('Percent') 
plt.title('Customer Disputes') 

# Remove the plot frame lines. They are unnecessary chartjunk.  
ax = plt.subplot(111)  
ax.spines["top"].set_visible(False)  
ax.spines["bottom"].set_visible(False)  
ax.spines["right"].set_visible(False)  
ax.spines["left"].set_visible(False) 
ax2 = ax.twinx() 
ax2.plot(InvoicesFYThisYear) 

# Ensure that the axis ticks only show up on the bottom and left of the plot.  
# Ticks on the right and top of the plot are generally unnecessary chartjunk.  
ax.get_xaxis().tick_bottom()  
#ax.get_yaxis().tick_left()  

# Limit the range of the plot to only where the data is.  
# Avoid unnecessary whitespace. 
datenow = datetime.datetime.now() 
dstart = datetime.datetime(2015,4,1) 
print datenow 
#plt.ylim(0, .14)  
plt.xlim(dstart, datenow) 

firsts=[] 
for i in range(dstart.month, datenow.month+1): 
    firsts.append(datetime.datetime(2015,i,1)) 
plt.xticks(firsts) 

plt.show() 

Это результат ... Дата все испорчена, и ничего не печатает. Но масштабированные по осям выглядят правильно. Что я делаю не так?

enter image description here

Здесь созданы ведущие к графику, если это полезно

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

InvoicesThisYear 
Out[82]: 
7 7529 
5 5511 
6 4934 
8 3552 
dtype: int64 


DisputesThisYear 
Out[83]: 
2 211 
1 98 
7  54 
4  43 
3  32 
6  29 
5  21 
8  8 
dtype: int64 

PercentThisYear 
Out[84]: 
1 0.000000 
2 0.000000 
3 0.000000 
4 0.000000 
5 0.003810 
6 0.005877 
7 0.007172 
8 0.002252 
dtype: float64 

ответ

2

Matplotlib не имеет возможности узнать, какие даты, связанные с которыми данные указывают. Когда вы вызываете plot только с одним аргументом y, Matplotlib автоматически предполагает, что значения x равны range(len(y)). Вам нужно указать даты в качестве первого аргумента plot. Если предположить, что InvoicesThisYear является подсчет количества счетов каждый месяц, начиная с 1 и заканчивая 8, вы могли бы сделать что-то вроде

import datetime 
import matplotlib.pyplot as plt 
import pandas as pd 
InvoicesFYThisYear = pd.DataFrame([0, 0, 0, 0, 5511, 4934, 7529, 3552]) 
Disputes = pd.DataFrame([98, 211, 32, 43, 21, 29, 54, 8]) 
PercentThisYear = (Disputes/InvoicesFYThisYear) 
datenow = datetime.date.today() 
ax = plt.subplot(111) 
dates = [datetime.date(2015,i,1) for i in xrange(1, 9, 1)] 
plt.plot(dates, PercentThisYear) 
ax2 = ax.twinx() 
ax2.plot(dates, InvoicesFYThisYear) 
dstart = datetime.datetime(2015,4,1) 
plt.xlim(dstart, datenow) 
plt.xticks(dates, dates) 
plt.show() 

Если данные в серии панды и индекс представляет собой целое число, представляющее месяц, все, что вам нужно сделать, это изменить индекс на объекты datetime. Метод plot для pandas.Series будет обрабатывать вещи автоматически оттуда. Вот как вы можете это сделать:

Invoices = pd.Series((211, 98, 54, 43, 32, 29, 21, 8), index = (2, 1, 7, 4, 3, 6, 5, 8)) 
dates = [datetime.date(2015, month, 1) for month in Invoices.index] 
Invoices.index = dates 
Invoices.plot() 
+0

Спасибо за ваш ответ. Вы знаете какой-либо способ построения сериала, так как левая колонка связана с подсчетом справа? Или, может быть, нарезка сериала на списки? – jenryb

+1

@jenryb, я отредактировал свой ответ, чтобы вместо этого использовать серию. –

+0

Существует открытый PR, который добавляет возможность извлекать индекс из переданного объекта 'Series'. – tacaswell