Как построить только легенды в ggplot2?

19

В настоящее время я работаю с igraph и имеет цвет, обозначенный моими вершинами. Я хотел бы добавить легенду, указывающую, что представляет каждый цвет.

На данный момент я могу подумать о том, чтобы использовать ggplot2 для печати только легенды и скрыть график штрихов. Есть ли способ вывести легенду?

    
задан Buthetleon 20.08.2012 в 17:55
источник
  • О да, я не видел, чтобы ты сказал, что играф. Это в базе, если я не ошибаюсь, и ggplot2 использует сетку, лучше просто создайте свою собственную легенду, как обсуждает Габор ниже. он, очевидно, читал более тщательно, чем я. –  Tyler Rinker 21.08.2012 в 04:13

3 ответа

31

Бесстыдно украден из: Вставка таблицы под легенда в гистограмме 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) 

Создано 2018-05-31 пакетом reprex (v0.2.0).

    
ответ дан Tyler Rinker 20.08.2012 в 18:52
источник
  • , хотя я не могу редактировать размер как объекта легенды, так и igraph с помощью функции видового экрана –  Buthetleon 21.08.2012 в 08:09
  • Моя легенда имеет огромные преимущества, которые мешают, я что-то забываю? –  Lilith-Elina 26.06.2014 в 15:48
  • Посмотрите на тему и измените прозрачность легенды. задний план. Если это не поможет, задайте свой вопрос с помощью воспроизводимого примера и кода, который вы пытаетесь выполнить. –  Tyler Rinker 26.06.2014 в 15:53
12

Cowplot удобно добавляет функцию для извлечения легенды. Ниже приводятся данные из руководства.

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)))
    
ответ дан r.bot 31.05.2017 в 11:25
источник
3

Я был цветом, кодирующим вершины на графике, и хотел генерировать легенду как просто, элегантно и как можно быстрее.

Самый быстрый способ сделать это, я пришел к выводу, что генерировать легенду отдельно, используя ggplot2, прежде чем «вставить» легенду в тот же сюжет, что и igraph, используя viewport и layout()

В этом методе нет необходимости вызывать rescale или asp аргументов в функции plot.igraph() .

Использование функции g_legend в файле data.frame, leg , с двумя столбцами, x является подходящим атрибутом вершины, а y является шестнадцатеричным цветовым кодом, используемым в моем графике, я сделал следующее.

Мой объект igraph 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)
    
ответ дан Buthetleon 28.08.2012 в 07:12
источник