如何在R中使用热图绘制混淆矩阵?

时间:2011-09-14 18:54:35

标签: r heatmap confusion-matrix

我有一个混淆矩阵,以便:

  a b c d e f g h i j
a 5 4 0 0 0 0 0 0 0 0
b 0 0 0 0 0 0 0 0 0 0
c 0 0 4 0 0 0 0 0 0 0
d 0 0 0 0 0 0 0 0 0 0
e 2 0 0 0 2 0 0 0 0 0
f 1 0 0 0 0 2 0 0 0 0
g 0 0 0 0 0 0 0 0 0 0
h 0 0 0 0 0 0 0 0 0 0 
i 0 0 0 0 0 0 0 0 0 0 
j 0 0 0 0 0 0 0 0 0 0 

其中字母表示类标签。

我只需绘制混淆矩阵。我搜索了几个工具。 R中的热图看起来像我需要的。由于我对R一无所知,因此很难对样本进行更改。如果有人能帮助我很快画画,我将非常感激。或者任何其他建议而不是热图也是受欢迎的。 我知道有很多关于此的样本,但我仍然无法用我自己的数据绘制。

4 个答案:

答案 0 :(得分:2)

正如格雷格所说,image可能是要走的路:

z = c(5,4,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,4,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
2,0,0,0,2,0,0,0,0,0,
1,0,0,0,0,2,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0)

z = matrix(z, ncol=10)
colnames(z) = c("a","b","c","d","e","f","g","h","i", "j")
rownames(z) = c("a","b","c","d","e","f","g","h","i", "j")

##To get the correct image plot rotation
##We need to flip the plot
image(z[,ncol(z):1], axes=FALSE)

##Add in the y-axis labels. Similar idea for x-axis.
axis(2, at = seq(0, 1, length=length(colnames(z))), labels=colnames(z))

您可能还想查看heatmap功能:

heatmap(t(z)[ncol(z):1,], Rowv=NA,
               Colv=NA, col = heat.colors(256))

答案 1 :(得分:2)

使用Extracted 100, 50, 12,5, 11/11/2018, 1, somefreetext 可以获得不错的结果,但是为此,您需要一个data.frame,该数据帧具有3列,分别用于x,y和要绘制的值。

使用ggplot2工具中的gather可以很容易地重新格式化数据:

tidyr

完美!让我们绘图。 ggplot2的热图的基本几何是library("dplyr") library("tidyr") # Loading your example. Row names should get their own column (here `y`). hm <- readr::read_delim("y a b c d e f g h i j a 5 4 0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 0 0 0 0 c 0 0 4 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 e 2 0 0 0 2 0 0 0 0 0 f 1 0 0 0 0 2 0 0 0 0 g 0 0 0 0 0 0 0 0 0 0 h 0 0 0 0 0 0 0 0 0 0 i 0 0 0 0 0 0 0 0 0 0 j 0 0 0 0 0 0 0 0 0 0", delim=" ") # Gathering columns a to j hm <- hm %>% gather(x, value, a:j) # hm now looks like: # # A tibble: 100 x 3 # y x value # <chr> <chr> <dbl> # 1 a a 5 # 2 b a 0 # 3 c a 0 # 4 d a 0 # 5 e a 2 # # ... with 95 more rows ,我们将为其提供美观的geom_tilexy

fill

First attempt at a heatmap

还不错,但是我们可以做得更好。首先,我们可能想反转y轴。诀窍是提供x和y作为因子,并根据需要对它们进行排序。

library("ggplot2")
ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile() 

然后,我喜欢摆脱灰色背景的黑白主题hm <- hm %>% mutate(x = factor(x), # alphabetical order by default y = factor(y, levels = rev(unique(y)))) # force reverse alphabetical order 。我还喜欢使用theme_bw()中的调色板(与RColorBrewer一起使用以获得更深的颜色以获得更高的值)。

由于要在direction = 1x轴上绘制相同的图形,因此可能需要相等的轴比例尺:y将为您提供正方形图。

coord_equal()

A better heatmap

画龙点睛:将值打印在图块顶部并删除图例,因为它不再有用。显然,这都是可选的,但它为您提供了基础。注意ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile() + theme_bw() + coord_equal() + scale_fill_distiller(palette="Greens", direction=1) # Other valid palettes: Reds, Blues, Spectral, RdYlBu (red-yellow-blue), ... 继承了geom_textx的美学,因为它们被传递给y

ggplot

Final heatmap

您还可以将ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile() + theme_bw() + coord_equal() + scale_fill_distiller(palette="Greens", direction=1) + guides(fill=F) + # removing legend for `fill` labs(title = "Value distribution") + # using a title instead geom_text(aes(label=value), color="black") # printing values 传递到color="black",以在图块周围绘制(黑色)线条。使用geom_tile配色方案的最终绘图(有关可用调色板的列表,请参见RdYlBu

Showcasing more options

答案 2 :(得分:1)

R中的image函数将采用矩阵并根据矩阵中的值绘制带有颜色的规则网格。您可以设置很多选项,但只需使用矩阵作为唯一参数调用图像将创建基本图。听起来这是一个很好的起点。

答案 3 :(得分:0)

不幸的是,另一个答案中建议的image函数不能这样使用,因为它会反转(镜像)数据,因此您将以错误的方式得到它。只需进行一点转换,就可以创建一个将其正确绘制的函数:

set.seed(1)
d = data.frame(Y_label=rpois(100,1), pred=rpois(100,1))
Show = function(df, ...) {image(t(df[nrow(df):1,]), ...)}
Show(table(d), main="my confusion matrix")

enter image description here

下一步,您可以添加一些轴标签,对其进行自定义,等等。