Как пропустить пустые даты (выходные) в финансовом графике Matplotlib Python?

ax.plot_date((dates, dates), (highs, lows), '-')

в настоящее время я использую эту команду для построения финансовых максимумов и минимумов с помощью библиотек matplotlib. Он отлично работает, но как удалить пробелы в оси x, оставленные днями без рыночных данных, таких как выходные и праздничные дни?

У меня есть списки дат, максимумов, минимумов, закрытия и открытия. Я не могу найти примеров создания графика с осью x, которая показывает даты, но не применяет постоянный масштаб.

5 ответов


Я думаю, вам нужно "искусственно синтезировать" точную форму сюжета, которую вы хотите, используя xticks чтобы установить метки тиков на строки, представляющие даты (конечно, помещая Тики в равновеликие интервалы, даже если даты, которые вы представляете, не равновелики), а затем с помощью простого plot.


есть пример того, как это сделать на сайте Matplotlib:

https://matplotlib.org/gallery/ticks_and_spines/date_index_formatter.html


обычно я использую включает в себяС NaN (не число) для значений, которые являются недействительными или нет. Они представлены Matplotlib как пробелы в графике, а NumPy является частью 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()

одна из рекламируемых функций scikits.timeseries это "создание графиков временных рядов с разумно разнесенными метками оси".

вы можете увидеть некоторые примеры участков здесь. В первом примере (показано ниже) для данных используется частота "бизнес", которая автоматически исключает праздники и выходные дни и тому подобное. Он также маскирует отсутствующие точки данных, которые вы видите как пробелы в этом графике, а не линейно интерполируя их.

alt текст http://pytseries.sourceforge.net/_images/yahoo.png


обновленный ответ (2018) с Matplotlib 2.1.2, Python 2.7.12

функции equidate_ax обрабатывает все, что вам нужно для простой оси X даты с равноудаленным расстоянием между точками данных. Реализовано с ticker.FuncFormatter на основе .

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