Pergunta

Desculpe por não incluir nenhum dado de exemplo para o meu problema.Não consegui encontrar uma maneira de produzir facilmente um arquivo shape de exemplo.Esperançosamente, usuários experientes de ggplot posso ver o que gostaria de fazer na descrição abaixo.

Eu tenho:

  • A data.frame X com informações sobre parcelas de amostra (plotid, var1, var2, var3, var4, …)

  • Um shapefile de polígono Y com informações espaciais para as parcelas amostrais

Importação do shapefile Y (com maptools) e fortifysendo como data.frame Z (ggplot2) funciona bem. melting X para X_melted funciona igualmente bem. merge-ing Z e X_melted para mapdf funciona também.

Isso significa que agora temos um data.frame em formato longo com informações espaciais e var1, var2, var3, …

Agora quero plotar esse quadro de dados assim:

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

O resultado é um belo gráfico com um painel para cada variável.Os mapas dos painéis são idênticos, mas a cor de preenchimento varia com os valores das variáveis.Até agora, tudo funciona perfeitamente… com um problema:

As variáveis ​​​​têm valores mínimos e máximos diferentes.Por exemplo var1 vai de 0 para 5, var2 de 0 para 400, var3 de 5 para 10, etc.Nesse exemplo, a legenda da cor de preenchimento vai de 0 para 400. var2 está bem desenhado, mas var1 e var3 são basicamente da mesma cor.

Existe uma maneira de usar uma legenda diferente para cada painel da faceta?Ou isso simplesmente não (ainda) é possível com facet_wrap ou facet_grid em ggplot?

Eu poderia fazer gráficos individuais para cada variável e juntá-los com viewports, mas há muitas variáveis ​​e isso daria muito trabalho.

Ou talvez haja outro pacote ou método que eu possa usar para realizar o que gostaria de fazer?

E a ajuda seria muito apreciada.:)

Editar:Com a ajuda do ggplot2-descrição do pacote, construí um exemplo que ilustra meu problema:

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

O painel à direita ilustra diferentes valores para var2 no mapa.No painel à esquerda, entretanto, todos os polígonos têm a mesma cor.Isto é lógico, porque apenas um gradiente de cor é usado para todos os painéis.Posso usar um gradiente de cor diferente para cada painel?

Foi útil?

Solução

Atualmente só pode haver uma escala por parcela (para tudo exceto x e y).

Outras dicas

Com bondade de grade

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)

Correndo o risco de afirmar o óbvio, parece que você deveria colorir por porcentagens em vez de valores brutos.Então seus valores transformados e sua legenda vão de 0 a 1.

Talvez um pouco pouco ortodoxo, mas você poderia tentar fatorar seu “valor”.Por exemplo:

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 usa fatores para criar legendas.Portanto, se você pudesse adicionar uma coluna que pegasse "valor" e o dividisse em intervalos fatorados, poderia substituir "valor" pelos intervalos.

Crie uma coluna, como "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

...

Então use:

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

Você teria que especificar as categorias desejadas, o que poderia ser demorado.Mas pelo menos o gráfico sairia como você deseja.Basicamente, você estaria recodificando os dados em outra coluna.aqui estão alguns exemplos:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top