2014-04-25 3 views
0

У меня есть следующий код для построения диаграммы с MatplotlibPlotting диаграмма со временем эпохи оси х с использованием Matplotlib

#!/usr/bin/env python 
import matplotlib.pyplot as plt 
import urllib2 
import json 

req = urllib2.urlopen("http://localhost:17668/retrieval/data/getData.json?  pv=LNLS:ANEL:corrente&donotchunk") 
data = json.load(req) 
secs = [x['secs'] for x in data[0]['data']] 
vals = [x['val'] for x in data[0]['data']] 

plt.plot(secs, vals) 
plt.show() 

СПК массивов эпохи времени.

Я хочу, чтобы данные были построены по оси x (сек) в качестве даты (DD-MM-YYYY HH: MM: SS).

Как я могу это сделать?

ответ

12

Для отображения данных на основе даты в matplotlib необходимо скопировать данные в нужный формат.

Один из способов - сначала преобразовать ваши данные в datetime объектов, для отметки времени в эпоху вы должны использовать datetime.datetime.fromtimestamp().

Вы должны затем преобразовать datetime объектов в нужном формате для matplotlib, это может обрабатываться с использованием matplotlib.date.date2num.

В качестве альтернативы вы можете использовать matplotlib.dates.epoch2num и пропустить преобразовании даты datetime объектов, в первую очередь (в то время как это будет отвечать вашим потребительной случае лучше сначала, я бы рекомендовал пытаться сохранить дату дату, основанную на datetime объектов столько, сколько вы можете при работе, это сэкономит вам головную боль в долгосрочной перспективе).

Как только у вас есть данные в правильном формате, вы можете построить его с помощью plot_date.

Наконец, чтобы отформатировать ось x по желанию, вы можете использовать объект matplotlib.dates.DateFormatter, чтобы выбрать, как будут выглядеть ваши тики.

import matplotlib.pyplot as plt 
import matplotlib.dates as mdate 

import numpy as np 

# Generate some random data. 
N = 40 
now = 1398432160 
raw = np.array([now + i*1000 for i in range(N)]) 
vals = np.sin(np.linspace(0,10,N)) 

# Convert to the correct format for matplotlib. 
# mdate.epoch2num converts epoch timestamps to the right format for matplotlib 
secs = mdate.epoch2num(raw) 


fig, ax = plt.subplots() 

# Plot the date using plot_date rather than plot 
ax.plot_date(secs, vals) 

# Choose your xtick format string 
date_fmt = '%d-%m-%y %H:%M:%S' 

# Use a DateFormatter to set the data to the correct format. 
date_formatter = mdate.DateFormatter(date_fmt) 
ax.xaxis.set_major_formatter(date_formatter) 

# Sets the tick labels diagonal so they fit easier. 
fig.autofmt_xdate() 

plt.show() 

Plot

+0

Он дал мне следующую ошибку: AttributeError: объект 'Рисунок' не имеет атрибута 'autoftm_xdate' – Marcio

+0

Вы скопировали код неправильно, так как у меня есть 'fig.autofmt_xdate()' not 'fig.autoftm_xdate()'. – Ffisegydd

+0

Несогласованное использование 'matplotlib.dates' и' matplotlib.date'. Правильное использование - 'matplotlib.dates'. – kas

2

Вы можете изменить отметки местоположения и форматы на вашем участке:

import matplotlib.pyplot as plt 
import matplotlib.ticker as mtick 
import time 

secs = [10928389,102928123,383827312,1238248395] 
vals = [12,8,4,12] 

plt.plot(secs,vals) 

plt.gcf().autofmt_xdate() 

plt.gca().xaxis.set_major_locator(mtick.FixedLocator(secs)) 
plt.gca().xaxis.set_major_formatter(
    mtick.FuncFormatter(lambda pos,_: time.strftime("%d-%m-%Y %H:%M:%S",time.localtime(pos))) 
    ) 
plt.tight_layout() 
plt.show() 
Смежные вопросы