Вот, возможно, более простой подход с использованием mdates
, хотя вам нужно перебирать ваши столбцы, вызывая отображение бар из matplotlib. Вот пример, когда я рисую только один столбец и использую mdates для настраиваемых тиков и меток (EDIT). Добавлена функция циклирования для построения всех столбцов):
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
def format_x_date_month_day(ax):
# Standard date x-axis formatting block, labels each month and ticks each day
days = mdates.DayLocator()
months = mdates.MonthLocator() # every month
dayFmt = mdates.DateFormatter('%D')
monthFmt = mdates.DateFormatter('%Y-%m')
ax.figure.autofmt_xdate()
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(monthFmt)
ax.xaxis.set_minor_locator(days)
def df_stacked_bar_formattable(df, ax, **kwargs):
P = []
lastBar = None
for col in df.columns:
X = df.index
Y = df[col]
if lastBar is not None:
P.append(ax.bar(X, Y, bottom=lastBar, **kwargs))
else:
P.append(ax.bar(X, Y, **kwargs))
lastBar = Y
plt.legend([p[0] for p in P], df.columns)
span_days = 90
start = pd.to_datetime("1-1-2012")
idx = pd.date_range(start, periods=span_days).tolist()
df=pd.DataFrame(index=idx, data={'A':np.random.random(span_days), 'B':np.random.random(span_days)})
plt.close('all')
fig, ax = plt.subplots(1)
df_stacked_bar_formattable(df, ax)
format_x_date_month_day(ax)
plt.show()
(Ссылка matplotlib.org , например, для создания стробированного графика штрихов.) Это дает нам
. Другой подход, который должен работать и быть намного проще, - использовать df.plot.bar(ax=ax, stacked=True)
, однако он не допускает форматирование оси даты с mdates
и является предметом моего вопроса .
В первую очередь, typeof является оператором, не функцией, таким образом, Вам не нужны круглые скобки. Во-вторых, получите доступ к прототипу объекта.
alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );
, Когда Вы выполняетесь typeof Array.push
, Вы тестируете, если сам объект Массива имеет метод нажатия, не, если экземпляры Массива имеют метод нажатия.
И это действительно хорошо работает в Firefox
, который Это только по совпадению! Вы не можете обычно ожидать, что метод прототипа также будет существовать на функции конструктора.
if(typeof(Array().push) == 'undefined')
Это было почти правильно кроме Вас, забывают new
, постоянный глюк JavaScript. new Array().push
, или [].push
, если коротко, правильно проверил бы, что экземпляр имел метод, который Вы хотели.
Правильный способ проверить, существует ли свойство:
if ('property' in objectVar)
К .hasOwnProperty
можно получить доступ через proptotype массива, если typeof
недостаточно идиоматичен.
if (Array.prototype.hasOwnProperty('push')) {
// Native array has push property
}