Как увеличить часть графика и удалить аннотации за пределами увеличенной области?

#r #ggplot2 #geom-text

#r #ggplot2 #геометрический текст

Вопрос:

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

Это минимальный пример:

 start = c(1, 5,8, 14, 19, 25)
end =c(3, 6,12, 16, 22, 30)
label = c(1,2,3, 4, 5, 6)

library(ggplot2)
library(ggrepel)
regions = tibble::tibble(label, start, end)

ggplot()  
  scale_x_continuous()  
  scale_y_continuous(name = "")  
  geom_rect(
    data = regions,
    mapping = aes(
      xmin = start,
      xmax = end,
      ymin = 1.5,
      ymax = 1.8),
    color = "black",
    fill = "#56B4E9"
  )  
  geom_text_repel(
    data = regions,
    aes(
       x = start   (end - start) / 2,
      y = 1.8,
      label = label,
    ),
    size = 10,
    force_pull   = 0,
    nudge_y      = 0.05,
    direction    = "x",
    angle        = 90,
    vjust        = 0,
    segment.size = 0.5,
  )  
  ylim(1.38, 2.2)  
  ylab("")  
  xlab("")  
  theme_minimal() 
 

Этот код генерирует этот график:

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

Я хочу увеличить поле 3, поэтому я попытался добавить xlim(8,12) или facet_zoom(xlim = c(8, 12)) , но на увеличенном графике есть аннотации (метки) полей 1, 2, … сбоку, как вы можете видеть здесь (1,2 справа и 4,5,6 слева от увеличенного графика)

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

и аналогичный результат с xlim(8,12)

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

Как я могу удалить метки (аннотации) за пределами увеличенной области (1,2 справа и 4,5,6 слева от увеличенного графика?)

Комментарии:

1. Для быстрого исправления вы можете просто regions подмножить свои данные в вызове `geom_text_repel ()’, чтобы включить только метку 3.

2. Спасибо, PLY, если я подмножу свой region data аргумент in geom_text_repel в , подмножество является вектором, тогда data как аргумент принимает только фрейм данных.

3. Было бы здорово, если бы я мог сделать что-то вроде data = (regions$label == 3)

Ответ №1:

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

  1. Установить xlim(8,12)
 library(ggrepel)
start = c(1, 5,8, 14, 19, 25)
end =c(3, 6,12, 16, 22, 30)
label = c(1,2,3, 4, 5, 6)

regions = data.frame(label, start, end)

ggplot()  
  scale_x_continuous()  
  scale_y_continuous(name = "")  
  geom_rect(
    data = regions,
    mapping = aes(
      xmin = start,
      xmax = end,
      ymin = 1.5,
      ymax = 1.8),
    color = "black",
    fill = "#56B4E9"
  )  
  geom_text_repel(
    data = regions, 
    aes(
      x = start   (end - start) / 2,
      y = 1.8,
      label = label,
    ),
    size = 10,
    force_pull   = 0,
    nudge_y      = 0.05,
    direction    = "x",
    angle        = 90,
    vjust        = 0,
    segment.size = 0.5,
  )  
  ylim(1.38, 2.2)  
  xlim(8, 12)  
  ylab("")  
  xlab("")  
  theme_minimal() 

 

Если я запущу это, я получу следующее изображениевведите описание изображения здесь
Однако использование xlim() не всегда рекомендуется, поскольку оно отбрасывает все другие точки, которые не соответствуют условию. Хотя для вашего случая это может быть выгодно.

  1. regions Правильное использование подмножества и увеличения coord_cartesian() .
 ggplot()  
  scale_x_continuous()  
  scale_y_continuous(name = "")  
  geom_rect(
    data = regions,
    mapping = aes(
      xmin = start,
      xmax = end,
      ymin = 1.5,
      ymax = 1.8),
    color = "black",
    fill = "#56B4E9"
  )  
  geom_text_repel(
    data = subset(regions, label == 3),
    aes(
      x = start   (end - start) / 2,
      y = 1.8,
      label = label,
    ),
    size = 10,
    force_pull   = 0,
    nudge_y      = 0.05,
    direction    = "x",
    angle        = 90,
    vjust        = 0,
    segment.size = 0.5,
  )  
  ylim(1.38, 2.2)  
  coord_cartesian(xlim = c(8, 12))  
  ylab("")  
  xlab("")  
  theme_minimal() 

 

Это создает то же изображение (насколько я могу судить) введите описание изображения здесь

Комментарии:

1. Большое вам спасибо, PLY, я не знал, что вы можете использовать coord_cartesian(xlim = c(8, 12)) , но у меня все та же проблема. Я не уверен, почему ваш график чистый и не содержит никаких меток 1,2,4,5,6 сбоку. Я скопировал точный код, который у вас есть здесь, и вставил его в чистую среду в studio, но я не могу повторно сгенерировать те же результаты, что и у вас. Мой график по-прежнему похож на третий график в исходном вопросе.

2. @Сэм, это странно. В качестве примечания я немного отредактировал свой код, чтобы regions = data.frame(label, start, end) . Я не совсем в курсе, но, возможно, это может быть связано с версиями вашего пакета или версией R. Не могли бы вы показать свой sessionInfo() ?

3. это работает, если я подмножествую данные регионов в the geom_text_repel вызове, чтобы включить только использование метки 3 data = subset(regions, regions$label == 3) . Большое вам спасибо, PLY 🙂