2016-11-28 5 views
3

Допустим, что есть временные ряды, которые я хочу построить в Matplotlib:Подробная дата в курсоров поз на pyplot графиках

dates = pd.date_range(start='2011-01-01', end='2012-01-01') 
s = pd.Series(np.random.rand(1, len(dates))[0], index=dates) 

с графическим интерфейсом пользователя движки в Matplotlib есть эта приятная особенность, что они показывают координаты курсора в окне , Когда я сюжет панды серии, используя свой метод участок(), как это:

fig = plt.figure() 
s.plot() 
fig.show() 

х Coords курсора отображаются в полном гггг-мм-дд в нижней части окна, как вы можете видеть на рис 1.

Series s plotted with s.plot()

Однако, когда я сюжет той же серии s с pyplot:

fig = plt.figure() 
plt.plot(s.index, s.values) 
fig.show() 

полные даты показаны только тогда, когда я увеличивать и уменьшать в виду по умолчанию я могу только с ee Mon-yyyy (см. рис. 2), и я увижу только год, если серия будет длиннее.

Series s plotted with plt.plot()

В моем проекте есть функции для рисования графиков сложной, серии из данных временных рядов с использованием plt.plot(), поэтому, когда я просмотреть результаты в графическом интерфейсе я вижу только полные даты в крупным планом. Я использую ipython3 v 4.0, и я в основном работаю с Mac OSX, но я пытался использовать TK, Qt и GTK на Linux без каких-либо различий в поведении.

До сих пор у меня есть 2 идеи о том, как получить полные даты, отображаемые в графическом интерфейсе на любом уровне масштабирования:

  1. переписывают plt.plot() в pd.Series.plot()
  2. используйте обработчик события canvas для получения x-координаты из курсора pos и распечатайте его где-нибудь

Однако, прежде чем я попытаюсь выполнить любое из вышеперечисленных вопросов, мне нужно знать наверняка, есть ли более быстрый способ получить полные даты напечатан в окне графика. Я предполагаю, что есть, потому что панды использует его, но я не мог найти его в pyplot документы или примеры или в другом месте в Интернете, и это не ни один из этих 2 звонков:

ax.xaxis_date() 
fig.autofmt_xdate() 

Кто-нибудь, пожалуйста, сообщите.

ответ

2

Крючки для форматирования информации - Axes.format_coord или Axes.fmt_xdata. Стандартные форматы определены в matplotlib.dates (плюс some additions из панд). Основным решением может быть:

import matplotlib.dates 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

dates = pd.date_range(start='2011-01-01', end='2012-01-01') 
series = pd.Series(np.random.rand(len(dates)), index=dates) 

plt.plot(series.index, series.values) 
plt.gca().fmt_xdata = matplotlib.dates.DateFormatter('%Y-%m-%d') 
plt.show() 
+0

Работает хорошо, спасибо. Третий и второй последний могут быть фактически записаны в одну строку, если ничего не нужно делать с осями, то есть .: 'plt.gca(). Axes.fmt_xdata = lambda x: num2date (x) .strftime ('% Y -% m-% d ') ' – mac13k

+0

Спасибо, объединили линии. – wrwrwr

+1

На боковой ноте это похоже на несколько подзаговоров, которые должны быть установлены для каждого подзаголовка на рисунке. Если вы вызываете один раз перед 'plt.show()', он влияет только на последний подзаговор. – mac13k