首页 文章

刻面ggplot的不同图例和填充颜色?

提问于
浏览
15

很抱歉没有包含我的问题的任何示例数据 . 我找不到轻松生成示例形状文件的方法 . 希望有经验的 ggplot 用户可以从下面的描述中看到我想做的事情 .

我有:

  • A data.frame X,包含有关样本图的信息( plotidvar1var2var3var4 ,...)

  • 多边形shapefile Y ,包含样本图的空间信息

将shapefile Y (带 maptools )和 fortify 输入为 data.frame Zggplot2 )的工作正常 . melt ing X to X_melted 同样正常 . merge -ing ZX_meltedmapdf 也可以 .

这意味着现在我们有一个带有空间信息的长形 data.framevar1var2var3 ,......

现在我想绘制这样的数据框:

pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1

结果是一个很好的情节,每个变量有一个面板 . 面板的 Map 是相同的,但填充颜色随变量的值而变化 . 到目前为止,一切都像魅力......有一个问题:

变量具有不同的最小值和最大值 . 例如 var10 变为 5var20 变为 400var35 变为 10 等 . 在该示例中,填充颜色的图例从 0 变为 400 . var2 绘制得很好,但 var1var3 基本上是相同的颜色 .

有没有办法可以为刻面的每个面板使用不同的图例?或者 ggplot 中的 facet_wrapfacet_grid 是否可能(但)不可能?

我可以为每个变量制作单独的图并将它们与视口连接,但是有很多变量,这将是很多工作 .

或者是否可以使用另一种方法或方法来完成我想做的事情?

非常感谢帮助 . :)

编辑:在 ggplot2 -package描述的帮助下,我构建了一个示例来说明我的问题:

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))
values <- data.frame(
id = ids,
val1 = cumsum(runif(6, max = 0.5)),
val2 = cumsum(runif(6, max = 50))
)
positions <- data.frame(
id = rep(ids, each = 4),
x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

values <- melt(values)
datapoly <- merge(values, positions, by=c("id"))

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

右侧的面板说明了 Map 上 var2 的不同值 . 但是,在左侧面板上,所有多边形都具有相同的颜色 . 这是合乎逻辑的,因为所有面板只使用一种颜色渐变 . 我可以为每个面板使用不同的颜色渐变吗?

4 回答

  • 1

    目前每个绘图只能有一个刻度(除了x和y之外的所有内容) .

  • 3

    有网格的好处

    align.plots <- function(..., vertical=TRUE){
    #http://ggextra.googlecode.com/svn/trunk/R/align.r
      dots <- list(...)
      dots <- lapply(dots, ggplotGrob)
      ytitles <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.title.y.text",grep=TRUE), vp=NULL))
      ylabels <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.text.y.text",grep=TRUE), vp=NULL))
      legends <- lapply(dots, function(.g) if(!is.null(.g$children$legends))
                        editGrob(.g$children$legends, vp=NULL) else ggplot2:::.zeroGrob)
    
      gl <- grid.layout(nrow=length(dots))
      vp <- viewport(layout=gl)
      pushViewport(vp)
      widths.left <- mapply(`+`, e1=lapply(ytitles, grobWidth),
                            e2= lapply(ylabels, grobWidth), SIMPLIFY=F)
      widths.right <- lapply(legends, function(g) grobWidth(g) + if(is.zero(g)) unit(0, "lines") else unit(0.5, "lines")) # safe margin recently added to ggplot2
      widths.left.max <- max(do.call(unit.c, widths.left))
      widths.right.max <- max(do.call(unit.c, widths.right))
    
      for(ii in seq_along(dots)){
        pushViewport(viewport(layout.pos.row=ii))
        pushViewport(viewport(x=unit(0, "npc") + widths.left.max - widths.left[[ii]],
                              width=unit(1, "npc") - widths.left.max + widths.left[[ii]] -
                                                     widths.right.max + widths.right[[ii]],
                              just="left"))
        grid.draw(dots[[ii]])
      upViewport(2)
      }
    }
    
    
    
    p <- ggplot(datapoly[datapoly$variable=="val1",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
    p1 <- ggplot(datapoly[datapoly$variable=="val2",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
    align.plots( p,p1)
    
  • 14

    也许有点不正统,但你可以尝试分解你的“ Value ” . 例如:

    p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=factor(value), group=id),colour="black")
    p <- p + facet_wrap(~ variable)
    p
    

    ggplot2使用因子来创建图例 . 因此,如果您可以添加一个带有“value”的列并将其分解为因子范围,则可以将“value”替换为范围 .

    创建一个列,如“f”:

    id variable        value   x    y f
    1  1.1     val1   0.09838607 2.0 -0.5 0.09-0.13
    2  1.1     val1   0.09838607 1.0  0.0 0.09-0.13
    3  1.1     val1   0.09838607 1.1  1.0 0.09-0.13
    4  1.1     val1   0.09838607 2.2  0.5 0.09-0.13
    25 2.1     val1   0.13121347 1.0  0.0 0.13-0.20
    

    ...

    然后使用:

    p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=f, group=id),colour="black")
    p <- p + facet_wrap(~ variable)
    p
    

    您必须指定所需的类别,这可能非常耗时 . 但至少图表会出现你想要的方式 . 基本上,您将数据重新编码到另一列 . 这里有些例子:

    http://www.statmethods.net/management/variables.html

  • 1

    冒着明显的风险,似乎你应该用百分比而不是原始值着色 . 然后你的变换值和你的传奇从0变为1 .

相关问题