2011-11-04 49 views
10

Tengo problemas para usar múltiples subparcelas con fechas en el eje x.Subtramas con fechas en el eje x

Estoy usando el ejemplo matplotlib de here. Lo he modificado para incluir otra subparcela (los datos que se trazan son los mismos). Esto es lo que estoy haciendo como salida:

enter image description here

Las garrapatas sólo aparecen en la segunda subtrama. ¿Por qué? ¿Cómo puedo hacer que aparezcan en ambas subtramas?

Aquí está mi fuente modificada. Agregué el código para incluir una nueva subtrama en el bloque if a mitad de camino de la fuente.

#!/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() 

Respuesta

11

He encontrado el culpable. Es la función autofmt_xdate:

Fecha ticklabels a menudo se superponen, por lo que es útil para rotarlas y derecha alinearlos. Además, un caso de uso común es una serie de subparcelas con xax compartidos donde el eje x son datos de fecha. Las etiquetas de tictac son a menudo largas, y ayuda a rotarlas en la subparcela inferior y desactivarlas en otras subtramas, así como desactivar las xlabels.

Es una "función". Se puede conseguir el mismo efecto mediante la inserción de este código después de cada subtrama:

plt.xticks(rotation=30) 
+0

Nota adicional: si utiliza cifras separadas para cada parcela, esto debe ser hecho antes de llamar 'plt.figure()' de nuevo. – thegrinner

Cuestiones relacionadas