29

このLearningRブログ投稿は、ggplot2を使用してバスケットボールの統計のヒートマップを作成する方法を示しています。完成したヒートマップは次のようになります。

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

私の質問(Learning Rのブログ投稿にコメントしたJakeに触発された)は、統計のさまざまなカテゴリ(攻撃的、防御的、その他)にさまざまなグラデーションの色を使用することは可能でしょうか?

4

2 に答える 2

46

まず、投稿からグラフを再作成し、ggplot2テーマシステムが異なり、添付するパッケージが少ない新しい(0.9.2.1)バージョンに更新します。

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))

library("ggplot2")
library("plyr")
library("reshape2")
library("scales")

nba.m <- melt(nba)
nba.s <- ddply(nba.m, .(variable), transform,
               rescale = scale(value))

ggplot(nba.s, aes(variable, Name)) + 
  geom_tile(aes(fill = rescale), colour = "white") + 
  scale_fill_gradient(low = "white", high = "steelblue") + 
  scale_x_discrete("", expand = c(0, 0)) + 
  scale_y_discrete("", expand = c(0, 0)) + 
  theme_grey(base_size = 9) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0))

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

カテゴリごとに異なるグラデーションカラーを使用するのは、それほど簡単ではありません。fillにマップするという概念的なアプローチinteraction(rescale, Category)Category攻撃/防御/その他。以下を参照)は機能しません。これは、因子と連続変数を相互作用させると、fillマップできない離散変数が得られるためです。

これを回避する方法は、この相互作用を人為的に行い、rescaleのさまざまな値の重複しない範囲にマッピングしてから、これらの各領域をさまざまなカラーグラデーションにマッピングCategoryするために使用することです。scale_fill_gradientn

まず、カテゴリを作成します。これらはコメントにあるものと一致していると思いますが、よくわかりません。どの変数がどのカテゴリにあるかを変更するのは簡単です。

nba.s$Category <- nba.s$variable
levels(nba.s$Category) <- 
  list("Offensive" = c("PTS", "FGM", "FGA", "X3PM", "X3PA", "AST"),
       "Defensive" = c("DRB", "ORB", "STL"),
       "Other" = c("G", "MIN", "FGP", "FTM", "FTA", "FTP", "X3PP", 
                   "TRB", "BLK", "TO", "PF"))

rescaleは0の数(3または4)以内にあるため、異なるカテゴリを100だけオフセットして、それらを分離することができます。同時に、再スケーリングされた値と色の両方の観点から、各カラーグラデーションの端点をどこに配置するかを決定します。

nba.s$rescaleoffset <- nba.s$rescale + 100*(as.numeric(nba.s$Category)-1)
scalerange <- range(nba.s$rescale)
gradientends <- scalerange + rep(c(0,100,200), each=2)
colorends <- c("white", "red", "white", "green", "white", "blue")

fill次に、変数をに置き換え、使用するスケールをrescaleoffset変更します(値を再スケールすることを忘れないでください)。fillscale_fill_gradientn

ggplot(nba.s, aes(variable, Name)) + 
  geom_tile(aes(fill = rescaleoffset), colour = "white") + 
  scale_fill_gradientn(colours = colorends, values = rescale(gradientends)) + 
  scale_x_discrete("", expand = c(0, 0)) + 
  scale_y_discrete("", expand = c(0, 0)) + 
  theme_grey(base_size = 9) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0))

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

関連する統計をまとめるための並べ替えはreorder、さまざまな変数に対する関数の別のアプリケーションです。

nba.s$variable2 <- reorder(nba.s$variable, as.numeric(nba.s$Category))

ggplot(nba.s, aes(variable2, Name)) + 
  geom_tile(aes(fill = rescaleoffset), colour = "white") + 
  scale_fill_gradientn(colours = colorends, values = rescale(gradientends)) + 
  scale_x_discrete("", expand = c(0, 0)) + 
  scale_y_discrete("", expand = c(0, 0)) + 
  theme_grey(base_size = 9) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0))

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

于 2012-10-22T17:51:15.920 に答える
8

これは、ggplot2の美学を使用して、グラデーションと色のカテゴリの両方をマッピングする、より簡単な提案です。アルファエステティックを使用してグラデーションを生成し、フィルエステティックをカテゴリに使用するだけです。

これを行うためのコードは次のとおりです。BrianDiggsの応答をリファクタリングします。

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))

library("ggplot2")
library("plyr")
library("reshape2")
library("scales")

nba.m <- melt(nba)
nba.s <- ddply(nba.m, .(variable), transform,
           rescale = scale(value))

nba.s$Category <- nba.s$variable
levels(nba.s$Category) <- list("Offensive" = c("PTS", "FGM", "FGA", "X3PM", "X3PA", "AST"),
   "Defensive" = c("DRB", "ORB", "STL"),
   "Other" = c("G", "MIN", "FGP", "FTM", "FTA", "FTP", "X3PP", "TRB", "BLK", "TO", "PF"))

次に、rescale変数を0から1の間に正規化します。

nba.s$rescale = (nba.s$rescale-min(nba.s$rescale))/(max(nba.s$rescale)-min(nba.s$rescale))

そして今、プロットを行います:

ggplot(nba.s, aes(variable, Name)) + 
  geom_tile(aes(alpha = rescale, fill=Category), colour = "white") + 
  scale_alpha(range=c(0,1)) +
  scale_x_discrete("", expand = c(0, 0)) + 
  scale_y_discrete("", expand = c(0, 0)) + 
  theme_grey(base_size = 9) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0)) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

alphaaestheticを使用したggplot2ヒートマップ

alpha=rescaleを使用してから、を使用してアルファ範囲をスケーリングすることに注意してscale_alpha(range=c(0,1))ください。これは、プロットに合わせて範囲を適切に変更するように適合させることができます。

于 2017-08-29T15:22:26.980 に答える