我有一个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)
)即可实现与我想要的类似的功能。但是,我希望有一个具有不同颜色的热图。
答案 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='.')