簡體   English   中英

ggplot2 heatmaps:為類別使用不同的漸變

[英]ggplot2 heatmaps: using different gradients for categories

這篇Learning R博客文章展示了如何使用ggplot2制作籃球統計數據的熱圖。 完成的熱圖如下所示:

在此輸入圖像描述

我的問題(受到傑克評論學習R博客文章的啟發)是:是否可以針對不同類別的統計數據(攻擊性,防御性,其他)使用不同的漸變顏色?

首先,從帖子重新創建圖形,為更新(0.9.2.1)版本的ggplot2更新它,該版本具有不同的主題系統並附加更少的包:

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)范圍內,因此不同的類別可以偏移一百來保持它們分開。 同時,根據重新調整的值和顏色,確定每個顏色漸變的端點應該在哪里。

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")

現在用rescaleoffset替換fill變量並更改fill比例以使用scale_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))

在此輸入圖像描述

這是一個更簡單的建議,使用ggplot2美學來映射漸變和顏色類別。 只需使用alpha-aesthetic來生成漸變,以及類別的填充美學。

這是代碼,重構Brian Diggs的回復:

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())

使用alpha美學的ggplot2熱圖

注意使用alpha=rescale scale_alpha(range=c(0,1))然后使用scale_alpha(range=c(0,1))縮放alpha范圍,可以調整它以適合您的繪圖更改范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM