Подавлять столбец NA при фасетировании

#r #ggplot2

#r #ggplot2

Вопрос:

На моем графике фасетирование происходит по двум столбцам:

 ggplot(peakDF, aes (Mass, Intensity))   geom_line()  facet_grid(file ~ fragment, scales = "free")
  

в столбце фрагмента у меня много значений NA, поэтому с этими NAS создается столбец графиков, как показано ниже:

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

проблема в том, что мне не нужен этот столбец, но я не могу просто фильтровать значения NA в этом столбце, потому что это приведет к удалению нормализации (по строкам), которая мне действительно нужна. Есть предложения о том, как сохранить весь набор данных (для нормализации), но не отображать столбец NA?

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

1. что вы имеете в виду под нормализацией? не указывать масштаб = свободно или просто установить значение free_x?

2. Я имею в виду, что я хочу, чтобы графики в окнах фасета отображались с максимумом по оси y как максимум в соответствующей строке, включая значения в столбце NA в фасете

Ответ №1:

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

 set.seed(1)
n <- 1e3
peakDF <- data.frame(Mass = rnorm(n, 500, 50),
                     Intensity = runif(n, 0, 10),
                     file = sample(letters[1:4], n, TRUE),
                     fragment = sample(letters[1:6], n, TRUE))
peakDF$fragment[1:(n/2)] <- NA
  

что у вас есть сейчас

 ggplot(peakDF, aes (Mass, Intensity))  
  geom_line() 
  facet_grid(file ~ fragment, scales = "free")
  

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

с na.omit и изменением верхнего предела для file=='a'

 ggplot(na.omit(peakDF), aes (Mass, Intensity))  
  geom_line() 
  facet_grid(file ~ fragment, scales = "free")  
  geom_blank(data = data.frame(Mass = Inf,
                               fragment = 'a',
                               file = 'a',
                               Intensity = 15))
  

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

Вы можете добавить несколько элементов управления одновременно. В вашем случае вы могли бы просто получить максимальное значение для NA файла s by и использовать этот сводный фрейм данных

 ggplot(na.omit(peakDF), aes (Mass, Intensity))  
  geom_blank(data = data.frame(Mass = rep(Inf, 4),
                               fragment = rep('a', 4),
                               file = c('a', 'a', 'c', 'd'),
                               Intensity = c(15, -5, 50, -5)))  
  geom_line() 
  facet_grid(file ~ fragment, scales = "free")
  

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

Это также будет работать для оси x или как для x, так и для y.

Ответ №2:

Сложно сделать это точно без ваших данных, но одним из вариантов было бы преобразовать в gtable объект, а затем просто обрезать тот дополнительный столбец, который вам не нужен.

В моем примере кода будут использоваться встроенные R mtcars .

 library(ggplot2)
library(gtable)
p<-ggplot(mtcars, aes(wt, hp))   geom_point()  facet_grid(cyl ~ carb, scales = "free")
gt<-ggplot_gtable(ggplot_build(p))
  

Без обрезки

 grid.draw(gt)
  

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

С обрезкой

 gt2<-gt[,-14]
grid.draw(gt2)
  

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

Вы можете видеть, что при обрезке мы просто удалили последний столбец, который нам не нужен (столбец 14, в котором был 8-цилиндровый график). Чтобы выяснить, какой столбец вы хотите обрезать, вы можете сделать:

 gtable_show_layout(gt)
  

Используя это, вы можете сопоставить конкретные фасеты вашего графика со столбцами в gtable , которые вы хотите удалить.
введите описание изображения здесь