2014-05-09 15 views
5

Tôi có khung dữ liệu sau:màu sắc liên tục ggplot2 cho quy mô rời rạc và xóa một huyền thoại

df 
zone  X  Y Value 
    1 604000 2673000  522 
    1 612000 2643000  524 
    .  .  .  . 
    .  .  .  . 
615 604000 2673000  698 

Trong thực tế, tôi có 615 khu, X và Y là các Lambert phối và giá trị gia tăng là mưa. khu My đại diện cho Pháp và tôi đang cố gắng để âm mưu chúng:

mi <- 300 
ma <- 1900 

df$val <- cut(df$Sim, breaks=seq(mi,ma,100), 
      labels = paste("(", format(seq(mi,ma,100)[1:(length(seq(mi,ma,100))-1)]), 
          ", ", format(seq(mi,ma,100)[-1]), "]", sep = "")) 

breaks <- unique(bincol(df$Sim,"green","yellow","red")) 
breaks <- breaks[order(unique(df$val))] 

p <- ggplot(data =df, aes(x=X, y=Y)) 
p <- (p  
     + theme_bw() 
     + coord_equal() 
     + geom_tile(aes(fill=val)) 
     + scale_colour_manual("mm", values = breaks) 
     + geom_path(data = polfrance, colour = 'black', 
       aes(x = long, y = lat, group = group)) 
     + geom_path(data = sympzones, colour = 'grey40', 
        aes(x = long, y = lat, group = group)) 
    ) 

p <- (p + scale_y_continuous(limits=c(1580000,2730000), 
         breaks=seq(1600000,2700000, 200000), 
         labels= seq(1600,2700,200), expand=c(0,0)) 
     + scale_x_continuous(limits=c(0,1250000), 
         breaks= seq(0,1250000, 400000), 
         labels= seq(0,1250, 400), expand=c(0,0)) 
     + xlab("X Lambert [km]") 
     + ylab("Y Lambert [km]") 
     ) 

tôi sử dụng sympzones và polfrance để vẽ đường viền của khu tôi.

bincol <- function(x,low,medium,high) { 
    breaks <- function(x) pretty(range(x), n = nclass.Sturges(x), min.n = 1) 

    colfunc <- colorRampPalette(c(low, medium, high)) 

    binned <- cut(x,breaks(x)) 

    res <- colfunc(length(unique(binned)))[as.integer(binned)] 
    names(res) <- as.character(binned) 
    res 
} 

Giá trị là 300-1900 và đây là những gì tôi có được:

plot

Tôi có một vấn đề:

tôi không thể thay đổi truyền thuyết , đây là truyền thuyết từ geom_file và nó không tính đến scale_colour_manual. Vì vậy, đây không phải là một thứ tự tăng dần, không phải là tiêu đề tốt (tôi muốn "mm") và không phải là màu sắc tốt.

Tôi không biết nếu nó thực sự rõ ràng ... Ai đó có thể giúp tôi?

Edit: Tôi lấy cảm hứng từ đó: easiest way to discretize continuous scales for ggplot2 color scales?

+0

Tôi nghĩ rằng bạn có thể màu sắc khó hiểu và điền vào. Bằng cách chỉ định 'color = ...' trong 'geom_tile (...)', bạn chỉ định màu viền *, không phải là thứ bạn muốn. Đó là lý do tại sao bạn "có rất nhiều ô vuông nhỏ". Sắp xếp lại huyền thoại phức tạp hơn một chút. Nếu bạn tải lên tập dữ liệu của mình (bao gồm cả bản đồ) và cung cấp liên kết, tôi có thể hiển thị cho bạn. – jlhoward

+0

đặt 'giảm ​​= FALSE' trong' ngắt <- ngắt [thứ tự (nhãn, giảm = TRUE)] 'và ' nhãn <- nhãn [thứ tự (nhãn, giảm = TRUE)] 'nên đặt thứ tự các nhãn chú giải thành tăng dần – OdeToMyFiddle

+0

TRUE, tôi đã thay đổi nó và vấn đề mới của tôi là tôi không thể thay đổi chú thích (tên, màu sắc, thứ tự). jlhoward, bạn có ý gì khi cung cấp liên kết? – Chika

Trả lời

9

Bạn có hai quy mô bởi vì bạn đang sử dụng cả một fillcolor thẩm mỹ, và bạn đang sử dụng các biến khác nhau đối với họ (một rời rạc, một liên tục). Những gì bạn muốn làm là sử dụng một biến duy nhất chỉ cho điền.

Ngoài ra, nhãn của bạn đều bị rối tung vì bạn chuyển chúng thành ký tự, mà ggplot sau đó sẽ sắp xếp theo thứ tự từ xa (vì vậy "10" xuất hiện trước "2").

Đây là giải pháp bỏ qua cả hai vấn đề này. Chúng tôi giữ nguyên định dạng gốc factor cho đầu ra của cut, được gắn nhãn theo đúng thứ tự và chúng tôi chỉ sử dụng tính thẩm mỹ fill. Cũng lưu ý cách đơn giản hơn nhiều đó là để thiết lập các quy mô bằng cách tạo ra các màu sắc và dán nhãn chúng với các cấp, và sử dụng scale_fill_manual:

library(ggplot2) 
df <- expand.grid(1:10, 1:10)     # make up data 
df <- transform(df, z=Var1 * Var2)    # make up data 
df <- transform(df, z.cut=cut(z, 10))   # bin data 

colors <- colorRampPalette(c("blue", "yellow", "red"))(length(levels(df$z.cut))) 
ggplot(df, aes(x=Var1, y=Var2, fill=z.cut)) + 
    geom_tile() + 
    scale_fill_manual(values=setNames(colors, levels(df$z.cut))) 

enter image description here

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