非线性 Colormap/Heatmap

Nonlinear Colormap/Heatmap

我正在尝试为基因制作一维热图(例如,参见 pastebin 中的参考文献 1)。我已经接近我在使用 contourf 寻找的东西,但我一直无法弄清楚如何准确地获得我正在寻找的东西。基本上,我想使用具有 10 种离散颜色的颜色图,并且不同颜色的截止值对应于数据的 百分位数 (因此前 10% 的数据点是红色的,接下来的 10% 是橙色的,等等)。

我没有足够的声誉 post 超过两个链接或任何图像,所以你也可以从下面的代码中看到我的输出图像,以及我看过的其他页面在 http://pastebin.com/jAkxyQsK 尝试解决这个问题。

实际数据点位于 http://pastebin.com/3TrkkpZ0 的列表中。您可以尝试使用随机整数,但线性缩放和百分位数缩放之间的区别可能不会很明显,除非您的数据像我的一样倾斜。

data = [] #actually a list of ~450 floats 
x = []
nd = np.array(data)
x = np.empty([2, nd.shape[0]])
x[:,:] = nd

fig = plt.figure(figsize = (11, 8.5))
ax = fig.add_subplot(111)

现在,这是我的实验:

mind, maxd, sprd = min(data), max(data), max(data)-min(data)
levels = [(lambda n: mind + (n*sprd)/10)(n) for n in range(0,11,1)]
hm = plt.contourf(x, levels = levels, cmap = "rainbow")
cbar = fig.colorbar(hm, ax = ax)
plt.show()

[Figure 1 on pastebin]

这主要是我想看到的:颜色条被离散化并且绘图看起来不错,但是颜色条在数据的最大值和最小值之间呈线性间隔,这不是我想要的。尝试二:

levels = np.percentile(data, [z for z in range (0,110,10)])
hm = plt.contourf(x, levels = levels, cmap = "rainbow")
cbar = fig.colorbar(hm, ax = ax)
plt.show()

[Figure 2 on pastebin]

这也接近;颜色条除以百分位数的值(或者至少刻度值表明了这一点),但由于某种原因它不再使用颜色图的全部范围,我不知道为什么。

我也尝试过使用 pcolor 实现参考文献 2 和 3 中描述的函数,但我无法弄清楚如何让它们使用我的数据而不是散点图,结果并不尽如人意得到 contourf,所以我不再追求它们。如果答案已经在我看过的其中一个链接中,但我无法理解,那么 'plain English' 翻译将非常有帮助。

我不知道为什么颜色图在你的例子中没有使用全部颜色范围,但似乎下面的结果更接近你想要的结果(即它确实跨越了更大范围的颜色和分位数水平).

...
hm = plt.contourf(x, levels = levels, cmap = "rainbow", vmax = levels[-2])
...

您也可以尝试 'weighted' 最大颜色图级别的值。

...
hm = plt.contourf(x, levels = levels, cmap = "rainbow", vmax = 0.3 * levels[-1] + 0.7 * levels[-2])
...