В дальнейшем я буду использовать только 3 столбца и почасовые данные, чтобы графики выглядели менее беспорядочно.Примеры работают также с исходными данными.
cols = string.ascii_uppercase[:3]
ndays = 3
index = pd.date_range('2018-05-01', periods=3*24, freq='H')
# simulated daily data
d1 = np.random.randn(len(index)//ndays, len(cols))
d2 = np.random.randn(len(index)//ndays, len(cols))+2
d3 = np.random.randn(len(index)//ndays, len(cols))-2
data=np.concatenate([d1, d2, d3])
df = pd.DataFrame(data=data, index=index, columns=list(cols))
df.plot(legend=False)
Способ панд
Вам не повезло, DataFrame.plot.scatter
не работает с данными, похожими на дату и время, из-за давней ошибки .
Matplotlib
Matplotlib scatter
может обрабатывать данные, подобные дате и времени, ноОсь X не масштабируется, как ожидалось.
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])
plt.gcf().autofmt_xdate()
Мне кажется, что это ошибка, но я не смог найти никаких отчетов.Вы можете обойти это, вручную отрегулировав x-пределы.
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])
start, end = df.index[[0, -1]]
xmargin = (end - start) * plt.gca().margins()[0]
plt.xlim(start - xmargin, end + xmargin)
plt.gcf().autofmt_xdate()
К сожалению, форматер оси X не так хорош, как пандыone.
Панда, пересмотренный
Я обнаружил этот трюк случайно, и я не понимаю, почему он работает.Если вы строите серию панд, проиндексированных по тем же данным даты и времени, перед вызовом scatter
в matplotlib, проблема автоматического масштабирования исчезает, и вы получаете хорошее форматирование панд.
Итак, я сделал невидимый график для первого столбца, а затемточечная диаграмма.
df.iloc[:, 0].plot(lw=0) # invisible plot
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])