ggplot объединяет geom_text_repel с facet_zoom

#r #ggplot2 #facet #geom-text #geom-point

Вопрос:

У меня есть следующий пример кода:

 x <- c(1,1.2,1.3,1.1,2,2.5,3.6)
y <- c(3,3.1,2.9,3.6,4.5,5.6,6.7)
z <- c('Austria',' Germany', 'Italy', 'France', 'Spain','Portugal', 'Belgium')

dataset <-data.frame(x,y,z)

ggp <- ggplot(dataset, mapping = aes(x=x, y=y))  
 
   geom_text_repel(mapping = aes(label = z),
              size = 2,
              min.segment.length = 0,
              seed = 42,
              box.padding = 0.4,
              arrow = arrow(length = unit(0.007, "npc")),
              nudge_x = .03,
              nudge_y = .03,
              color = "grey60")  

  geom_point(data = dataset,aes(colour=z, size = y/x), alpha=0.6)  

  facet_zoom(x = x < 2, horizontal = FALSE ,zoom.size = 0.3, show.area = FALSE)   
  coord_cartesian(clip="off")

 ggp
 

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

Я также хотел бы избежать использования geom_text

Ответ №1:

Я думаю, вы можете использовать zoom.data аргумент из facet_zoom :

масштабирование.данные: выражение, вычисляющееся в логическом векторе. Если значение TRUE, данные отображаются только на панелях масштабирования. Если значение FALSE, данные отображаются только в контекстной панели. Если НЕТ, данные будут отображаться во всех панелях.

Сначала добавьте zoom столбец в свой набор данных и установите TRUE значение, если x меньше 2 (это будет показано на панели масштабирования). В противном zoom случае должно быть установлено значение FALSE (это будет показано на контекстной панели).

 dataset$zoom <- ifelse(dataset$x < 2, TRUE, FALSE)
 

Для facet_zoom использования zoom.data аргумента и установки в новый zoom столбец:

 facet_zoom(x = x < 2, horizontal = FALSE, zoom.data = zoom, zoom.size = 0.3, show.area = FALSE)
 

Вот весь код для воспроизводимости:

 library(ggplot2)
library(ggrepel)
library(ggforce)

x <- c(1,1.2,1.3,1.1,2,2.5,3.6)
y <- c(3,3.1,2.9,3.6,4.5,5.6,6.7)
z <- c('Austria',' Germany', 'Italy', 'France', 'Spain','Portugal', 'Belgium')

dataset <-data.frame(x,y,z)

dataset$zoom <- ifelse(dataset$x < 2, TRUE, FALSE)

ggp <- ggplot(dataset, mapping = aes(x=x, y=y))  
  
  geom_text_repel(mapping = aes(label = z),
                  size = 2,
                  min.segment.length = 0,
                  seed = 42,
                  box.padding = 0.4,
                  arrow = arrow(length = unit(0.007, "npc")),
                  nudge_x = .03,
                  nudge_y = .03,
                  color = "grey60")  
  
  geom_point(aes(colour=z, size = y/x), alpha=0.6)  
  
  facet_zoom(x = x < 2, horizontal = FALSE , zoom.data = zoom, zoom.size = 0.3, show.area = FALSE)   
  coord_cartesian(clip="off")

ggp
 

Сюжет

сюжет с увеличением