Comment tracer juste les légendes dans ggplot2?

je travaille actuellement avec igraph et j'ai des vertices de couleur. Je voudrais ajouter une légende Indiquant ce que chaque couleur représente.

ce que je peux penser à ce stade est d'utiliser ggplot2 pour imprimer seulement la légende et cacher un tracé en barre. Y a-t-il un moyen de simplement afficher la légende?

21
demandé sur Burkhard 2012-08-20 19:55:45

3 réponses

Hontlessly stolen from: insérant une table sous la légende dans un histogramme ggplot2

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

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

# create inset table 
my_table <- tableGrob(head(diamonds)[, 1:3]) 

# 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]] 
  return(legend)} 

legend <- g_legend(my_hist) 

# or use cowplot package
# legend <- cowplot::get_legend(my_hist)

grid.newpage()
grid.draw(legend) 

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

33
répondu Tyler Rinker 2018-05-31 12:31:04

Cowplot handily ajoute 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)))
13
répondu r.bot 2017-05-31 09:25:27

j'étais en train de coder les sommets du graphe et je voulais générer une légende aussi simplement , aussi élégamment et aussi vite que possible.

la façon la plus rapide de faire cela, je suis venu à croire 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 iggraph en utilisant viewport et layout()

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

utilisant la fonction g_legend sur une donnée.cadre, leg , avec 2 colonnes, x étant l'attribut de vertex approprié et y étant le code de couleur hexadécimal utilisé dans mon graphique, j'ai fait ce qui suit.

mon objet graphique 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
répondu Buthetleon 2012-08-28 05:12:55