Поведение facet_grid и масштабов = "бесплатно" с отсутствующими данными

Может кто-нибудь объяснить, почему это работает:

 d <- data.frame(x = 1:10, y = as.numeric(c(1:4,rep(NA,6))),z=rep(1:5,2))
 ggplot(data = d, aes(x, y)) + geom_point() +facet_grid(z~.)

и при добавлении scales="free" в facet_grid возникает ошибка:

 d <- data.frame(x = 1:10, y = as.numeric(c(1:4,rep(NA,6))),z=rep(1:5,2))
 ggplot(data = d, aes(x, y)) + geom_point() +facet_grid(z~.,scales="free")

# Error in seq.default(from = best$lmin, to = best$lmax, by = best$lstep) : 
#  'from' must be of length 1

Вероятно, он использует min и max всех граней, когда scales не является бесплатным. Когда scales свободен, он не знает, какое значение нужно взять для фасета, содержащего только пропуски?

Есть ли работа?

Ответы

Ответ 1

Я рассмотрел два решения.

1)

ggplot(data = d, aes(x, y)) + 
  geom_point() +
  facet_grid(z~.,scales="free_x")

Работает, но дает тот же результат, что и без scales="free".

2)

library(gridExtra)
p1 <- ggplot(data = d[d$z==1,], aes(x, y)) + geom_point()
p2 <- ggplot(data = d[d$z==2,], aes(x, y)) + geom_point()
p3 <- ggplot(data = d[d$z==3,], aes(x, y)) + geom_point()
p4 <- ggplot(data = d[d$z==4,], aes(x, y)) + geom_point()
p5 <- ggplot(data = d[d$z==5,], aes(x, y)) + geom_point()
grid.arrange(p1,p2,p3,p4,p5,ncol=1)

Это не работает. Когда вы планируете отдельные сюжеты, вы обнаружите, что p5 невозможно построить. Это связано с тем, что для z=5 y только NA.

Попытка использовать свободную шкалу, когда есть только NA, не очень логична. По-моему, это концептуальная проблема. Причиной этого является то, что без использования аргумента scales="free" используются шкалы другого подзаголовка (-ов). При использовании аргумента scales="free" (или free_x или free_y) шкалы каждого подзадачи будут установлены в соответствии с длиной шкалы. Когда есть только NA, длина шкалы не может быть определена, что в свою очередь вызывает сообщение об ошибке.

То, что работает free_x (хотя и дает тот же результат).

В заключение: если у одной из ваших групп есть только NA, вы не можете использовать scales="free" в своем заговоре. Следовательно, у вас есть два варианта (на мой взгляд):

  • Опуская аргумент scales="free" для получения нужных пустых подзаговоров.
  • Замена NA на 0, но это только решение, когда у вас нет отрицательных значений.

Ответ 2

вы также можете использовать na.omit(dataframe). Это сработало для меня. У меня было только одно (!) NA в 722K строк данных. Этого было достаточно, чтобы получить эту ошибку.

Ответ 3

Мы могли бы просто решить эту проблему, и источником было то, что мы использовали Capital X вместо небольшого x в формуле, неправильным является: ggplot (isotidy, aes (X = сайт, y = dN_fish, fill = сайт)) + geom_boxplot() и должен выглядеть следующим образом: ggplot (isotidy, aes (x = сайт, y = dN_fish, fill = сайт)) + geom_boxplot()

Я надеюсь, что эта помощь