Как построить матрицу путаницы, используя тепловые карты в R? - PullRequest
5 голосов
/ 14 сентября 2011

У меня матрица путаницы такая, что:

  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, очень сложно вносить изменения в сэмплы. Если кто-нибудь может помочь мне в ближайшее время, как рисовать, я буду очень признателен. Или любое другое предложение, а не тепловые карты также приветствуются. Я знаю, что есть множество примеров по этому поводу, но я все еще не могу нарисовать с помощью своих собственных данных.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Как упомянул Грег, 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))
2 голосов
/ 04 декабря 2018

Вы можете получить хороший результат, используя ggplot2, но для этого вам нужен data.frame с 3 столбцами для x, y и значением для построения.

Используя gather из инструмента tidyr, очень легко переформатировать ваши данные:

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 для карты тепла с ggplot2 - geom_tile, для которого мы предоставим эстетические x, y и fill.

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

First attempt at a heatmap

Хорошо, не так уж плохо, но мы можем сделать намного лучше. Сначала мы, вероятно, хотим повернуть ось у. Хитрость заключается в том, чтобы обеспечить 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, чтобы получить более темные цвета для более высоких значений).

Поскольку вы рисуете одно и то же на оси x и y, вам, вероятно, нужны равные масштабы оси: 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), ...

A better heatmap

Последний штрих: печать значений поверх плиток и удаление легенды, поскольку она больше не нужна. Очевидно, что все это необязательно, но дает материал для сборки. Примечание geom_text наследует эстетику x и y, поскольку они были переданы 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

Final heatmap

Вы также можете передать color="black" на geom_tile, чтобы нарисовать (черные) линии вокруг плиток. Окончательный график с цветовой схемой RdYlBu (список доступных палитр см. В RColorBrewer::display.brewer.all()).

Showcasing more options

1 голос
/ 14 сентября 2011

Функция image в R возьмет матрицу и построит регулярную сетку с цветами на основе значений в матрице. Вы можете установить множество параметров, но просто вызов изображения с вашей матрицей в качестве единственного аргумента создаст базовый график. Похоже, это было бы хорошим началом.

...