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

4

我希望能够可视化我的二维数据。例如,以下是具有四个属性的数据:

       att1  att2   att3
fun1     10     0      2
fun2      0     1      3
fun3      1    10      5
fun4      2     3     10

我希望为每个数据点分配不同的颜色。颜色的强度取决于该列中属性的值,每列必须有不同的颜色。
以下是所需图像: enter image description here 有人知道如何在Python或R中实现吗?

是的,http://docs.ggplot2.org/current/geom_tile.html。 - Roman Luštrik
另一种方法是使用lattice,通过levelplot:https://dev59.com/jOo6XIcBkEYKwwoYSCY1 - Alex Reynolds
1
OP想要每列不同的颜色,这不仅仅是一个热力图。 - jrjc
数字是否总是按最大值减10进行缩放?您希望颜色按每列最大值或整体最大值进行缩放,还是按最大强度为10进行缩放,即使没有十位数也是如此?最小值也是同样的情况 - 左上角看起来是白色,但实际上是值2,而不是零。 - Spacedman
你所说的“强度”是什么意思?必要时可以参考RGB和HSV颜色空间。你的数字有多准确?第三个绿色看起来更加饱和,而第四个绿色明显更暗但数值更大。你是如何将数字映射到颜色上的? - Spacedman
2个回答

7

使用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()

hm

some details :

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

旧版本,使用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)

一些细节:

df是一个数据框:

      att1  att2  att3
fun1    10     0     2
fun2     0     1     3
fun3     1    10     5
fun4     2     3    10

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)

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

>> data
array([[10,  0,  2],
       [ 0,  1,  3],
       [ 1, 10,  5],
       [ 2,  3, 10]])

请将所有的dfdf.values替换为data(即2D数组),除了标签部分。


嗨,我在创建数据框时遇到问题,普通数组和代码不兼容。谢谢! - Sangeeta
1
@Sangeeta:我不明白。你知道如何使用pandas读取csv文件吗?代码中有什么你不理解的地方吗? - jrjc
谢谢!它正在工作!我以为它只能使用“read_clipboard”函数。将其更改为“read_csv”正好得到了我想要的结果。谢谢 :) - Sangeeta
嗨@Jeanrjc,当我只有8行时,图表很好。但是当我将行数增加到800时,图表变得非常混乱,我的意思是图表中什么都看不见了。你有任何想法,如何增加行数吗?谢谢! - Sangeeta
你是指行还是列?而你最后一个问题的意思是什么? - jrjc
我有一组数据,包含6列和864行。在将行数增加到如此大的值后,图像上什么也看不清了。我在这里提出了另一个问题:http://stackoverflow.com/questions/25228723/increasing-number-of-rows-in-python-2d-heatmap。谢谢! - Sangeeta

0

尝试:

ddf = structure(list(fn = structure(1:4, .Label = c("fun1", "fun2", 
"fun3", "fun4"), class = "factor"), att1 = c(10L, 0L, 1L, 2L), 
    att2 = c(0L, 1L, 10L, 3L), att3 = c(2L, 3L, 5L, 10L)), .Names = c("fn", 
"att1", "att2", "att3"), class = "data.frame", row.names = c(NA, 
-4L))

ddf
    fn att1 att2 att3
1 fun1   10    0    2
2 fun2    0    1    3
3 fun3    1   10    5
4 fun4    2    3   10

ddfm = melt(ddf)
ddfm
     fn variable value
1  fun1     att1    10
2  fun2     att1     0
3  fun3     att1     1
4  fun4     att1     2
5  fun1     att2     0
6  fun2     att2     1
7  fun3     att2    10
8  fun4     att2     3
9  fun1     att3     2
10 fun2     att3     3
11 fun3     att3     5
12 fun4     att3    10
> 
ggplot(ddfm)+ geom_tile(aes(x=variable, y=fn, fill=value))

enter image description here


2
实际上,我需要每列不同的颜色。 - Sangeeta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接