2015-10-02 21 views
8

Tôi đang phân tích một chuỗi thay đổi theo số không. Và để xem nơi có các phần của bộ truyện với xu hướng chủ yếu là tích cực hoặc chủ yếu là tiêu cực, tôi đang vẽ một số geom_smooth. Tôi đã tự hỏi nếu nó có thể có màu sắc của dòng mịn được phụ thuộc vào việc có hay không nó là trên hoặc dưới 0. Dưới đây là một số mã mà sản xuất một đồ thị giống như những gì tôi đang cố gắng để tạo ra.Màu có điều kiện của một geom_smooth

set.seed(5) 
r <- runif(22, max = 5, min = -5) 
t <- rep(-5:5,2) 
df <- data.frame(r+t,1:22) 
colnames(df) <- c("x1","x2") 
ggplot(df, aes(x = x2, y = x1)) + geom_hline() + geom_line() + geom_smooth() 

tôi coi việc tính toán giá trị mịn, thêm chúng vào df và sau đó sử dụng một scale_color_gradient, nhưng tôi đã tự hỏi nếu có một cách để đạt được điều này trong ggplot trực tiếp.

+0

được dòng này làm gì vậy? 'giá trị (t) <- 1: 5' – zx8754

+0

Hoàn toàn không có gì. đã xóa nó ngay bây giờ. –

+0

@MarijnStevering Khi tôi chạy mã của bạn, tôi nhận được một lỗi: "Lỗi: geom_hline yêu cầu thiếu tính thẩm mỹ sau: yintercept". Bạn có thể muốn thêm nó (mặc dù 'geom_hline' là không cần thiết cho vấn đề thực tế của bạn). +1 cho một câu hỏi hay. – Henrik

Trả lời

7

Bạn có thể sử dụng đối số n trong geom_smooth để tăng "số điểm để đánh giá mượt mà ở" để tạo ra một số giá trị y hơn gần bằng không . Sau đó, sử dụng ggplot_build để lấy các giá trị được làm mịn từ đối tượng ggplot. Các giá trị này được sử dụng trong một geom_line, được thêm vào đầu cốt truyện ban đầu. Cuối cùng, chúng tôi đã vượt quá giá trị y = 0 với geom_hline.

# basic plot with a larger number of smoothed values 
p <- ggplot(df, aes(x = x2, y = x1)) + 
    geom_line() + 
    geom_smooth(linetype = "blank", n = 10000) 

# grab smoothed values 
df2 <- ggplot_build(p)[[1]][[2]][ , c("x", "y")] 

# add smoothed values with conditional color 
p + 
    geom_line(data = df2, aes(x = x, y = y, color = y > 0)) + 
    geom_hline(yintercept = 0) 

enter image description here

6

Something như thế này:

# loess data 
res <- loess.smooth(df$x2, df$x1) 
res <- data.frame(do.call(cbind, res)) 

res$posY <- ifelse(res$y >= 0, res$y, NA) 
res$negY <- ifelse(res$y < 0, res$y, NA) 

# plot 
ggplot(df, aes(x = x2, y = x1)) + 
    geom_hline() + 
    geom_line() + 
    geom_line(data=res, aes(x = x, y = posY, col = "green")) + 
    geom_line(data=res, aes(x = x, y = negY, col = "red")) + 
    scale_color_identity() 

enter image description here

+1

Ý tưởng hay, nhưng nó có một số vấn đề không mong muốn ... – tonytonov

+0

@tonytonov Tôi biết, không có thời gian vào lúc này, tôi nghĩ rằng tôi có thể chia sẻ để OP có thể bắt đầu, hãy chỉnh sửa. – zx8754

+0

@tonytonov được cập nhật, một lần nữa cần một số công việc ... – zx8754

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