2012-03-21 28 views
10

Tôi đang gặp khó khăn với một vài ngoại lệ làm cho quy mô màu vô dụng.ggplot2 Quy mô màu bị ảnh hưởng bởi các ngoại lệ

Dữ liệu của tôi có biến Độ dài dựa trên một phạm vi, nhưng thường sẽ có một vài giá trị lớn hơn nhiều. Dữ liệu ví dụ bên dưới có 95 giá trị từ 500 đến 1500 và 5 giá trị trên 50.000. Các huyền thoại màu kết quả có xu hướng sử dụng 10k, 20k, ... 70k cho các thay đổi màu sắc khi tôi muốn xem thay đổi màu sắc giữa 500 và 1500. Thật vậy, bất cứ điều gì trên khoảng 1300 nên cùng một màu rắn (có thể là trung bình +/- điên), nhưng tôi không biết xác định đâu.

Tôi đang mở cho bất kỳ giải pháp ggplot nào, nhưng giá trị thấp hơn lý tưởng sẽ là màu đỏ, trắng trung bình và cao hơn màu xanh (thấp là xấu). Trong tập dữ liệu của riêng tôi, ngày tháng là ngày thực tế với as.POSIXct() trong ggplot aes(), nhưng dường như không ảnh hưởng đến ví dụ.

#example data 
date <- sample(x=1:10,size=100,replace=T) 
stateabbr <- sample(x=1:50,size=100,replace=T) 
Length <- c(sample(x=500:1500,size=95,replace=T),60000,55000,70000,50000,65000) 
x <- data.frame(date=date,stateabbr=stateabbr,Length=Length) 

#main plot 
(g <- ggplot(data=x,aes(x=date,y=factor(stateabbr))) + 
    geom_point(aes(color=as.numeric(as.character(Length))),alpha=3/4,size=4) + 
    #scale_x_datetime(labels=date_format("%m/%d")) + 
    opts(title="Date and State") + xlab("Date") + ylab("State")) 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

Thêm trans = "log" hoặc "sqrt" không hoàn toàn thực hiện thủ thuật.

Cảm ơn sự giúp đỡ của bạn! ?

+0

workaround của tôi đã được sử dụng một quy mô đăng nhập (hoặc một cái gì đó như nó) để tô màu khi tôi có ngoại lệ. Tuy nhiên, tôi rất muốn biết nếu có một cách tốt hơn! – Justin

+0

Vâng, tôi đã thử điều đó, nhưng nó vẫn còn cho ví dụ này. Hy vọng rằng một cách tốt hơn đi lên! – ARobertson

+0

Bạn có thể sử dụng? Cắt, để tạo một biến khác cho các lần ngắt trước của bạn và sau đó đặt 'color =' aesthetic thành biến đó. –

Trả lời

8

Dưới đây là một lựa chọn hơi khó khăn:

#Create a new variable indicating the unusual values 
x$Length1 <- "> 1500" 
x$Length1[x$Length <= 1500] <- NA 

#main plot 
# Using fill - tricky! 
g <- ggplot() + 
    geom_point(data = subset(x,Length <= 1500), 
      aes(x=date,y=factor(stateabbr),color=Length),size=4) + 
    geom_point(data = subset(x,Length > 1500), 
      aes(x=date,y=factor(stateabbr),fill=Length1),size=4)+ 
    opts(title="Date and State") + xlab("Date") + ylab("State") 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

enter image description here

Vì vậy, phần khó hiểu ở đây là sử dụng fill trên điểm, để thuyết phục ggplot để tạo ra một huyền thoại khác. Bạn rõ ràng có thể tùy chỉnh điều này với các nhãn và màu sắc khác nhau cho tỷ lệ lấp đầy.

Một điều nữa, đọc câu trả lời của Brandon. Về nguyên tắc, bạn có thể kết hợp cả hai phương pháp tiếp cận bằng cách lấy các giá trị ngoại lệ, sử dụng cut để tạo biến phân loại riêng cho chúng và sau đó sử dụng mẹo của tôi với thang tỷ lệ fill. Bằng cách đó bạn có thể chỉ ra nhiều nhóm điểm xa nhau.

6

Từ nhận xét của tôi, xem cắt

x$colors <- cut(x$Length, breaks=c(0,500,1000,1300,max(x$Length))) 

g <- ggplot(data=x,aes(x=date,y=factor(stateabbr),color=colors)) + 
    geom_point() + 
    opts(title="Date and State") + 
    xlab("Date") + 
    ylab("State") 
+0

Trong trường hợp này, tôi sẽ phải cung cấp màu "liên tục tìm kiếm" cho một biến rời rạc với scale_color_manual, phải không? Tôi nhận được màu rời rạc, không phải là xấu, chỉ là một quan sát. – ARobertson

+0

Có, để phù hợp với câu hỏi ban đầu của bạn (đỏ -> trắng -> xanh lam). Hãy thử một cái gì đó như + scale_colour_manual (giá trị = c ("đỏ", "trắng", "xanh dương")). Xem ở đây để biết các bảng màu hiệu quả hơn: http://learnr.wordpress.com/2009/04/15/ggplot2-qualitative-colour-palettes/ Tôi nghĩ rằng việc chỉ định bảng màu theo vùng sẽ phù hợp với nhu cầu của bạn nhất. Chỉ cần nhớ rằng bạn cần một màu sắc cho mỗi break bạn tạo ra với cắt. Nó không khó để giả mạo nó để nó "có vẻ" liên tục, với một chút sử dụng pallette thông minh. –

+0

Nghe hay, cảm ơn! – ARobertson

3

Loại bỏ các ngoại lệ. Nhanh chóng và dơ bẩn, tôi biết, nhưng tôi nghĩ nó đáng nói. Bạn luôn có thể mô tả chúng trong văn bản của bạn. Tại sao để họ hủy hoại các phân tích và đồ thị của bạn?

Có một bài báo đề cập trong bài đăng blog mà những giao dịch với giá trị ngoại biên đạo đức loại bỏ:

http://psuc2f.wordpress.com/2011/10/14/is-it-dishonest-or-unethical-to-remove-outliers/

Một cách đơn giản để đối phó với họ sẽ để chỏm họ:

df $ Giá trị [df $ Value> 1300] = 1300

Một lần nữa, bạn có thể mô tả rằng bạn đã làm điều này trong văn bản hoặc thậm chí chỉ chỉnh sửa tỷ lệ để nói 1300+ thay vì 1300

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