Pregunta

Lo siento por no incluido cualquier dato de ejemplo para mi problema. No pude encontrar una manera de producir fácilmente un archivo de ejemplo la forma. Con suerte, los usuarios experimentados de ggplot pueden ver lo que me gustaría hacer a partir de la siguiente descripción.

Tengo:

  • A data.frame X con la información sobre parcelas de muestreo (plotid, var1, var2, var3, var4, ...)

  • Un polígono archivo de forma Y con la información espacial de las parcelas de muestreo

La importación del archivo de forma Y (con maptools) y fortifying como data.frame Z (ggplot2) funciona bien. melting X a X_melted funciona igual de bien. merge-ing Z y X_melted a las obras mapdf también.

Esto significa que ahora tenemos un data.frame en forma de largo con información espacial y var1, var2, var3, ...

Ahora quiero graficar esta trama de datos como esto:

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

El resultado es un gráfico agradable con un panel para cada variable. Los mapas de los paneles son idénticos, pero el color de relleno varía con los valores de las variables. Hasta ahora, todo funciona como un encanto ... con un problema:

Las variables tienen diferentes valores mínimos y máximos. Por ejemplo var1 va desde 0 a 5, var2 de 0 a 400, var3 de 5 a 10, etc. En ese ejemplo, la leyenda para el color de relleno va desde 0 a 400. var2 está muy bien elaborado, pero var1 y var3 son, básicamente, en el mismo color.

¿Hay una manera que podría utilizar una leyenda diferente para cada panel de la faceta? ¿O se trata simplemente (todavía) no es posible con facet_wrap o facet_grid en ggplot?

Yo podría hacer parcelas individuales para cada variable y se unen a ellos con ventanas, pero hay un montón de variables y esto sería una gran cantidad de trabajo.

O hay quizá otro paquete o método que podría utilizar para lograr lo que me gustaría hacer?

Y ayuda sería muy apreciada. :)

Editar: Con la ayuda de la descripción ggplot2-paquete, he construido un ejemplo que ilustra mi 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

El panel de la derecha ilustra distintos valores para var2 en el mapa. En el panel de la izquierda, sin embargo, todos los polígonos tienen el mismo color. Esto es lógico, ya que sólo un gradiente de color se utiliza para todos los paneles. Podría utilizar un degradado de color diferente para cada panel?

¿Fue útil?

Solución

En la actualidad no puede haber una sola escala por parcela (para todo excepto X e Y).

Otros consejos

Con bondad rejilla

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)

A riesgo de afirmar lo obvio, parece que usted debe Coloración por ciento en lugar de valores en bruto. A continuación, sus valores transformados y su leyenda ir de 0 a 1.

Tal vez un poco ortodoxo, pero usted podría intentar factorizar el "valor". Por ejemplo:

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 utiliza factores para crear leyendas. Así que si usted podría agregar una columna que tiene "valor" y la rompe en rangos factorizadas, puede reemplazar el "valor" con los rangos.

Crea una columna, 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

...

A continuación, utilice:

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

tendría que especificar las categorías que desea, lo que podría llevar mucho tiempo. Pero al menos la gráfica saldría cómo desea que lo haga. Básicamente, usted se recodificación de los datos en otra columna. He aquí algunos ejemplos:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top