非线性 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])
...
我正在尝试为基因制作一维热图(例如,参见 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])
...