2011-10-24 20 views
5

Tôi có một ô geom_area trông giống như sau: area plotLàm cách nào để điền vào một ô geom_area() bằng ggplot?

Tôi muốn tô màu mọi thứ phía trên trục x màu xanh lá cây và mọi thứ bên dưới trục x màu đỏ. Tôi có cột danh mục trong dữ liệu chứa chuỗi "dương" cho tất cả các giá trị dương và "âm" cho tất cả các giá trị âm, vì vậy tôi đã thử điền fill = category và sử dụng scale_fill_manual để đặt dương sang màu xanh lục và âm sang màu đỏ, nhưng cung cấp cho tôi điều này: colored area plot

Màu xanh lá cây phía trên dấu x trông đúng, nhưng màu đỏ bên dưới trục không đúng. Tôi đã kiểm tra dữ liệu của mình và không có điểm dữ liệu tiêu cực nào có màu đỏ sau tháng 10 và sử dụng geom_point thay vào đó tôi nhận được màu sắc chính xác.

Dưới đây là một mẫu dữ liệu của tôi:

created     score category 
2011-10-19 21:26:19  2 positive 
2011-10-19 22:50:33 -2 negative 
2011-10-20 15:12:38 -2 negative 
2011-10-20 17:19:24 -2 negative 
2011-10-20 22:12:44  2 positive 
2011-10-20 22:16:57  4 positive 
2011-10-21 08:22:53  2 positive 

và đây là đoạn code tôi đang sử dụng để làm cho cốt truyện:

ggplot(data = df, aes(x = created, y = score, colour = category)) + geom_point(aes(fill = category)) + scale_fill_manual(values = c("positive" = "green", "negative" = "red"))

Vấn đề của tôi có thể liên quan đến this previous question.

+2

[này] (http://learnr.wordpress.com/2009/10/22/ggplot2- bài đăng trên blog hai màu-xy-khu vực-combo-chart/# more-2195) có thể hữu ích. – joran

Trả lời

7

Bạn cần tạo biến nhóm mới cho từng phân đoạn dương/âm. Để thực hiện quá trình chuyển đổi ít "khối ô vuông", bạn có thể chỉ đầu tiên suy dữ liệu:

require(ggplot2) 

# Load data 
df = read.table('data.txt', header=T) 
df$created = as.POSIXct(df$created, tz='UTC') 

# Interpolate data 
lin_interp = function(x, y, length.out=100) { 
    approx(x, y, xout=seq(min(x), max(x), length.out=length.out))$y 
} 
created.interp = lin_interp(df$created, df$created) 
created.interp = as.POSIXct(created.interp, origin='1970-01-01', tz='UTC') 
score.interp = lin_interp(df$created, df$score) 
df.interp = data.frame(created=created.interp, score=score.interp) 

# Make a grouping variable for each pos/neg segment 
cat.rle = rle(df.interp$score < 0) 
df.interp$group = rep.int(1:length(cat.rle$lengths), times=cat.rle$lengths) 

# Plot 
dev.new(width=6, height=4) 
ggplot(data = df.interp, aes(x = created, y = score, fill=score>0, group=group)) + geom_area() + scale_fill_manual(values = c('green', 'red')) 

enter image description here

+0

BTW Tôi trích dẫn cột 'đã tạo' từ dữ liệu mẫu của bạn để tải dễ dàng hơn. –

+0

Làm việc cho tôi! rle là một thủ thuật mới gọn gàng, quá. –

+0

@WilliamGunn Tuyệt vời Tôi rất vui vì nó đã hoạt động. Tôi chỉ biết về rle, bản thân mình. :) –

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