Thứ nhất, tái tạo biểu đồ từ đăng bài, cập nhật nó cho mới hơn (0.9.2.1) phiên bản của ggplot2
trong đó có một hệ thống chủ đề khác nhau và gắn gói ít:
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))
Sử dụng màu gradient khác nhau cho các loại khác nhau không phải là tất cả những điều đơn giản. Cách tiếp cận khái niệm, để ánh xạ fill
đến interaction(rescale, Category)
(trong đó Category
là Tấn công/Phòng thủ/Khác; xem bên dưới) không hoạt động vì tương tác với một yếu tố và biến liên tục cho một biến rời rạc mà không thể ánh xạ tới fill
.
Cách để làm được việc này là để làm nhân tạo tương tác này, lập bản đồ rescale
để không chồng chéo dãy cho các giá trị khác nhau của Category
và sau đó sử dụng để lập bản đồ scale_fill_gradientn
mỗi một trong các khu vực để gradient màu sắc khác nhau.
Đầu tiên tạo danh mục. Tôi nghĩ rằng những bản đồ này cho những người trong nhận xét, nhưng tôi không chắc chắn; thay đổi biến nào trong danh mục nào là dễ dàng.
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"))
Kể từ rescale
là trong vòng vài (3 hoặc 4) 0, các loại khác nhau có thể được bù đắp bằng một trăm để giữ chúng riêng biệt. Đồng thời, xác định vị trí của các điểm cuối của mỗi gradient màu, cả về giá trị và màu sắc được thay đổi kích thước.
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")
Bây giờ thay thế các biến fill
với rescaleoffset
và thay đổi quy mô fill
sử dụng scale_fill_gradientn
(nhớ để rescale các giá trị):
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))
Sắp xếp lại để có được số liệu thống kê liên quan với nhau là khác áp dụng chức năng reorder
trên các biến khác nhau:
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))
Ấn tượng! Cảm ơn nhiều. – ThatGuy
Chỉ vì tò mò, làm thế nào một người có thể gán màu sắc khác nhau cho người chơi thay vào đó (tức là các hàng thay vì các cột)? – ThatGuy
Khái niệm chung tương tự; tạo một biến được chia tỷ lệ bù trừ là một hàm của biến tỷ lệ gốc và 'as.numeric (NAME)'. Sau đó, trêu chọc các điểm cuối của các phạm vi khác nhau. Nhưng tôi nghĩ rằng đó sẽ là một ý tưởng tồi vì các so sánh của bạn là theo chiều kim đồng hồ; sử dụng các màu khác nhau (nghĩa là các phần của các độ dốc khác nhau) làm cho các phần tử không thể so sánh được trong một cột. –