matplotlib中的自定义pcolor

时间:2017-02-22 05:45:24

标签: python python-2.7 numpy matplotlib plot

我正在matplotlib中绘制几个热图,如下所示。

enter image description here

这是我的循环:

with open(gene_peak) as f:
    count = 1
    for line in f:
        np_array=[]
        gene_peak = line.strip().split("\t")
        gene_id = gene_peak[0]
        peaks = gene_peak[1].split(",")
        for peak in peaks:
            np_array.append(enhancer_fc[peak])
        data, pval = stats.spearmanr(np.transpose(np.array(np_array)))
        plt.subplot(4,3,count+1)
#       plt.title(gene_id)
        plt.pcolor(data, cmap=plt.cm.OrRd, vmin=-1, vmax=1)
        plt.gca().invert_yaxis()
        plt.gca().set_aspect(aspect='equal', adjustable='box-forced')
        plt.xticks([])
        plt.yticks([])
        print count
        count += 1
    plt.show()

我正在绘制不同尺寸的不同2D阵列的spearman相关性。

问题:

有相关值,因此它们的范围从-1到1.我想添加自定义colorbar(),使得高于0.4的值开始显示红色渐变,低于-0.4显示蓝色渐变,这样我显示只有大于0.4且小于-0.4的点。

enter image description here

另外,我想只绘制一个colorbar(),使图像看起来更干净。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用Matplotlib中的ListedColorMap定义自己的离散色图。您可以使用其中一个图中的颜色条,并将其放置在适当的位置,以便直观地表示所有图形。以下是您给出的颜色的示例:

from matplotlib import colors


discrete_colors = [(255, 0, 20), (255, 70, 65), (255, 128, 110), (255, 181, 165), (64, 64, 64),
    (0, 0, 0), (64, 64, 64), (124, 128, 217), (102, 107, 216), (69, 76, 215), (33, 33, 245)]
discrete_colors = [(r/255., g/255., b/255.) for r, g, b in discrete_colors]         

my_colormap = colors.ListedColormap(discrete_colors)

subplot(211)
data = 2 * np.random.rand(10, 10) - 1.0
pcolor(data, cmap=my_colormap, vmin=-1, vmax=1)
subplot(212)  # Some other plot
data = 2 * np.random.rand(10, 10) - 1.0
pc = pcolor(data, cmap=my_colormap, vmin=-1, vmax=1)

fig = gcf()
fig.subplots_adjust(right=0.70)
cax = fig.add_axes([0.80, 0.15, 0.05, 0.7])
fig.colorbar(pc, cax=cax)

您可能需要稍微调整一下代码。我使用的是IPython 2.7。 Custom discrete colormap and colorbar placement.