绘制多个阵列的密度图

时间:2019-04-11 09:58:36

标签: python matplotlib plot

我有一个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 个答案:

答案 0 :(得分:1)

正如您在问题中已经指出的那样,可能最简单的方法之一就是直方图。对于该应用,直方图的线性近似可能就足够了。

您可以使用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)

然后,您可以使用任何要将浓度映射到颜色值的colormap。最简单的方法是使用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='.')