Тепловая карта Matplotlib для нескольких временных рядов, чтобы показать распределение во времени - PullRequest
1 голос
/ 29 мая 2019

У меня есть записи n_series с одинаковыми кадрами 0, 1, 2, 3, ... и я хочу сделать из них 2D-контур.

Я обнаружил, что очень легко могу сделать следующее:

import matplotlib.pyplot as plt
import numpy as np

series_len = 1000
n_series = 10

y = np.random.normal(0, 0.15, series_len * n_series)
x = np.tile(np.arange(0, series_len, 1), n_series)

heatmap, xbins, ybins = np.histogram2d(x, y, bins=20)

plt.contourf(heatmap.T)
plt.show()

enter image description here

Но так как это дает только гистограмму 20x20, я понятия не имею, как мои интенсивности распределены на выводимом графике (например, приблизительно с нулевым центрированием), и как исправить тики.

То, что я хотел бы, это: enter image description here

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Попробуйте set_xticklabels:

series_len = 1000
n_series = 10

fig, ax = plt.subplots(figsize=(10,6))
np.random.seed(1)
y = np.random.normal(0, 0.15, series_len * n_series)
x = np.tile(np.arange(0, series_len, 1), n_series)

heatmap, xs, ys = np.histogram2d(x, y, bins=20)

fig, ax = plt.subplots(figsize=(10,6))
ax.contourf(heatmap.T)

# the actual x-axis and y-axis are from 0 to 19
# we want to put 11 ticks on the axis
ax.set_xticks(np.linspace(0,19,11))
ax.set_xticklabels(range(0,1001,100))

ax.set_yticks(np.linspace(0,19,11))
ax.set_yticklabels(['{:.3f}'.format(y) for y in ys[::2]])

plt.show()

Выход:

enter image description here

1 голос
/ 29 мая 2019

IIUC, вы хотели что-то вроде этого:

import matplotlib.pyplot as plt
import numpy as np

series_len = 1000
n_series = 10

y = np.random.normal(0, 0.15, series_len * n_series)
x = np.tile(np.arange(0, series_len, 1), n_series)

heatmap, xlabels, ylabels = np.histogram2d(x, y, bins=20)

plt.contourf(xlabels[:-1], ylabels[:-1], heatmap.T)
plt.colorbar()
plt.show()

Вывод:

enter image description here

0 голосов
/ 29 мая 2019

Хорошо, я сам нашел ответ, который делает процесс намного проще, чем кажется.Просто измените размер тепловой карты на 1 в обоих направлениях, используя skimage, и все будет хорошо.

import matplotlib.pyplot as plt
import numpy as np
import skimage.transform

series_len = 1000
n_series = 10
bins = 20
y = np.random.normal(0, 0.15, series_len * n_series)
x = np.tile(np.arange(0, series_len, 1), n_series)

heatmap, xlabels, ylabels = np.histogram2d(x, y, bins=bins)
heatmap = skimage.transform.resize(heatmap, output_shape = (bins+1, bins+1), mode = "symmetric")

plt.contourf(xlabels, ylabels, heatmap.T)
plt.xlim(0, 1000)
plt.ylim(-0.5, 0.5)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...