ggplot2用于离散比例的连续颜色并删除图例

时间:2014-05-09 19:39:49

标签: r ggplot2

我有以下数据框:

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

实际上我有615个区域,X和Y是Lambert坐标,Value是下雨。 我的区域代表法国,我试图绘制它们:

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

我遇到了问题:

我无法更改图例,这是geom_file中的图例,并未考虑scale_colour_manual。所以这不是升序,不是好标题(我想要“mm”)而不是好颜色。

我不知道是否真的很清楚......有人能帮助我吗?

编辑:我从中获取灵感:easiest way to discretize continuous scales for ggplot2 color scales?

1 个答案:

答案 0 :(得分:9)

您有两个比例,因为您同时使用fillcolor美学,并且您正在使用不同的变量(一个离散,一个连续)。你想要做的是只使用一个变量来填充。

此外,你的标签都搞砸了,因为你把它们作为字符传递,然后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