2010-08-15 43 views
16

Tengo un conjunto de datos que consta de pares de fecha y valor. Quiero trazarlos en un gráfico de barras con las fechas específicas en el eje x.Cómo graficar datos contra fechas específicas en el eje x usando matplotlib

Mi problema es que matplotlib distribuye el xticks en todo el intervalo de fechas; y también traza los datos usando puntos.

Las fechas son todas datetime objetos. He aquí una muestra del conjunto de datos:

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

Aquí está un ejemplo de código ejecutable utilizando pyplot

import datetime as DT 
from matplotlib import pyplot as plt 

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

x = [date for (date, value) in data] 
y = [value for (date, value) in data] 

fig = plt.figure() 

graph = fig.add_subplot(111) 
graph.plot_date(x,y) 

plt.show() 

PREGUNTA RESUMEN:
Mi situación es más como tengo una Axes ejemplo listo (referenciado por en el código anterior) y quiero hacer lo siguiente:

  1. Haga que el xticks corresponda a los valores de fecha exacta. He oído hablar de matplotlib.dates.DateLocator pero no tengo idea de cómo crear uno y luego asociarlo con un objeto específico Axes.
  2. obtiene un control más estricto sobre el tipo de gráfico que se utiliza (barras, líneas, puntos, etc.)
+0

Sólo un consejo: ya que su pregunta realmente es puramente sobre matplotlib y no tiene nada específico para wxWidgets, sería podría facilitar las cosas si se altera su ejemplo para usar las funciones de 'matplotlib.pyplot' y dejar las cosas wx fuera de él. –

+0

@David: arreglado. Gracias, me di cuenta de que podría haber más personas que pueden leer 'matplotlib' +' pyplot' mejor que 'matplotlib' +' wx' – Kit

Respuesta

28

Lo que está haciendo es bastante simple que es fácil de usar sólo la trama, en lugar de plot_date. plot_date es ideal para casos más complejos, pero la configuración de lo que necesita se puede lograr fácilmente sin ella.

por ejemplo, la base de su ejemplo anterior:

import datetime as DT 
from matplotlib import pyplot as plt 
from matplotlib.dates import date2num 

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), 
     (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), 
     (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), 
     (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] 

x = [date2num(date) for (date, value) in data] 
y = [value for (date, value) in data] 

fig = plt.figure() 

graph = fig.add_subplot(111) 

# Plot the data as a red line with round markers 
graph.plot(x,y,'r-o') 

# Set the xtick locations to correspond to just the dates you entered. 
graph.set_xticks(x) 

# Set the xtick labels to correspond to just the dates you entered. 
graph.set_xticklabels(
     [date.strftime("%Y-%m-%d") for (date, value) in data] 
     ) 

plt.show() 

Si prefiere un diagrama de barras, sólo tiene que utilizar plt.bar(). Para entender cómo configurar los marcadores de línea y estilos, consulte plt.plot() Plot with date labels at marker locations http://www.geology.wisc.edu/~jkington/matplotlib_date_labels.png

+0

+1 Esto es excelente. ¡Gracias! – Kit

Cuestiones relacionadas