2013-12-08 4 views
2

Я играю с моими датчиками малины и пытаюсь сделать достойный график показаний. Теперь я сохраняю все данные в документах google: https://docs.google.com/spreadsheet/ccc?key=0AqwhQwJogqG0dDBiU1RuNzlKM1V5OXB3dkRPamctbnc#gid=0 И используя как данные + время, так и временную метку unix, чтобы сэкономить время.Python Использовать данные/время как ось x?

Plotting со временем UniX работает отлично

graph

Но я хотел бы использовать в режиме реального времени в качестве оси (или как subaxis) Но я не могу читать его и не построить его ,

import numpy as np 
from mpl_toolkits.axes_grid1 import host_subplot 
import mpl_toolkits.axisartist as AA 
import matplotlib.pyplot as plt 

#import data 
data = np.loadtxt('DHT11.csv', delimiter = ',', skiprows = 1, 
        usecols = (0,2,3,4,5,6), unpack = 1) 

#id, unixtime, temp, humidity, lightlevel, lightvolt 

i = data[0] 
time = data[1] 
temp = data[2] 
hum = data[3] 
light_lv = 1/data[4]*1000 
light_v = data[5] 


if 1: 

    host = host_subplot(111, axes_class=AA.Axes) 
    plt.subplots_adjust(right=0.75) 

    par1 = host.twinx() 
    par2 = host.twinx() 

    offset = 60 
    new_fixed_axis = par2.get_grid_helper().new_fixed_axis 
    par2.axis["right"] = new_fixed_axis(loc="right", 
             axes=par2, 
             offset=(offset, 0)) 

    par2.axis["right"].toggle(all=True) 



    #host.set_xlim(0, 2) 
    #host.set_ylim(0, 2) 

    host.set_xlabel("Time (unix)") 
    host.set_ylabel("Temperature (C)") 
    par1.set_ylabel("Humidity (%)") 
    par2.set_ylabel("Light (A.U.)") 

    p1, = host.plot(time, temp) 
    p2, = par1.plot(time, hum) 
    p3, = par2.plot(time, light_lv) 

    #par1.set_ylim(0, 4) 
    #par2.set_ylim(1, 65) 

    host.legend() 

    host.axis["left"].label.set_color(p1.get_color()) 
    par1.axis["right"].label.set_color(p2.get_color()) 
    par2.axis["right"].label.set_color(p3.get_color()) 

    plt.draw() 
    plt.show() 

    #plt.savefig("Test") 

Может ли кто-нибудь помочь?

ответ

1

Вы можете задать пользовательский форматировщик (смотри ниже), но если вы делаете это таким образом, вы должны были бы определить форматировщик для каждой оси, host, par1, par2.

Я думаю, что более простым решением было бы преобразовать ваши time в объекты Python datetime.datetime и позволить Matplotlib обрабатывать форматирование. Вы все равно можете использовать пользовательский форматтер, если вам не нравится, как Matplotlib форматирует даты.

import datetime as DT 
time = [DT.datetime.fromtimestamp(t/1000) for t in time] 
... 
p1, = host.plot(time, temp) 
p2, = par1.plot(time, hum) 
p3, = par2.plot(time, light_lv) 

Кстати, вы можете определить i, time, temp и т.д. напрямую (без использования переменной Темп data):

i, time, temp, hum, light_lv, light_v = np.loadtxt(
    'DHT11.csv', delimiter = ',', skiprows = 1, 
    usecols = (0,2,3,4,5,6), unpack = 1) 

time = [DT.datetime.fromtimestamp(t/1000) for t in time] 
light_lv = 1.0/light_lv*1000 

Если x-axis значения являются Python datetime.datetime объектов, для установки пользовательского форматирования, используйте

import matplotlib.dates as mdates 
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S') 
ax.xaxis.set_major_formatter(xfmt) 

Если x-axis значения меток времени, используйте

import datetime as DT 
import matplotlib.ticker as ticker 
xfmt = ticker.FuncFormatter(lambda timestamp, pos: DT.fromtimestamp(x/1000.0).strftime('%Y-%m-%d')) 
ax.xaxis.set_major_formatter(xfmt) 

Где ax является host, par1 и/или par2.

+0

Я получая ошибки при этом. http://pastebin.com/iHGGAKRb 'AttributeError: объект 'module' не имеет атрибута 'fromtimestamp'' – Coolcrab

+0

Моя ошибка. 'DT.fromtimestamp' должен был быть 'DT.datetime.fromtimestamp'. – unutbu

+0

Это работает! Хотя сейчас они полностью перекрываются. Где следует «игнорировать» plt.xticks (rotation = 25)? – Coolcrab

0

Если вы преобразуете свои данные в временные ряды pandas, это автоматически сделает это за вас. он также будет выбирать соответствующий формат меток в соответствии с частотой данных. Например, если ваши данные поступают в секундах:

import pandas as pd 
import numpy as np 

n = 100 
idx = pd.date_range(start=dt.datetime.now(), periods=n, freq='S') 
ts1= pd.Series(np.sin(np.linspace(0, 4 * np.pi, n)), index=idx) 
ts2= pd.Series(np.cos(np.linspace(0, 4 * np.pi, n)), index=idx) 

fig = plt.figure(figsize=(8, 6)) 
ax = fig.add_axes([.05, .05, .9, .9]) 

ts1.plot(ax) 
ts2.plot(ax) 
(ts1 - ts2).plot(ax) 

вы получите это:

ts3

и если у вас есть ежедневные данные:

ts= pd.Series(np.sin(np.linspace(0, 4 * np.pi, n)), 
       index=pd.date_range(start=dt.datetime.now(), periods=n, freq='D')) 
ts.plot()   

ts2

+0

Я не думаю, что это будет работать с моими надстройками, так как я рисую 3 (более поздние) графики в одном. – Coolcrab

+0

@Coolcrab это просто, просто используйте 'ts.plot (ax)' где 'ax' - это ось, которую вы создали, и она построит ее по этой оси –

+0

@Coolcrab я отредактировал свой ответ, чтобы показать, как это сделать –

Смежные вопросы