#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
, которые вы хотите удалить.