Как вы уже указали в своем вопросе, вероятно, один из самых простых подходов включает гистограммы. Для этого приложения, вероятно, достаточно линейной аппроксимации гистограммы.
Вы можете использовать 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='.')