График плотности при построении нескольких массивов - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть массив MxN (скажем, 1000x50). Я хочу нанести каждую линию из 50 точек на один и тот же график и получить тепловую карту их плотности.

Просто делать plt.pcolor(data) не то, что я хочу, так как я не хочу строить матрицу.

Это то, что я хочу построить, но, как я уже сказал, это не дает мне нужную тепловую карту.

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(1000, 50)

fig, ax = plt.subplots()
for i in range(0,1000):
    ax.plot(data[i], '.')

plt.show()

Я хотел бы получить способ собрать это вместе (я полагаю, это будет как-то связано с гистограммами и биннингом?).

РЕДАКТИРОВАТЬ: простое добавление значения alpha к графику (ax.plot(data[i], '.r', alpha=0.01)) дает нечто похожее на то, что я хочу. Я хотел бы, однако, иметь тепловую карту с разными цветами.

1 Ответ

1 голос
/ 11 апреля 2019

Как вы уже указали в своем вопросе, вероятно, один из самых простых подходов включает гистограммы. Для этого приложения, вероятно, достаточно линейной аппроксимации гистограммы.

Вы можете использовать np.histogram для вычисления высоты и ребер бина и использовать scipy.interpolate.interp1d для получения функции, которая обеспечивает интерполяцию гистограммы. Мы можем определить простую вспомогательную функцию, чтобы получить приблизительную плотность вокруг каждого значения в одном столбце массива данных:

# import scipy.interpolate as interp
def get_density(vals, bins=30, kind="linear"):
    y, bin_edges = np.histogram(vals, bins=bins, density=True)
    x = (bin_edges[1:] + bin_edges[:-1])/2.
    f = interp.interp1d(x, y, kind=kind, fill_value="extrapolate")
    return f(vals)

Затем вы можете использовать любую карту цветов , которую вы хотите отобразить для плотности цвета. Самый простой способ - использовать plt.scatter вместо plot, где вы можете указать конкретный цвет для каждой точки данных.

Я бы сделал что-то вроде этого:

fig, ax = plt.subplots()
for i in range(data.shape[1]):
    colors = plt.cm.viridis(get_density(data[:, i]))
    ax.scatter(i*np.ones(data.shape[0]), data[:, i], c=colors, marker='.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...