2012-04-14 27 views
36

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

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?

facet_grid

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

đâ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

+1

@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

+1

hoặc tình nguyện viên R-savvy – baptiste

Trả lời

19

Tôi không hiểu lắm. Bạn đã viết một hàm chuyển đổi các nhãn ngắn của bạn thành nhãn dài, mô tả. Có gì sai khi chỉ cần thêm cột mới và sử dụng facet_wrap trên cột đó thay thế?

mydf <- melt(mydf, id = c('date')) 
mydf$variableLab <- mf_labeller('variable',mydf$variable) 

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_wrap(~ variableLab, ncol = 2) 
print (p1) 
+8

Không có gì sai với việc thêm một cột mới - bộ não của tôi đã từ bỏ ngay trước bước cuối cùng đó! Tôi nên biết làm điều đó. "Nếu nghi ngờ, hãy thêm cột vào khung dữ liệu" thực tế là câu lệnh trợ giúp mặc định cho ggplot. Cảm ơn. – SlowLearner

+0

Xin vui lòng giúp đỡ, tôi đang sử dụng chức năng này và lỗi sau: 'In if (variable == value) {: điều kiện có độ dài> 1 và chỉ phần tử đầu tiên sẽ được sử dụng' trong đó' variableLab' có 0 phần tử sau khi thực hiện. –

+0

tôi nghĩ bạn phải sử dụng if (biến [i] == value [i]) trong vòng lặp for qua độ dài của khung dữ liệu của bạn để khắc phục lỗi của bạn – alily

8

Để thay đổi tên nhãn, chỉ cần thay đổi hệ số nhân tố bạn sử dụng trong facet_wrap. Chúng sẽ được sử dụng trong facet_wrap trên các dải. Bạn có thể sử dụng thiết lập tương tự như khi sử dụng hàm labeller trong facet_grid. Chỉ cần làm điều gì đó như:

new_labels = sapply(levels(df$factor_variable), custom_labeller_function) 
df$factor_variable = factor(df$factor_variable, levels = new_labels) 

Bây giờ bạn có thể sử dụng factor_variable trong facet_wrap.

+0

cảm ơn bạn, đây là cách tiếp cận hữu ích. – SlowLearner

Các vấn đề liên quan