使用matplotlib色彩图来表示概率比

时间:2016-06-21 17:13:04

标签: matplotlib plot colormap

我试图创建一个热图(通过seaborn)来显示两个概率的比率,而我无法弄清楚如何使色图合理化。我的数据存储在pandas数据帧中。

由于我的值是两个概率的比率,它们位于区间(0, infinity),1表示概率相等。因此,我想要一个分色的色域图,其中心为1,其中n^{x}n^{-x}与色图的中心等距,但在所有n的相对侧,{{1 (希望,这是有道理的)。

最初,我尝试使用x,但这并不支持不同的色彩映射。 matplotlib.colors.LogNorm不允许我选择中心。我也认为它们不合适,因为我的值已经标准化了,所以我想我想要一个线性色标(虽然我不确定这个)。

然后,我尝试重新映射我的值,以便将小于1的每个比率映射到其负逆:matplotlib.colors.SymLogNorm。这是一个合理的重新映射:2相当于-2(分子的可能性是两倍,分母的两倍),等等。然后用ratios[ratios<1] = -1/ratios[ratios<1]绘制它们得到一个合理的地图,但0不是&#39我的中心。 1和-1分别是我的中心。有没有办法扩展色图的中心,使其包含多个值(在我的情况下,间隔center=0)?或以某种方式掩盖它?

我觉得这是我最好的前进方式,但我会接受任何建议(特别是如果有人知道如何获取我想要的色彩图而不重新映射值)。

这是一个小例子:

[-1, 1]

如果我们使用常规线性色图来绘制上述内容,请通过以下调用:

import pandas as pd
import numpy as np
import seaborn as sns
df = pd.DataFrame(np.random.rand(4,2), columns=['A','B'])
df['id1'] = [0, 0, 1, 1]
df['id2'] = [0, 1, 0, 1]
df['C'] = df.A / df.B

然后我们得到1

这不是我们想要的,因为2在色阶上与0相等,而我们希望它与.5

等距离

如果我们执行上面的映射:sns.heatmap(df.pivot('id1','id2','C'), center=1) 并使用df.C[df.C < 1] = -1/df.C[df.C<1]绘图,我们会得到2

这是不理想的,因为那些淡蓝色的方块基本上是-1,应该更接近灰色。

0 个答案:

没有答案