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

Attualmente sto usando questo comando per tracciare alti e minimi finanziari usando Matplotlib. Funziona alla grande, ma come faccio a rimuovere gli spazi vuoti nell'asse x lasciati da giorni senza dati di mercato, come i fine settimana e le vacanze?Come saltare le date vuote (fine settimana) in un grafico Matlotlib Python finanziario?

Ho elenchi di date, alti, bassi, chiudi e si apre. Non riesco a trovare alcun esempio di creazione di un grafico con un asse x che mostra le date ma non impone una scala costante.

risposta

4

Penso che sia necessario "sintetizzare artificialmente" l'esatta forma di trama desiderata utilizzando xticks per impostare le etichette di graduazione sulle stringhe che rappresentano le date (ovviamente posizionando i segni di spunta a intervalli equispaziati anche se le date che si sono rappresentare non sono equispaziati) e quindi utilizzare un semplice plot.

5

Una delle funzioni pubblicizzate di scikits.timeseries è "Creazione di grafici di serie temporali con etichette di assi distanziati in modo intelligente".

È possibile visualizzare alcuni grafici di esempio here. Nel primo esempio (mostrato sotto) viene utilizzata la frequenza 'business' per i dati, che esclude automaticamente le festività, i fine settimana e simili. Maschera anche i punti dati mancanti, che vengono visualizzati come spazi vuoti in questa trama, anziché interpolarli linearmente.

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

5

io di solito usare NumPy s' NaN (non un numero) per i valori che non sono validi o non è presente. Sono rappresentati da Matplotlib come spazi vuoti nella trama e NumPy fa parte di 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

Fino ad oggi la risposta (2018) con Matplotlib 2.1.2, Python 2.7.12

La funzione equidate_ax gestisce tutto ciò che è necessario per un asse X con data semplice con spaziatura equidistante dei punti dati. Realizzato con ticker.FuncFormatter basato su 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