ggplot2 – аннотировать вне участка

Я хотел бы связать значения размера выборки с точками на графике. Я могу использовать geom_text для размещения чисел рядом с точками, но это беспорядочно. Было бы намного проще выстроить их вдоль внешнего края участка.

Например, у меня есть:

 df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20)) ggplot(df,aes(x=x,y=y,label=n))+geom_point()+geom_text(size=8,hjust=-0.5) 

Что производит этот сюжет: введите описание изображения здесь

Я бы предпочел нечто подобное: введите описание изображения здесь

Я знаю, что могу создать второй сюжет и использовать grid.arrange (a la this post ), но было бы утомительно определить расстояние между текстовыми полями, чтобы они совпадали с осью y. Есть ли более простой способ сделать это? Благодаря!

Вам не нужно рисовать второй сюжет. Вы можете использовать annotation_custom для позиционирования grobs в любом месте внутри или вне области построения графика. Позиционирование грыз в терминах координат данных. Предполагая, что «5», «10», «15» совпадают с «cat1», «cat2», «cat3», по вертикальному расположению textGrobs позаботятся – y-координаты ваших трех textGrobs даются y-координаты трех точек данных. По умолчанию ggplot2 грейферы в области графика, но отсечение можно переопределить. Соответствующий запас должен быть расширен, чтобы освободить место для grob. Следующий (с использованием ggplot2 0.9.2) дает график, аналогичный вашему второму сюжету:

 library (ggplot2) library(grid) df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20)) p <- ggplot(df, aes(x,y)) + geom_point() + # Base plot theme(plot.margin = unit(c(1,3,1,1), "lines")) # Make room for the grob for (i in 1:length(df$n)) { p <- p + annotation_custom( grob = textGrob(label = df$n[i], hjust = 0, gp = gpar(cex = 1.5)), ymin = df$y[i], # Vertical position of the textGrob ymax = df$y[i], xmin = 14.3, # Note: The grobs are positioned outside the plot area xmax = 14.3) } # Code to override clipping gt <- ggplot_gtable(ggplot_build(p)) gt$layout$clip[gt$layout$name == "panel"] <- "off" grid.draw(gt) 

введите описание изображения здесь

Упрощенное решение на основе grid

 require(grid) df = data.frame(y = c("cat1", "cat2", "cat3"), x = c(12, 10, 14), n = c(5, 15, 20)) p <- ggplot(df, aes(x, y)) + geom_point() + # Base plot theme(plot.margin = unit(c(1, 3, 1, 1), "lines")) p grid.text("20", x = unit(0.91, "npc"), y = unit(0.80, "npc")) grid.text("15", x = unit(0.91, "npc"), y = unit(0.56, "npc")) grid.text("5", x = unit(0.91, "npc"), y = unit(0.31, "npc")) 

Теперь это прямолинейно с ggplot2 3.0.0, так как теперь обрезка может быть отключена на графиках, вызвав coord_cartesian(clip = 'off') , как в примере ниже.

  # Generate data df <- data.frame(y=c("cat1","cat2","cat3"), x=c(12,10,14), n=c(5,15,20)) # Create the plot ggplot(df,aes(x=x,y=y,label=n)) + geom_point()+ geom_text(x = 14.25, # Set the position of the text to always be at '14.25' hjust = 0, size = 8,) + coord_cartesian(xlim = c(10, 14), # This focuses the x-axis on the range of interest clip = 'off' # This keeps the labels from disappearing ) + theme(plot.margin = unit(c(1,3,1,1), "lines")) # This widens the right margin 

введите описание изображения здесь

  • Аннотировать значения выше баров (ggplot граненый)
  • ggplot2: сортировка сюжета
  • Интеграция Java-R?
  • Проверьте, если символы в строке в R
  • Форматирование дат с помощью scale_x_date в ggplot2
  • ggplot2, facet_grid, свободные шкалы?
  • эффективные последовательные операции на data.table
  • рулон соединяется с начальным / конечным окном
  • Использование lapply .SD в data.table R
  • Как изменить местоположение библиотеки в R?
  • ggplot2 пирог и диаграмма пончика на том же участке
  • Давайте будем гением компьютера.