这篇Learning R博客文章展示了如何使用ggplot2制作篮球统计数据的热图.完成的热图如下所示:

我的问题(受到杰克评论学习R博客文章的启发)是:是否可以针对不同类别的统计数据(攻击性,防御性,其他)使用不同的渐变颜色?
Bri*_*ggs 45
首先,从帖子重新创建图表,为更新的(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))
Run Code Online (Sandbox Code Playgroud)

对不同类别使用不同的渐变颜色并不是那么简单.概念方法,映射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"))
Run Code Online (Sandbox Code Playgroud)
由于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")
Run Code Online (Sandbox Code Playgroud)
现在替换fill变量rescaleoffset并更改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))
Run Code Online (Sandbox Code Playgroud)

重新排序以获取相关统计数据是该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))
Run Code Online (Sandbox Code Playgroud)

小智 8
这是一个更简单的建议,使用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"))
Run Code Online (Sandbox Code Playgroud)
然后,将rescale变量标准化为0到1之间:
nba.s$rescale = (nba.s$rescale-min(nba.s$rescale))/(max(nba.s$rescale)-min(nba.s$rescale))
Run Code Online (Sandbox Code Playgroud)
现在,做绘图:
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())
Run Code Online (Sandbox Code Playgroud)
注意使用,alpha=rescale然后使用缩放alpha范围scale_alpha(range=c(0,1)),可以适应您的情节适当改变范围.
| 归档时间: |
|
| 查看次数: |
12074 次 |
| 最近记录: |