绘制排序的热图保持 (x,y) 值颜色
Plotting sorted heatmap keeping (x,y) value colors
我一直在使用 python、pandas 和 seaborn 来获得具有不同 colormaps/columns 的热图。感谢 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 是代表工作矩阵的数据框。
使用 seaborn heatmap,您只需提供不同的颜色图,并独立于顺序设置 vmin
和 vmax
。实际上,
vmin, vmax : floats, optional
Values to anchor the colormap, otherwise they are inferred from the data and other keyword arguments.
这意味着您不需要指定 min/max 值,除非您希望它们位于数据点之外。
您可以一次遍历数组并获取与每个值对应的颜色并将它们存储在 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()
我一直在使用 python、pandas 和 seaborn 来获得具有不同 colormaps/columns 的热图。感谢 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 是代表工作矩阵的数据框。
使用 seaborn heatmap,您只需提供不同的颜色图,并独立于顺序设置 vmin
和 vmax
。实际上,
vmin, vmax : floats, optional
Values to anchor the colormap, otherwise they are inferred from the data and other keyword arguments.
这意味着您不需要指定 min/max 值,除非您希望它们位于数据点之外。
您可以一次遍历数组并获取与每个值对应的颜色并将它们存储在 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()