This Learning R blog post顯示如何使用ggplot2製作籃球統計數據的熱圖。完成後的熱圖是這樣的:ggplot2熱點圖:使用不同的類別梯度
我的問題(由Jake誰在學習[R博客文章評論啓發)是:這將有可能使用不同類別統計的(進攻不同的漸變顏色,防守,其他)?
This Learning R blog post顯示如何使用ggplot2製作籃球統計數據的熱圖。完成後的熱圖是這樣的:ggplot2熱點圖:使用不同的類別梯度
我的問題(由Jake誰在學習[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
爲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))
重新排序,以獲得相關的統計信息集中在一起是另一個在各種變量上應用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美學到兩個梯度以及顏色類別映射一個簡單的建議。只需使用阿爾法美學產生漸變,併爲類別的填充美學。
下面是代碼這樣做,重構布賴恩迪格斯響應:
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=rescale
,然後使用scale_alpha(range=c(0,1))
對alpha範圍進行縮放,可以根據您的繪圖適當地改變範圍。
令人印象深刻!非常感謝你。 – ThatGuy
只是出於好奇,如何才能給玩家分配不同的顏色(即對行而不是列)? – ThatGuy
相同的一般概念;創建一個偏移量縮放變量,它是原始縮放變量和'as.numeric(NAME)'的函數。然後梳理各種範圍的端點。但我認爲這將是一個糟糕的主意,因爲你的比較是分欄的;使用不同的顏色(即不同的漸變部分)使得元素在列中不具有可比性。 –