leyendas y colores de relleno diferente para ggplot facetas?
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 fortify
ing como data.frame
Z
(ggplot2
) funciona bien. melt
ing 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?
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: