2013-12-18 11 views
6

Tôi muốn vẽ một số cột của ma trận dữ liệu dựa vào một cột, vì vậy thay vì vẽ từng cột riêng lẻ, tôi đang sử dụng vòng lặp. Vấn đề là tên cột được vẽ và màu phải biến nếu tôi sử dụng vòng lặp. Tôi thử như sau:Chuyển màu thành biến aes_string

allDs <- sort(unique(plotdata$D)) 
p <- ggplot(plotdata, aes(SpaceWidth)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    colorName <- paste("D", thisD, sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], aes_string(y = tlColName, color = colorName)) 
} 
p <- p + scale_colour_manual("Legend", values = c("D2" = "blue", "D3" = "red", "D4" = "green", "D6" = "violet", "D7" = "yellow")) 
p <- p + scale_x_log10(breaks = composite$SpaceWidth) 
p <- p + facet_wrap(~ Drawn, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

Nhưng khi tôi chạy này, tôi nhận được lỗi sau:

Error in eval(expr, envir, enclos) : object 'D2' not found 

Làm thế nào có thể màu (hoặc bất kỳ giá trị khác) được thông qua như là một biến trong aes_string? Cảm ơn trước.

Dữ liệu để thử nghiệm có sẵn here.

+1

Bạn cũng có thể cung cấp mẫu dữ liệu của mình không? thử sử dụng 'dput (head (plotData, 100))' và dán đầu ra của giao diện điều khiển vào câu hỏi của bạn. –

+0

FYI - lỗi có nghĩa là cột 'D2' không thực sự có mặt trong khung dữ liệu' plotdata'. Điều đó nói rằng, có khả năng một cách khác (tốt hơn) để đạt được những gì bạn đang yêu cầu, mà không cần sử dụng vòng lặp for. –

+0

Nhưng vấn đề dường như là với giá trị "màu" mà tôi đang đi qua. Nếu tôi xóa màu khỏi aes_string thì cốt truyện sẽ hoạt động. Dù sao, nó sẽ rất hữu ích nếu bạn có thể cho tôi biết làm thế nào để làm điều này tốt hơn và một cách thích hợp. – Dronacharya

Trả lời

3

Lý do lỗi là khá tự giải thích: D2 không có trong tập dữ liệu gốc. Lưu ý rằng bạn có thể ánh xạ màu trực tiếp đến biến D của bạn, do đó, việc xây dựng colorName của bạn là thừa. Kiểm tra điều này:

allDs <- sort(unique(plotdata$D)) 
plotdata$D <- as.factor(plotdata$D) 
p <- ggplot(plotdata, aes(SpaceWidth, color=D)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], 
      aes_string(y = tlColName)) 
} 
p <- p + scale_colour_manual("Legend", 
     values = c("blue", "red", "green", "violet", "yellow")) 
p <- p + scale_x_log10(breaks = plotdata$SpaceWidth) 
p <- p + facet_wrap(~ D, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

Lưu ý rằng để ánh xạ đúng màu, trước tiên bạn cần chuyển nó thành hệ số. enter image description here

UPD: Vâng, hãy để tôi chỉ cho bạn cách để thoát khỏi vòng lặp for, mà nói chung là không phải là một thực hành tốt.

library(reshape2) 
melt.plotdata <- melt(plotdata, id.vars=c("SpaceWidth", "D")) 
melt.plotdata <- melt.plotdata[order(melt.plotdata$SpaceWidth), ] 
melt.plotdata <- na.omit(melt.plotdata) 
q <- ggplot(melt.plotdata, aes(SpaceWidth, value, colour=variable)) + geom_path() 
q + scale_colour_manual("Legend", 
         values = c("blue", "red", "green", "violet", "yellow")) + 
    scale_x_log10(breaks = melt.plotdata$SpaceWidth) + 
    facet_wrap(~ D, ncol = 3) + 
    labs(title = "Fu plot", y = "MTN") 

Cốt truyện sẽ giống hệt trang tôi đã đăng ở trên.

+0

Cảm ơn! hãy để tôi thử điều này :) – Dronacharya

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