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、そのためには、x、y、およびプロットする値の3つの列を持つdata.frameが必要です。

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

完全!プロットを始めましょう。ggplot2を使用したヒートマップの基本的なgeomはgeom_tile、美的xyおよびを提供しますfill

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より高い値に対してより暗い色を取得するために)。

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

より良いヒートマップ

最後の仕上げ:タイルの上に値を印刷し、凡例は役に立たなくなったため削除します。明らかに、これはすべてオプションですが、構築するための資料を提供します。Noteは、に渡されて以来、美学geom_textを継承しています。xyggplot

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配色を使用した最終プロット(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関数は行列を取り、行列の値に基づいた色で通常のグリッドをプロットします。多くのオプションを設定できますが、唯一の引数として行列を使用して画像を呼び出すだけで、基本的なプロットが作成されます。そのように聞こえますが、開始するのに適した場所です。

于 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 に答える