2011-11-04 9 views
10

Ho problemi nell'usare più sottotrame con le date sull'asse x.Sottotrami con le date sull'asse x

Sto usando l'esempio matplotlib da here. L'ho modificato per includere un'altra sottotrama (i dati che vengono tracciati sono gli stessi). Questo è quello che sto ottenendo come output:

enter image description here

Le zecche appaiono solo sul secondo sottotrama. Perché? Come posso farli apparire su entrambe le sottotrame?

Ecco la mia fonte modificata. Ho aggiunto il codice per includere un nuovo sottotramma nel blocco if a metà della sorgente.

#!/usr/bin/env python 
""" 
Show how to make date plots in matplotlib using date tick locators and 
formatters. See major_minor_demo1.py for more information on 
controlling major and minor ticks 

All matplotlib date plotting is done by converting date instances into 
days since the 0001-01-01 UTC. The conversion, tick locating and 
formatting is done behind the scenes so this is most transparent to 
you. The dates module provides several converter functions date2num 
and num2date 

""" 
import datetime 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import matplotlib.mlab as mlab 
import matplotlib.cbook as cbook 

years = mdates.YearLocator() # every year 
months = mdates.MonthLocator() # every month 
yearsFmt = mdates.DateFormatter('%Y') 

# load a numpy record array from yahoo csv data with fields date, 
# open, close, volume, adj_close from the mpl-data/example directory. 
# The record array stores python datetime.date as an object array in 
# the date column 
#datafile = cbook.get_sample_data('goog.npy') 
datafile = 'goog.npy' 
r = np.load(datafile).view(np.recarray) 

fig = plt.figure() 
ax = fig.add_subplot(211) 
ax.plot(r.date, r.adj_close) 


# format the ticks 
ax.xaxis.set_major_locator(years) 
ax.xaxis.set_major_formatter(yearsFmt) 
ax.xaxis.set_minor_locator(months) 

datemin = datetime.date(r.date.min().year, 1, 1) 
datemax = datetime.date(r.date.max().year+1, 1, 1) 
ax.set_xlim(datemin, datemax) 

# format the coords message box 
def price(x): return '$%1.2f'%x 
ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') 
ax.format_ydata = price 
ax.grid(True) 

second = True 
if second: 
    years = mdates.YearLocator() # every year 
    months = mdates.MonthLocator() # every month 
    yearsFmt = mdates.DateFormatter('%Y') 

    ax = fig.add_subplot(212) 
    ax.plot(r.date, r.adj_close) 

    # format the ticks 
    ax.xaxis.set_major_locator(years) 
    ax.xaxis.set_major_formatter(yearsFmt) 
    ax.xaxis.set_minor_locator(months) 

    datemin = datetime.date(r.date.min().year, 1, 1) 
    datemax = datetime.date(r.date.max().year+1, 1, 1) 
    ax.set_xlim(datemin, datemax) 

    # format the coords message box 
    ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') 
    ax.format_ydata = price 
    ax.grid(True) 

# rotates and right aligns the x labels, and moves the bottom of the 
# axes up to make room for them 
fig.autofmt_xdate() 

plt.show() 

risposta

11

Ho trovato il colpevole. È la funzione autofmt_xdate:

Data ticklabels spesso si sovrappongono, quindi è utile ruotarli e allineare a destra. Inoltre, un caso d'uso comune è un numero di sottotrame con xax condivisi in cui l'asse x è dati di data. I ticklabels sono spesso lunghi e aiutano a ruotarli nella sottotramma inferiore e li disattivano su altre sottotrame, nonché a disattivare xlabels.

È una "funzionalità". È possibile ottenere lo stesso effetto con l'inserimento di questo codice dopo ogni sottotrama:

plt.xticks(rotation=30) 
+0

Nota aggiuntiva: se si utilizzano i dati separati per ogni trama, questo deve essere fatto prima di chiamare 'plt.figure()' di nuovo. – thegrinner

Problemi correlati