Создание тепловой карты с использованием временных рядов pandas

#python #matplotlib

#python #дата и время #numpy #matplotlib #pandas

Вопрос:

Мне нужно создать тепловую карту MatplotLib (pcolormesh), используя столбец временных рядов фрейма данных Pandas (df_all.ts) в качестве моей оси X.

Как преобразовать столбец временных рядов Pandas во что-то, что можно использовать в качестве оси X в функции np.meshgrid (x, y) для создания тепловой карты? Обходной путь заключается в создании Matplotlib drange с использованием тех же параметров, что и в столбце pandas, но есть ли простой способ?

 x = pd.date_range(df_all.ts.min(),df_all.ts.max(),freq='H')
xt = mdates.drange(df_all.ts.min(), df_all.ts.max(), dt.timedelta(hours=1))
y = arange(ylen)
X,Y = np.meshgrid(xt, y)
  

Комментарии:

1. Без четкого определения того, что вы хотите, я предполагаю, что ваша тепловая карта представляет собой простую 2D-гистограмму. Итак, почему бы вам не выполнить повторную выборку / поворот вашего DF к этому и построить его с plt.imshow(df_all.values) ?

2. Мне нужно всего 5-20 элементов на оси Y, насколько я понимаю, imshow() требует указания каждой точки гистограммы

3. Вы всегда можете переименовать ось в соответствии с данными, которые находятся в столбце временных рядов. Не заставляйте функции matplotlib использовать именно эти данные в качестве данных оси x, если построение в виде изображения работает, а затем настройте метки осей.

Ответ №1:

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

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

from itertools import product
from string import ascii_uppercase
from matplotlib import patheffects

m, n = 4, 7 # 4 rows, 7 columns
df = pd.DataFrame(np.random.randn(m, n),
                  columns=list(ascii_uppercase[:n]),
                  index=list(ascii_uppercase[-m:]))


ax = plt.imshow(df, interpolation='nearest', cmap='Oranges').axes

_ = ax.set_xticks(np.linspace(0, n-1, n))
_ = ax.set_xticklabels(df.columns)
_ = ax.set_yticks(np.linspace(0, m-1, m))
_ = ax.set_yticklabels(df.index)

ax.grid('off')
ax.xaxis.tick_top()
  

при желании, чтобы напечатать фактические значения в середине каждого квадрата с некоторыми тенями для удобства чтения, вы можете сделать:

 path_effects = [patheffects.withSimplePatchShadow(shadow_rgbFace=(1,1,1))]

for i, j in product(range(m), range(n)):
    _ = ax.text(j, i, '{0:.2f}'.format(df.iloc[i, j]),
                size='medium', ha='center', va='center',
                path_effects=path_effects)
  

тепловая карта

Комментарии:

1. Но есть ли способ с вашим подходом к форматированию дат, если у меня есть сотни точек на X с минутным интервалом, но мне нужно показывать только ежедневные тики?

2. @szu если вы хотите, чтобы тепловая карта также основывалась на ежедневных интервалах, тогда вам нужно сначала использовать resample метод pandas, в противном случае просто измените set_xticks и set_xticklabels вызовы

3. @behzad.nouri Когда я запускаю код фактического значения для печати, я получил эту ошибку: «ax.text (j, i, ‘{:.2f}’.format (df.iget_value (i, j)), ошибка значения: имя поля нулевой длины в формате» Вы знаете, почему? Pandas версии 0.14.1 и python 2.6.6

4. @AnthonyKong не уверен, попробуйте с df.iloc[i, j]

5. @behzad.nouri Извините, просто разберитесь: «‘{:.2f}’.format(» недопустимый код python 2.x