Tôi có một số lượng lớn chuỗi dữ liệu mà tôi muốn vẽ bằng cách sử dụng bội số nhỏ. Sự kết hợp giữa ggplot2 và facet_wrap
thực hiện những gì tôi muốn, thường tạo ra một khối nhỏ 6 x 6 khía cạnh. Dưới đây là một phiên bản đơn giản:Cách chỉ định các cột trong facet_grid HOẶC cách thay đổi nhãn trong facet_wrap
Vấn đề là tôi không có quyền kiểm soát đầy đủ trên nhãn trong dải khía cạnh. Tên của các cột trong khung dữ liệu ngắn và tôi muốn giữ chúng theo cách đó, nhưng tôi muốn các nhãn trong các khía cạnh có tính mô tả hơn. Tôi có thể sử dụng facet_grid
để tôi có thể tận dụng chức năng labeller
nhưng sau đó dường như không có cách đơn giản để chỉ định số lượng cột và hàng dài các mặt chỉ không hoạt động cho tác vụ cụ thể này. Tôi có thiếu một cái gì đó hiển nhiên?
Q. Làm thế nào tôi có thể thay đổi các nhãn khía cạnh khi sử dụng facet_wrap mà không thay đổi tên cột? Ngoài ra, làm cách nào tôi có thể chỉ định số cột và hàng khi sử dụng facet_grid?
Mã cho một ví dụ đơn giản sau. Trong cuộc sống thực, tôi đang đối phó với nhiều nhóm, mỗi nhóm chứa hàng chục chuỗi dữ liệu, mỗi nhóm thay đổi thường xuyên, vì vậy mọi giải pháp sẽ phải được tự động thay vì dựa vào các giá trị gán theo cách thủ công.
require(ggplot2)
require(reshape)
# Random data with short column names
set.seed(123)
myrows <- 30
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows),
aa = runif(myrows, min=1, max=2),
bb = runif(myrows, min=1, max=2),
cc = runif(myrows, min=1, max=2),
dd = runif(myrows, min=1, max=2),
ee = runif(myrows, min=1, max=2),
ff = runif(myrows, min=1, max=2))
# Plot using facet wrap - we want to specify the columns
# and the rows and this works just fine, we have a little block
# of 2 columns and 3 rows
mydf <- melt(mydf, id = c('date'))
p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_line() +
facet_wrap(~ variable, ncol = 2)
print (p1)
# Problem: we want more descriptive labels without changing column names.
# We can change the labels, but doing so requires us to
# switch from facet_wrap to facet_grid
# However, in facet_grid we can't specify the columns and rows...
mf_labeller <- function(var, value){ # lifted bodily from the R Cookbook
value <- as.character(value)
if (var=="variable") {
value[value=="aa"] <- "A long label"
value[value=="bb"] <- "B Partners"
value[value=="cc"] <- "CC Inc."
value[value=="dd"] <- "DD Company"
value[value=="ee"] <- "Eeeeeek!"
value[value=="ff"] <- "Final"
}
return(value)
}
p2 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_line() +
facet_grid(~ variable, labeller = mf_labeller)
print (p2)
đây là [vấn đề mở] (https://github.com/hadley/ggplot2/issues/25), nhưng trong trường hợp cụ thể của bạn (đổi tên đơn giản, không có bquote hoặc âm mưu), bạn chỉ có thể đổi tên các biến trước đó. – baptiste
@baptiste Tôi không nhận thức được rằng đó là một vấn đề mở (và đã được như vậy trong hai năm nay, vì vậy có thể không thay đổi bất kỳ thời gian sớm). Nghi ngờ hadley nhu cầu sinh viên tốt nghiệp hơn để đưa vào dự án! – SlowLearner
hoặc tình nguyện viên R-savvy – baptiste