6

我有一个混淆矩阵,例如:

  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

4 回答 4

7

您可以使用 获得一个不错的结果ggplot2,但为此您需要一个 data.frame,其中包含 3 列用于 x、y 和要绘制的值。

使用gathertidyr工具可以很容易地重新格式化您的数据:

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

完美的!让我们开始绘图。ggplot2 的热图的基本几何图形是geom_tile我们将提供的审美x,yfill.

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

第一次尝试热图

好的还不错,但我们可以做得更好。首先,我们可能想要反转 y 轴。诀窍是提供 x 和 y 作为因子,并按照我们想要的顺序排列它们。

hm <- hm %>%
  mutate(x = factor(x), # alphabetical order by default
         y = factor(y, levels = rev(unique(y)))) # force reverse alphabetical order

theme_bw()然后我喜欢摆脱灰色背景的黑白主题。我也喜欢使用调色板RColorBrewerdirection = 1用以获得更高值的更深的颜色)。

由于您在xy轴上绘制相同的东西,您可能需要相等的轴比例:coord_equal()会给您一个方形图。

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), ...

更好的热图

画龙点睛:在图块顶部打印值并删除图例,因为它不再有用。显然,这都是可选的,但它为您提供了构建材料。Notegeom_text继承xy美学,因为它们被传递给ggplot.

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"togeom_tile在瓷砖周围绘制(黑色)线条。带有RdYlBu配色方案的最终图(请参阅RColorBrewer::display.brewer.all()可用调色板列表)。

展示更多选项

于 2018-12-04T11:53:04.367 回答
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))
于 2011-09-14T20:30:02.230 回答
1

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

于 2011-09-14T19:16:47.530 回答
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")

在此处输入图像描述

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

于 2020-01-07T21:27:45.327 回答