web-dev-qa-db-fra.com

Comment tracer juste les légendes dans ggplot2?

Je travaille actuellement avec igraph et j'ai étiqueté la couleur de mes sommets. Je voudrais ajouter une légende indiquant ce que chaque couleur représente.

À ce stade, je peux penser à utiliser ggplot2 pour imprimer uniquement la légende et masquer un graphique à barres. Existe-t-il un moyen de simplement sortir la légende?

38
Buthetleon

Voici 2 approches:

Configurer le tracé

library(ggplot2) 
library(grid)
library(gridExtra) 

my_hist <- ggplot(diamonds, aes(clarity, fill = cut)) + 
    geom_bar() 

Approche Cowplot

# Using the cowplot package
legend <- cowplot::get_legend(my_hist)

grid.newpage()
grid.draw(legend)

Approche maison

Sans vergogne volé à: Insertion d'un tableau sous la légende dans un histogramme ggplot2

## Function to extract legend
g_legend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    legend
} 

legend <- g_legend(my_hist) 

grid.newpage()
grid.draw(legend) 

Créé le 2018-05-31 par le package reprex (v0.2.0).

51
Tyler Rinker

Cowplot ajoute facilement une fonction pour extraire la légende. Ce qui suit est tiré directement du manuel.

library(ggplot2)
library(cowplot)
p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line()
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + geom_point(size=2.5)

# Note that these cannot be aligned vertically due to the legend in the plot.mpg
ggdraw(plot_grid(p1, plot.mpg, ncol=1, align='v'))

# now extract the legend
legend <- get_legend(plot.mpg)

# and replot suppressing the legend
plot.mpg <- plot.mpg + theme(legend.position='none')

# Now plots are aligned vertically with the legend to the right
ggdraw(plot_grid(plot_grid(p1, plot.mpg, ncol=1, align='v'),
                 plot_grid(NULL, legend, ncol=1),
                 rel_widths=c(1, 0.2)))
19
r.bot

J'ai utilisé le paquet ggpubr - le rend très facile!

https://rpkgs.datanovia.com/ggpubr/reference/get_legend.html

# Extract the legend. Returns a gtable
leg <- get_legend(p)

# Convert to a ggplot and print
as_ggplot(leg)
7
glhrsh

Je codais par couleur les sommets du graphique et je voulais générer une légende aussi simplement, élégamment et aussi rapidement que possible.

La façon la plus rapide de le faire, je pense que c'est de générer la légende séparément en utilisant ggplot2 avant de "coller" la légende dans le même tracé que igraph en utilisant viewport et layout()

Dans cette méthode, il n'est pas nécessaire d'appeler les arguments rescale ou asp dans la fonction plot.igraph().

En utilisant la fonction g_legend sur un data.frame, leg, avec 2 colonnes, x étant l'attribut de sommet approprié et y étant le code de couleur hexadécimal utilisé dans mon tracé igraph, j'ai fait ce qui suit.

Mon objet igraph est t8g

legend <- g_legend(leg)
vpleg <- viewport(width = 0.1, height = 0.1, x=0.85,y=0.5)
layout(matrix(c(1,2),1,2,byrow=T),widths=c(3,1))
plot(t8g,Edge.width=1,Edge.arrow.size=0.1,vertex.label.cex=0.2,main="b2_top10")
pushViewport(vpleg)
grid.draw(legend)
3
Buthetleon