绘制2D数据:使用不同颜色图的热图

San*_*eta 4 python r matplotlib heatmap pandas

我想要可视化我拥有的2D数据.例如,以下是具有四个属性的数据:

       att1  att2   att3
fun1     10     0      2
fun2      0     1      3
fun3      1    10      5
fun4      2     3     10
Run Code Online (Sandbox Code Playgroud)

我想为每个数据点分配不同的颜色.颜色的强度取决于该列中属性的值,每列必须具有不同的颜色.

以下是所需的图像:

在此输入图像描述

有谁知道如何在Python或R中制作它?

jrj*_*rjc 6

使用Python:

我找到了一个更好的方法:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm

# data loading
df = pd.read_csv("file.csv", index_col=0) 


# plotting
fig,ax = plt.subplots()
ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att1")), 
           cmap=cm.Reds) # You can change the colormap here
ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att2")), 
           cmap=cm.Greens)
ax.matshow(df.mask(((df == df) | df.isnull()) & (df.columns != "att3")), 
           cmap=cm.Blues)
plt.xticks(range(3), df.columns)
plt.yticks(range(4), df.index)
plt.show()
Run Code Online (Sandbox Code Playgroud)

HM

一些细节:

df.mask(((df == df) | df.isnull()) & (df.columns != "att1"))
      att1  att2  att3
fun1    10   NaN   NaN
fun2     0   NaN   NaN
fun3     1   NaN   NaN
fun4     2   NaN   NaN
Run Code Online (Sandbox Code Playgroud)

旧版本,带有numpy蒙面数组:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from numpy.ma import masked_array
import numpy as np

df = pd.read_clipboard() # just copied your example

# define masked arrays to mask all but the given column
c1 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][0]))) 
c2 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][1])))
c3 = masked_array(df, mask=(np.ones_like(df)*(df.values[0]!=df.values[0][2])))

fig,ax = plt.subplots()
ax.matshow(c1,cmap=cm.Reds) # You can change the colormap here
ax.matshow(c2,cmap=cm.Greens)
ax.matshow(c3,cmap=cm.Blues)
plt.xticks(range(3), df.columns)
plt.yticks(range(4), df.index)
Run Code Online (Sandbox Code Playgroud)

一些细节:

df是一个数据帧:

      att1  att2  att3
fun1    10     0     2
fun2     0     1     3
fun3     1    10     5
fun4     2     3    10
Run Code Online (Sandbox Code Playgroud)

c1,c2,c3是屏蔽数组(第1,2和3列):

>>> c1
masked_array(data =
 [[10 -- --]
 [0 -- --]
 [1 -- --]
 [2 -- --]],
             mask =
 [[False  True  True]
 [False  True  True]
 [False  True  True]
 [False  True  True]],
       fill_value = 999999)
Run Code Online (Sandbox Code Playgroud)

或者,您可以从一个numpy 2D数组开始:

>> data
array([[10,  0,  2],
       [ 0,  1,  3],
       [ 1, 10,  5],
       [ 2,  3, 10]])
Run Code Online (Sandbox Code Playgroud)

和替换所有dfdf.valuesdata(2D阵列),除了在标记部分.