scale_x_discrete manipulation ggplot geom_text change r charts ggplot2 data.table gtable

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