我试图为基因制作1D热图(例如,参见pastebin中的参考1)。我已经接近了我用contourf寻找的东西,但我还没有弄清楚如何得到我正在寻找的东西。基本上,我想要使用具有10种离散颜色的色彩图,并且不同颜色的截止值对应于数据的百分位数(因此前10%的数据点是红色,接下来的10%是橙色等)。
我没有足够的声誉来发布两个以上的链接或任何图片,因此您还可以从下面的代码中查看我的输出图像,以及我尝试过的其他页面并在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,所以我不再追求它们了。如果答案已经在我已查看的其中一个链接中,但我无法理解,那么一个简单的英语'翻译会非常有帮助。
答案 0 :(得分:1)
我无法分辨为什么色彩图不会在你的例子中使用全范围的颜色,但似乎以下更接近你想要的结果(即它确实跨越了更大范围的颜色和分位数水平)。
...
hm = plt.contourf(x, levels = levels, cmap = "rainbow", vmax = levels[-2])
...
您还可以尝试加权'最大色彩图级别的值。
...
hm = plt.contourf(x, levels = levels, cmap = "rainbow", vmax = 0.3 * levels[-1] + 0.7 * levels[-2])
...