Тепловая карта Matplotlib для нескольких временных рядов, чтобы показать распределение во времени

У меня есть записи 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()

Тепловая карта Matplotlib для нескольких временных рядов, чтобы показать распределение во времени

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

Что я хотел бы, это ('шоппинг): Тепловая карта Matplotlib для нескольких временных рядов, чтобы показать распределение во времени

Я не уверен, если это то, что вы хотите, но, может быть, попробовать bins=200?

ilja 29.05.2019 14:59

Как должны выглядеть ваши x тики?

Scott Boston 29.05.2019 15:01
Я понятия не имею, как распределяются мои интенсивности: каким бы вы хотели видеть распределение интенсивности?
Quang Hoang 29.05.2019 15:02

Отредактировал основной пост. Надеюсь, теперь стало понятнее.

komodovaran_ 29.05.2019 15:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
432
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте 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()

Выход:

Выглядит отлично! Но ммм... xticks не выстраиваются правильно, а это значит, что и yticks, вероятно, тоже.

komodovaran_ 29.05.2019 15:32

Правда, проблема в том, что ваш heatmap это 20x20, поэтому по умолчанию ax имеет 20 галочки на каждой оси, а xs имеет 21 элемент, фиксируя

Quang Hoang 29.05.2019 15:40

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()

Выход:

Почти, и действительно очень простое решение. Однако галочки выстроены неправильно, как вы увидите, если увеличите n_series.

komodovaran_ 29.05.2019 16:35

Хорошо, я сам нашел ответ, который делает процесс много проще, чем кажется. Просто измените размер тепловой карты на 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()

Другие вопросы по теме