ошибка ggforce facet_zoom с ggplot2 на R

#r #ggplot2 #ggforce

#r #ggplot2 #ggforce

Вопрос:

У меня есть data.frame в R 4.0.2 с непрерывной переменной в одном столбце и двумя возможными значениями категориальной переменной (переменная ‘type’: известная или новая) в другом, которую я использую, чтобы раскрасить их по-разному (используя палитру из пакета ggsci 2.9). Я представляю гистограмму (stat_bin) с помощью ggplot2 3.3.2, и я хочу использовать функцию facet_zoom в ggforce 0.3.2 для масштабирования только данных, принадлежащих одному из «типов» (используя опцию zoom.data, как это сделано в примере с вулканом на http://cran.univ-paris1.fr/web/packages/ggforce/vignettes/Visual_Guide.html#contextual-zoom ), однако я получаю эту ошибку:

 Error: Aesthetics must be either length 1 or the same as the data (2000): x
 

Воспроизводимый пример:

 library(ggplot2)
library(ggsci)
library(ggforce)

testdata <- as.data.frame(sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"

# Working code
ggplot(testdata)  
  stat_bin(aes(x=testdata[,1], fill = type), binwidth = 1, color="white")  
  scale_fill_npg()   theme_light()  
  facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3)

# Desired code
ggplot(testdata)  
  stat_bin(aes(x=testdata[,1], fill = type), data = cbind(testdata, zoom = FALSE), binwidth = 1, color="white")  
  stat_bin(aes(x=testdata[testdata$type == "novel",1]), data = cbind(testdata, zoom = TRUE), binwidth = 0.5)  
  scale_fill_npg()   theme_light()  
  facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3, zoom.data = zoom)
 

Спасибо!

Ответ №1:

Проблема в том, что вы передаете весь набор данных в качестве данных во втором stat_bin . Просто передайте подмножество df вместо того, чтобы пытаться подмножить в aes() :

Кстати: я также переименовал первую переменную в ваших данных в x.

 library(ggplot2)
library(ggsci)
library(ggforce)

set.seed(42)

testdata <- data.frame(x = sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"

# Desired code
ggplot(testdata)  
  stat_bin(aes(x = x, fill = type), data = cbind(testdata, zoom = FALSE), binwidth = 1, color="white")  
  stat_bin(aes(x = x), data = cbind(testdata[testdata$type == "novel", ], zoom = TRUE), binwidth = 0.5)  
  scale_fill_npg()   theme_light()  
  facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3, zoom.data = zoom)
 

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

1. Я хотел представить увеличенные данные по-другому, так что это решение сработало! Большое вам спасибо!

Ответ №2:

Чтобы отобразить type == "novel" данные только на увеличенном графике, попробуйте следующее:

 library(tidyverse)
library(ggsci)
library(ggforce)

testdata <- data.frame(values = sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"

# Desired code
ggplot(testdata)  
  stat_bin(aes(x = values, fill = type),
           binwidth = 1, color="white")  
  scale_fill_npg()   theme_light()  
  facet_zoom(zoom.data = ifelse(type == "novel", NA, FALSE), 
             xlim = c(0, 4), ylim = c(0, 300),
             horizontal = TRUE)
 

пример.png