2012-12-15 38 views
17

Tôi đang tìm cách kéo giãn độ dốc màu giữa hai giá trị và gắn nhãn chú giải, bất kể phạm vi giá trị dữ liệu trong tập dữ liệu. Về cơ bản, có một hàm tương đương với ylim() cho các gradient màu không?ggplot thang tỷ lệ màu để nằm ngoài phạm vi dữ liệu

Được mã mà lô giá trị az thường giữa -1 và 1, tôi có thể vẽ và gắn nhãn một gradient nếu vỡ nằm trong phạm vi dữ liệu:

require(ggplot2) 

#generator from http://docs.ggplot2.org/current/geom_tile.html 
pp <- function (n,r=4) { 
    x <- seq(-r*pi, r*pi, len=n) 
    df <- expand.grid(x=x, y=x) 
    df$r <- sqrt(df$x^2 + df$y^2) 
    df$z <- cos(df$r^2)*exp(-df$r/6) 
    df 
} 

t <- pp(30) 
summary(t) 
b <- c(-.5,0,.5) 
p <- ggplot(data=t,aes(x=x,y=y))+ 
    geom_tile(aes(fill=z))+ 
    scale_fill_gradientn(colours=c("navyblue","darkmagenta","darkorange1"),breaks=b,labels=format(b)) 
try(ggsave(plot=p,filename=<somefile.png>,height=3,width=4)) 

graham jeffries ggplot scale fill example

Nhưng khi tôi thay đổi phá vỡ các giá trị bên ngoài phạm vi quan sát được, màu tô chuyển tiếp dường như không điều chỉnh và các nhãn gradient không xuất hiện.

b <- c(-3,0,3) 

graham jeffries ggplot scale fill example 2

Trả lời

37

Nó rất quan trọng cần nhớ rằng trong ggplot, breaks sẽ cơ bản không bao giờ thay đổi quy mô của chính nó. Nó sẽ chỉ thay đổi nội dung được hiển thị trong hướng dẫn hoặc chú giải.

Bạn nên thay đổi giới hạn của quy mô thay vì:

ggplot(data=t, aes(x=x, y=y)) + 
    geom_tile(aes(fill=z)) + 
    scale_fill_gradientn(limits = c(-3,3), 
    colours=c("navyblue", "darkmagenta", "darkorange1"), 
    breaks=b, labels=format(b)) 

Và bây giờ nếu bạn muốn phá vỡ xuất hiện trong truyền thuyết để mở rộng hơn nữa, bạn có thể thay đổi chúng để thiết lập nơi đánh dấu đánh dấu xuất hiện.

Sự tương tự tốt để ghi nhớ luôn là trục x và y thông thường. Đặt "ngắt" sẽ chỉ thay đổi nơi dấu tick xuất hiện. Nếu bạn muốn thay đổi mức độ của trục x hoặc y, bạn thường sẽ thay đổi cài đặt như "giới hạn" của chúng.

+0

Tôi nghĩ rằng tôi đang cố gắng để đạt được một cái gì đó tương tự, nhưng thất bại với giải pháp này. Tôi có một số bộ dữ liệu trong đó các giá trị nằm trong phạm vi giới hạn, nhưng về mặt lý thuyết chúng có thể nằm trong khoảng từ 0 đến -100 (dB). làm scale_fill_gradient (low = "white", high = "red") là tốt, nhưng không cho phép tôi so sánh trực quan các tập dữ liệu. scale_fill_gradient (low = "white", high = "red", limits = c (0, -100), guide = "legend", giới hạn = c (0, -100), break = b, labels = format (c (0, -100)) không tạo ra huyền thoại. – MartinT

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