manipulation - Cómo mostrar una leyenda en ggplot de doble eje y
ggplot title center (1)
De manera similar a la técnica que usa arriba, puede extraer las leyendas, vincularlas y luego sobrescribir la leyenda de la trama con ellas.
A partir de
# draw it
en tu código
# extract legend
leg1 <- g1$grobs[[which(g1$layout$name == "guide-box")]]
leg2 <- g2$grobs[[which(g2$layout$name == "guide-box")]]
g$grobs[[which(g$layout$name == "guide-box")]] <-
gtable:::cbind_gtable(leg1, leg2, "first")
grid.draw(g)
Estoy tratando de componer un gráfico de doble eje y usando ggplot. En primer lugar, permítanme decir que no estoy buscando una discusión sobre los méritos de si es o no una buena práctica hacerlo. Considero que son particularmente útiles cuando se miran datos basados en el tiempo para identificar tendencias en 2 variables discretas. Una discusión adicional sobre esto es más adecuada para la validación cruzada en mi opinión.
Kohske proporciona un muy buen ejemplo de cómo hacerlo, que hasta ahora he usado con gran efecto. Sin embargo, estoy en mis límites para incluir una leyenda para ambos ejes y. También he visto preguntas similares here y here pero ninguna parece abordar el tema de incluir una leyenda.
Tengo un ejemplo reproducible usando el conjunto de datos de diamantes de ggplot.
Datos
library(ggplot2)
library(gtable)
library(grid)
library(data.table)
library(scales)
grid.newpage()
dt.diamonds <- as.data.table(diamonds)
d1 <- dt.diamonds[,list(revenue = sum(price),
stones = length(price)),
by=clarity]
setkey(d1, clarity)
Gráficos
p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill="#4B92DB")) +
geom_bar(stat="identity") +
labs(x="clarity", y="revenue") +
scale_fill_identity(name="", guide="legend", labels=c("Revenue")) +
scale_y_continuous(labels=dollar, expand=c(0,0)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1),
axis.text.y = element_text(colour="#4B92DB"),
legend.position="bottom")
p2 <- ggplot(d1, aes(x=clarity, y=stones, colour="red")) +
geom_point(size=6) +
labs(x="", y="number of stones") + expand_limits(y=0) +
scale_y_continuous(labels=comma, expand=c(0,0)) +
scale_colour_manual(name = '''',values =c("red","green"), labels = c("Number of Stones"))+
theme(axis.text.y = element_text(colour = "red")) +
theme(panel.background = element_rect(fill = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_rect(fill=NA,colour="grey50"),
legend.position="bottom")
# extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))
pp <- c(subset(g1$layout, name == "panel", se = t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t,
pp$l, pp$b, pp$l)
# axis tweaks
ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
# draw it
grid.draw(g)
PREGUNTA: ¿Alguien tiene algunos consejos sobre cómo mostrar la segunda parte de la leyenda?
Los siguientes son los gráficos producidos en el orden p1, p2, combinado p1 y p2, notará que la leyenda para p2 no se muestra en el gráfico combinado.
p1
p2
combinado p1 y p2