2009-08-13 21 views
13
ax.plot_date((dates, dates), (highs, lows), '-') 

Actualmente estoy usando este comando para trazar los altos y bajos financieros usando Matplotlib. Funciona muy bien, pero ¿cómo elimino los espacios en blanco en el eje x que quedan por días sin datos de mercado, como fines de semana y días festivos?¿Cómo saltear fechas vacías (fines de semana) en un gráfico financiero de Matplotlib Python?

Tengo listas de fechas, altas, bajas, cierra y abre. No puedo encontrar ningún ejemplo de creación de un gráfico con un eje x que muestre fechas pero no aplique una escala constante.

Respuesta

4

Creo que necesita "sintetizar artificialmente" la forma exacta de la gráfica que desea usando xticks para establecer las etiquetas de las cadenas que representan las fechas (por supuesto, colocando las marcas a intervalos equidistantes aunque las fechas estén representando no están equiespaciados) y luego usando un simple plot.

5

Una de las características anunciadas de scikits.timeseries es "Crear gráficos de series temporales con etiquetas de ejes espaciadas inteligentemente".

Puede ver algunos diagramas de ejemplo here. En el primer ejemplo (que se muestra a continuación), la frecuencia de "negocios" se utiliza para los datos, lo que excluye automáticamente las vacaciones, los fines de semana y similares. También enmascara los puntos de datos faltantes, que ve como brechas en esta trama, en lugar de interpolar linealmente.

alt text http://pytseries.sourceforge.net/_images/yahoo.png

5

típicamente voy a utilizar NumPy 's NaN (no un número) para valores que no son válidos o no está presente. Están representados por Matplotlib como huecos en la trama y NumPy es parte de pylab/Matplotlib.

>>> import pylab 
>>> xs = pylab.arange(10.) + 733632. # valid date range 
>>> ys = [1,2,3,2,pylab.nan,2,3,2,5,2.4] # some data (one undefined) 
>>> pylab.plot_date(xs, ys, ydate=False, linestyle='-', marker='') 
[<matplotlib.lines.Line2D instance at 0x0378D418>] 
>>> pylab.show() 
0

Hasta la fecha respuesta (2018) con Matplotlib 2.1.2, 2.7.12 Python

La función equidate_ax maneja todo lo que necesita para un eje x de fecha simple con espaciado equidistante de puntos de datos. Realizado con ticker.FuncFormatter basado en this example.

from __future__ import division 
from matplotlib import pyplot as plt 
from matplotlib.ticker import FuncFormatter 
import numpy as np 
import datetime 


def equidate_ax(fig, ax, dates, fmt="%Y-%m-%d", label="Date"): 
    """ 
    Sets all relevant parameters for an equidistant date-x-axis. 
    Tick Locators are not affected (set automatically) 

    Args: 
     fig: pyplot.figure instance 
     ax: pyplot.axis instance (target axis) 
     dates: iterable of datetime.date or datetime.datetime instances 
     fmt: Display format of dates 
     label: x-axis label 
    Returns: 
     None 

    """  
    N = len(dates) 
    def format_date(index, pos): 
     index = np.clip(int(index + 0.5), 0, N - 1) 
     return dates[index].strftime(fmt) 
    ax.xaxis.set_major_formatter(FuncFormatter(format_date)) 
    ax.set_xlabel(label) 
    fig.autofmt_xdate() 


# 
# Some test data (with python dates) 
# 
dates = [datetime.datetime(year, month, day) for year, month, day in [ 
    (2018,2,1), (2018,2,2), (2018,2,5), (2018,2,6), (2018,2,7), (2018,2,28) 
]] 
y = np.arange(6) 


# Create plots. Left plot is default with a gap 
fig, [ax1, ax2] = plt.subplots(1, 2) 
ax1.plot(dates, y, 'o-') 
ax1.set_title("Default") 
ax1.set_xlabel("Date") 


# Right plot will show equidistant series 
# x-axis must be the indices of your dates-list 
x = np.arange(len(dates)) 
ax2.plot(x, y, 'o-') 
ax2.set_title("Equidistant Placement") 
equidate_ax(fig, ax2, dates) 

Comparison of default plotting method and equidistant x-axis

Cuestiones relacionadas