2014-05-09 4 views
5

삭제 I는 다음 데이터 프레임을 가지고 사실ggplot2 연속 색상 및 전설

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

난 (615 개) 영역, X 및 Y는 램버트 좌표 값이 비이다되어있다한다. 내 영역이 프랑스를 대표하고 내가 그들을 플롯하려고 :

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]") 
     ) 

나는 내 영역의 윤곽을 그리는 sympzones 및 polfrance를 사용합니다.

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 
} 

값은 300에서 1900이며, 이것은 내가 얻을 것입니다 :

나는 전설을 변경할 수 없습니다 :

plot

I은 ​​문제가 있다면 이것은 geom_file의 범례이며 scale_colour_manual을 고려하지 않습니다. 그래서 이것은 오름차순이 아니라 좋은 제목 (나는 "mm"을 원한다)이 아니라 좋은 색이 아닌 것입니다.

정말 명확한 지 모르겠지만 ... 누군가 나를 도울 수 있습니까?

편집 : 나는 그에서 영감을했다 : easiest way to discretize continuous scales for ggplot2 color scales?

+0

난 당신이 혼란 색을하고 채울 수있다 생각합니다. 'geom_tile (...) '에'color = ...'를 지정하면 원하는 색상이 아닌 * border color *가 지정됩니다. 그것이 당신에게 "작은 사각형이 많이있는 이유"입니다. 전설을 재정렬하는 것은 조금 더 복잡합니다. 데이터 세트 (지도 포함)를 업로드하고 링크를 제공하면 내가 보여줄 수 있습니다. – jlhoward

+0

'breaks - breaks [order (labels, decline = TRUE)]] 및' 'labels <- labels [order (labels, decline = TRUE)]에서'감소 = FALSE'를 설정하면 범례 레이블의 순서를 다음과 같이 설정해야합니다. 오름차순 – OdeToMyFiddle

+0

진실, 나는 그것을 바꿨다. 그리고 나의 새로운 문제는 내가 전설 (이름, 색, 순서)을 바꿀 수 없다는 것이다. jlhoward, 링크를 제공한다는 것은 무엇을 의미합니까? – Chika

답변

9

당신이 모두 fill 및 심미 color을 사용하고 있기 때문에 당신은 두 개의 비늘이 있고, 당신이 그 (것)들을 위해 (한 이산, 연속 한) 다른 변수를 사용하고 있습니다. 당신이 원하는 것은 채우기를 위해서 하나의 변수를 사용하는 것입니다.

또한 문자로 전달하기 때문에 레이블이 엉망입니다. ggplot은 어휘 적으로 정렬합니다 (따라서 "10"은 "2"앞에옵니다).

다음 두 가지 문제를 모두 해결할 수있는 솔루션입니다. 올바른 순서로 라벨이 지정되고 원래 factor 형식의 출력을 cut으로 유지하며, 우리는 단지 fill의 미학을 사용합니다. 이 색상을 생성하고 레벨을 라벨 및 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