2012-10-22 66 views

回答

32

首先,從重建後的圖形,它更新爲更高版本(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)) 

enter image description here

使用對於不同類別的不同漸變顏色並不是那麼簡單。將fill映射到interaction(rescale, Category)(其中Category爲Offensive/Defensive/Other;請參閱下文)的概念方法不起作用,因爲交互因子和連續變量會給出無法映射的離散變量。

來解決這個問題的方法是人工執行此相互作用,映射到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是在數(3或4)的0時,不同的類別可以由一百偏移,以保持它們分開。同時,根據重新縮放的值和顏色,確定每個顏色漸變的端點應該在哪裏。

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

enter image description here

重新排序,以獲得相關的統計信息集中在一起是另一個在各種變量上應用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)) 

enter image description here

+0

令人印象深刻!非常感謝你。 – ThatGuy

+0

只是出於好奇,如何才能給玩家分配不同的顏色(即對行而不是列)? – ThatGuy

+0

相同的一般概念;創建一個偏移量縮放變量,它是原始縮放變量和'as.numeric(NAME)'的函數。然後梳理各種範圍的端點。但我認爲這將是一個糟糕的主意,因爲你的比較是分欄的;使用不同的顏色(即不同的漸變部分)使得元素在列中不具有可比性。 –

2

下面是一個使用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)) 

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

ggplot2 heatmap using alpha aesthetic

請注意使用alpha=rescale,然後使用scale_alpha(range=c(0,1))對alpha範圍進行縮放,可以根據您的繪圖適當地改變範圍。