36

この格子プロットをggplot2で再現することは可能ですか?

library(latticeExtra)
data(mtcars)
x  <- t(as.matrix(scale(mtcars)))
dd.row <- as.dendrogram(hclust(dist(x)))
row.ord <- order.dendrogram(dd.row)

dd.col <- as.dendrogram(hclust(dist(t(x))))
col.ord <- order.dendrogram(dd.col)

library(lattice)

levelplot(x[row.ord, col.ord],
      aspect = "fill",
      scales = list(x = list(rot = 90)),
      colorkey = list(space = "left"),
      legend =
      list(right =
           list(fun = dendrogramGrob,
                args =
                list(x = dd.col, ord = col.ord,
                     side = "right",
                     size = 10)),
           top =
           list(fun = dendrogramGrob,
                args =
                list(x = dd.row,
                     side = "top",
                     size = 10))))

ここに画像の説明を入力してください

4

4 に答える 4

52

編集

2011年8月8日から、ggdendroパッケージはCRANdendro_dataで利用可能になりました。また、樹状図抽​​出関数が代わりに 呼び出されるようになったことにも注意してください。cluster_data


はい、そうです。しかし、当分の間、あなたはいくつかのフープを飛び越えなければならないでしょう:

  1. ggdendroパッケージをインストールします(CRANから入手可能)。このパッケージは、でプロットするという明確な目的で、いくつかのタイプのクラスターメソッド(Hclustおよびを含む)からクラスター情報を抽出します。dendrogramggplot
  2. グリッドグラフィックを使用してビューポートを作成し、3つの異なるプロットを配置します。

ここに画像の説明を入力してください

コード:

最初にライブラリをロードし、ggplotのデータを設定します。

library(ggplot2)
library(reshape2)
library(ggdendro)

data(mtcars)
x <- as.matrix(scale(mtcars))
dd.col <- as.dendrogram(hclust(dist(x)))
col.ord <- order.dendrogram(dd.col)

dd.row <- as.dendrogram(hclust(dist(t(x))))
row.ord <- order.dendrogram(dd.row)

xx <- scale(mtcars)[col.ord, row.ord]
xx_names <- attr(xx, "dimnames")
df <- as.data.frame(xx)
colnames(df) <- xx_names[[2]]
df$car <- xx_names[[1]]
df$car <- with(df, factor(car, levels=car, ordered=TRUE))

mdf <- melt(df, id.vars="car")

樹状図データを抽出し、プロットを作成します

ddata_x <- dendro_data(dd.row)
ddata_y <- dendro_data(dd.col)

### Set up a blank theme
theme_none <- theme(
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  panel.background = element_blank(),
  axis.title.x = element_text(colour=NA),
  axis.title.y = element_blank(),
  axis.text.x = element_blank(),
  axis.text.y = element_blank(),
  axis.line = element_blank()
  #axis.ticks.length = element_blank()
)

### Create plot components ###    
# Heatmap
p1 <- ggplot(mdf, aes(x=variable, y=car)) + 
  geom_tile(aes(fill=value)) + scale_fill_gradient2()

# Dendrogram 1
p2 <- ggplot(segment(ddata_x)) + 
  geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) + 
  theme_none + theme(axis.title.x=element_blank())

# Dendrogram 2
p3 <- ggplot(segment(ddata_y)) + 
  geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) + 
  coord_flip() + theme_none

グリッドグラフィックと手動の配置を使用して、ページ上の3つのプロットを配置します

### Draw graphic ###

grid.newpage()
print(p1, vp=viewport(0.8, 0.8, x=0.4, y=0.4))
print(p2, vp=viewport(0.52, 0.2, x=0.45, y=0.9))
print(p3, vp=viewport(0.2, 0.8, x=0.9, y=0.4))
于 2011-07-13T08:16:08.113 に答える
6

ベンが言うように、すべてが可能です。樹状図をサポートするためのいくつかの作業が行われました。Andrie de Vriesは、ツリーオブジェクトの強化メソッドを作成しました。ただし、結果のグラフィックは、ご覧のとおりきれいではありません。

タイルは簡単に作成できます。樹状図の場合、セグメントの座標がどのように計算されるかを確認するためにplot.dendrogram(を使用して)検査します。getAnywhereそれらの座標を抽出し、geom_segmentを使用して樹状図をプロットします。次に、ビューポートを使用して、タイルと樹状図を一緒にプロットします。申し訳ありませんが、例を挙げられません。大変な作業であり、手遅れです。

これがお役に立てば幸いです

乾杯

樹状図

于 2011-07-13T02:51:23.443 に答える
4

疑わしい。樹状図のサポートを示唆するggplot2のインデックスに関数はありません。このブロガーが、SarkarのLatticeの本のイラストの翻訳セットをまとめたとき、ggplot樹状図の凡例を取得できませんでした。

http://learnr.wordpress.com/2009/08/10/ggplot2-version-of-figures-in-lattice-multivariate-data-visualization-with-r-part-9/

于 2011-07-13T02:00:06.380 に答える
1

これらのリンクは、ggplot2の樹状図を使用したヒートマップのソリューションを提供します。

https://gist.github.com/chr1swallace/4672065

https://github.com/chr1swallace/random-functions/blob/master/R/ggplot-heatmap.R

そしてこれも:

ggplot2プロットを垂直に揃える

于 2014-04-02T12:36:51.510 に答える