2014-04-17 15 views
8

Quindi sono nuovo alla programmazione con matplotlib. Ho creato una trama a colori usando imshow() e un array. All'inizio l'asse era solo il numero di riga e colonna del mio array. Ho usato extent = (xmin, xmax, ymin, ymax) per ottenere l'asse x in tempo unix e altitudine, rispettivamente.Date nell'asse x per un grafico matplotlib con imshow

Voglio cambiare l'asse x dal tempo di unix (982376726,982377321) a UT (02:25:26, 02:35:21). Ho creato un elenco dell'intervallo di tempo in HH: MM: SS. Non sono sicuro di come sostituire il mio attuale asse x con questi nuovi numeri, senza modificare la trama del colore (o farlo scomparire).

Stavo guardando datetime.time ma mi sono confuso con esso.

Qualsiasi aiuto sarebbe molto apprezzato!

+0

Potete fornire quale codice si ha fino ad ora? – Ffisegydd

risposta

18

Ho messo insieme qualche codice di esempio che dovrebbe aiutarti con il tuo problema.

Il codice genera prima alcuni dati randomizzati utilizzando numpy.random. Calcola quindi i limiti x e i limiti y in cui i limiti x saranno basati su due timestamp unix indicati nella domanda e i limiti y sono solo numeri generici.

Il codice quindi traccia i dati randomizzati e utilizza i metodi pyplot per convertire la formattazione dell'asse x in stringhe ben rappresentate (anziché un timestamp unix o numeri di array).

Il codice è ben commentato e dovrebbe spiegare tutto ciò che serve, in caso contrario si prega di commentare e chiedere chiarimenti.

import numpy as np 
import matplotlib.pyplot as plt 

import matplotlib.dates as mdates 

import datetime as dt 

# Generate some random data for imshow 
N = 10 
arr = np.random.random((N, N)) 

# Create your x-limits. Using two of your unix timestamps you first 
# create a list of datetime.datetime objects using map. 
x_lims = list(map(dt.datetime.fromtimestamp, [982376726, 982377321])) 

# You can then convert these datetime.datetime objects to the correct 
# format for matplotlib to work with. 
x_lims = mdates.date2num(x_lims) 

# Set some generic y-limits. 
y_lims = [0, 100] 

fig, ax = plt.subplots() 

# Using ax.imshow we set two keyword arguments. The first is extent. 
# We give extent the values from x_lims and y_lims above. 
# We also set the aspect to "auto" which should set the plot up nicely. 
ax.imshow(arr, extent = [x_lims[0], x_lims[1], y_lims[0], y_lims[1]], 
      aspect='auto') 

# We tell Matplotlib that the x-axis is filled with datetime data, 
# this converts it from a float (which is the output of date2num) 
# into a nice datetime string. 
ax.xaxis_date() 

# We can use a DateFormatter to choose how this datetime string will look. 
# I have chosen HH:MM:SS though you could add DD/MM/YY if you had data 
# over different days. 
date_format = mdates.DateFormatter('%H:%M:%S') 

ax.xaxis.set_major_formatter(date_format) 

# This simply sets the x-axis data to diagonal so it fits better. 
fig.autofmt_xdate() 

plt.show() 

Example plot

+0

Questo è stato molto utile !! Giusto per chiarire, sono le sottotrame qualcosa che dovrei sempre fare per essere in grado di lavorare con la trama e le asce? – user3546200

+0

No, non necessariamente. Puoi usare il più semplice 'plt.plot', ma dovresti fare' plt.xaxis_date() 'Penso. Probabilmente dovrete anche eseguire 'gca(). Xaxis.set_major_formatter (...)' dove la funzione 'gca' restituisce semplicemente l'oggetto asse corrente (equivale ad avere solo la fig, ax all'inizio). – Ffisegydd

+0

C'è un modo per far sì che Matplotlib scelga automaticamente la risoluzione temporale delle etichette? Lo fa normalmente (ad esempio, quando si usa 'plot()' con date sull'asse x), ma se ometto lo specificatore di formato in 'DateFormatter' nel tuo esempio, ottengo solo l'anno (es. [2015, 2015 , 2015, ...]). –

Problemi correlati