绘制排序的热图保持(x,y)值颜色

Posted

技术标签:

【中文标题】绘制排序的热图保持(x,y)值颜色【英文标题】:Plotting sorted heatmap keeping (x,y) value colors 【发布时间】:2016-03-08 09:22:15 【问题描述】:

我一直在使用 python、pandas 和 seaborn 来获得具有不同颜色图/列的热图。感谢this 的问题,我做了以下事情:

示例数据帧(sample.csv):

X,a,b,c
A,0.5,0.7,0.4
B,0.9,0.3,0.8
C,0.3,0.4,0.7

使用 Seaborn 绘制热图

import pandas as pd
import matplotlib as mpl
# Set new Backend to Use Seaborn
# mpl.use('Agg')
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import colorsys

# Working example data:
df = pd.DataFrame([[0.5,0.7,0.4],[.9,.3,.8],[.3,.4,.7]],['A','B','C'])    

# Get Color List
N = 3
COL = [colorsys.hsv_to_rgb(x*1.0/N, 0.7, 0.5) for x in range(N)]

with sns.axes_style('white'):

    for i, name in enumerate(df.columns):

        # Create cmap
        colors = COL[i]
        cmap = sns.light_palette(colors, input='rgb', reverse=False, as_cmap=True)

        sns.heatmap(df.mask(df.isin(df[name])!=1),
                    cbar=False,
                    square=True,
                    annot=False,
                    cmap=cmap,
                    linewidths=0.1)
plt.show()

这会产生一个具有不同颜色图/列的热图(这些值只是为了澄清问题):

现在我想使用已排序的数据框生成相同的图,例如:

X,col1,col2,col3
A,0.7,0.5,0.4
B,0.9,0.8,0.3
C,0.7,0.4,0.3

尝试保持对(索引,列)的原始颜色,如以下预期的草稿输出(值是指示性的,我只需要颜色):

编辑:

修正了一些错别字,现在 df 是代表工作矩阵的数据框。

【问题讨论】:

我不确定我是否理解这里的问题,我留下了一个试探性的答案,但我会编辑这个问题以更清楚您的位置以及您面临的确切问题 向minimal working example 提供您迄今为止所做的工作,以便我了解您的实际问题 我认为我的第二次编辑会有所帮助。工作示例仍然存在,我无法重现输出,因为这是我的问题。 工作示例不存在,因为它不工作。您可以构建作为示例提供的数据框,并使用这些虚构值绘制热图。 不确定是否要偏离,但这篇博文展示了如何在不使用 Seaborn 的情况下绘制热图:nipunbatra.github.io/2014/07/dtw 【参考方案1】:

使用seaborn heatmap,您只需提供不同的颜色图,并独立于顺序设置vminvmax。其实,

vmin, vmax : 浮点数,可选

锚定颜色图的值,否则它们是从数据和其他关键字参数中推断出来的。

这意味着您不需要指定最小/最大值,除非您希望它们在数据点之外。

【讨论】:

【参考方案2】:

您可以一次遍历数组并获取与每个值对应的颜色并将它们存储在 NxMx3(图像)数组中。然后以相同的方式对数组和图像进行排序,例如从原始数组中获取排序索引并将它们应用于图像数组。然后你可以用plt.imshow显示图像 然后您可以添加 matplotlib 标签、刻度等。

这可能看起来像这样: 您应该首先创建一个 NxMx3 数组来存储颜色。

im = np.zeros((df.shape[0], df.shape[1], 3))

然后您可以遍历每一列并将您的值从 0 缩放到 255,例如

color_index = (value-min(column))/(max(column)-min(column)*255

那么你可以使用

color = cmap(color_index)

im[col_index, row_index, :] = color

当您遍历每一列时,所有颜色都存储在 im

生成的代码将是:

import pandas as pd
import matplotlib as mpl
# Set new Backend to Use Seaborn
# mpl.use('Agg')
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import colorsys
import numpy as np

# Working example data:
df = pd.DataFrame([[0.5,0.7,0.4],[.9,.3,.8],[.3,.4,.7]],['A','B','C'])    

# Get Color List
N = 3
COL = [colorsys.hsv_to_rgb(x*1.0/N, 0.7, 0.5) for x in range(N)]

im = np.zeros((df.shape[0], df.shape[1], 4))

with sns.axes_style('white'):

    for i, name in enumerate(df.columns):

        # Create cmap
        colors = COL[i]
        cmap = sns.light_palette(colors, input='rgb', reverse=False, as_cmap=True)
        values = np.array(df[name])
        color_indices = (values-np.min(values))/(np.max(values)-np.min(values))
        im[:,i,:] = cmap(color_indices)

im2 = im.copy()
for i, name in enumerate(df.T.columns):
    values = np.array(df.T[name])
    print(values)
    sorting = np.argsort(values)
    print("sorting", sorting)
    im2[i, ::-1, :] = im[i, sorting, :]
plt.imshow(im2, interpolation="nearest")
plt.grid(False)
plt.show()

【讨论】:

谢谢,我正在考虑这个问题,但是我怎样才能访问每个位置的颜色呢?那将非常有用。 看起来很有希望,但您介意提供一个完整的示例和输出吗?您即将赢得赏金! :-)

以上是关于绘制排序的热图保持(x,y)值颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在Julia中绘制热图

从三个列表中绘制热图:X、Y、强度

具有范围值颜色的 ggplot2 热图

基于非数字第三变量的热图轴重新排序 - ggplot2

热图在单细胞数据分析中的应用

我可以为散景热图绘制颜色条吗?