Вопрос по plot, r, factors, ggplot2 – Удалить неиспользуемые уровни факторов из линейчатого графика ggplot

19

Я хочу сделать противоположностьэтот вопроси своего рода противоположностьэтот вопросХотя это касается легенд, а не самого сюжета.

Другие вопросы SO, кажется, спрашивают о том, какkeep неиспользованные уровни факторов. Мне действительно нравится, что мой удален. У меня есть несколько переменных имен и несколько столбцов (в широком формате) атрибутов переменных, которые я использую для создания многочисленных гистограмм. Вот воспроизводимый пример:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

Я получаю это:

enter image description here

Мне нравятся только имена, которые имеют соответствующиеnна моем гистограмме (например, не было бы пустого места для B).

Повторное использование кода базового графика будет довольно простым, если я смогу просто изменить имя выходного файла иy=var немного. Я не хотел бы поднастраивать мой фрейм данных, чтобы использовать, по возможности, уровни снижения для каждого графика!

Update based on the na.omit() suggestion

Рассмотрим пересмотренный набор данных:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

Мне нужно использоватьna.omit() для построенияvar1 потому что там присутствует NA. Но так как na.omit проверяет наличие значений дляall columnsСюжет удаляетA а так как он имеет АН вvar3, Это больше похоже на мои данные. У меня 15 общих ответов с НС. Я хочу удалить только те уровни факторов, которые не имеют значений дляcurrent построенный Y-вектор, а не то, что есть NA вany вектор во всем фрейме данных.

@TiloWiklundggplot() ожидает фрейм данных в качестве первого аргумента. И вообще, разве он не строит две строки этого, один фактор (name) другой числовой (var1)? Хенди нужно передать обе переменные, иначе какggplot() знаете, чтобы построить значения в виде двух столбцов, а не числовой вектор данных? Gavin Simpson
@TiloWiklund: Я новичок, поэтому не стесняйтесь предлагать альтернативу. Я строю столбец имен против множества различных столбцов данных для ряда графиков. Некоторые столбцы являются неполными, а некоторые нет. Неполные аналогичны вышеприведенным и оставляют пробелы, которые мне не нужны, поскольку мне нужно только сравнить переменные, у которых действительно есть данные, связанные с этим конкретным измеренным откликом. Имеет ли это смысл? Hendy
@joran: это похоже на решение Tilo, приведенное ниже, хотя и немного проще, чем передача двух векторных имен. Независимо от настройки пропуска значений na, я предполагаю, что реальный извлеченный урок состоит в том, что нет способа сделать это автоматически из ggplot. Hendy
Вы также можете просто удалить строки, установив условие только для этого столбца:ggplot(df[!is.na(df$var1),], aes(x=name,y=var1)) + geom_bar(). joran
Зачем вам нужен фрейм данных для начала, когда вы на самом деле просто строите один его ряд? Если у вас не было фрейма данных (и, скорее, у вас был только список / вектор), вы могли бы просто удалить поля NA). Tilo Wiklund

Ваш Ответ

2   ответа
5

что при построении графика вы используете только два столбца вашего фрейма данных, а это означает, что вместо передачи всего вашего data.frame вы можете взять соответствующие столбцыx[,c("name", "var1")] применить na.omit, чтобы удалить ненужные строки (как предлагает Гэвин Симпсон)na.omit(x[,c("name", "var1")]) и затем подготовьте эти данные.

Мой R / ggplot довольно ржавый, и я понимаю, что, возможно, есть более чистые способы добиться этого.

Не понимал, что я мог бы сделать это из ggplot, но теперь это кажется очевидным. Это определенно работает. Было бы здорово, если бы был эквивалентdrop=T или жеscale="free" так как мне придется настраивать все мои сюжетные функции таким образом. Не должно быть слишком плохо, и я просто буду использоватьdat[, c(1,n)] так что я могу просто перебирать каждый без особых хлопот. Спасибо! Hendy
20

na.omit() на вашем фрейме данныхdf удалить эти строки сNA

ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()

Учитывая ваше обновление, следующее

ggplot(df[!is.na(df$var1), ], aes(x=name,y=var1)) + geom_bar()

работает нормально и только считаетNA вVar1, Учитывая, что вы только заговорname а такжеVar, применятьna.omit() к фрейму данных, содержащему только эти переменные

ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
Это здорово и очень просто. В моем действительном наборе данных должно быть пропущено одно или несколько значений из многочисленных столбцовna.omit оставляет меня с фреймом данных без строк ... Любые другие предложения? Hendy
Я бы тоже хотел это уточнить. Не зная, какое решение придет, я не понимал, что это будет проблемой. Честно говоря, я ожидал, что будет возможность ggplot, чтобы бросать вещи. Учитывая, что люди хотятkeep неиспользуемые уровни в связанных вопросах и могут указатьdrop=FALSEЯ как-то удивляюсь почемуdrop=T не будет делать именно то, что я хотел! Спасибо за обновленный ответ. Hendy
Было бы полезно знать это на начальном этапе. Смотрите мой обновленный ответ.
@Hendy УровеньB не используется в вашем примере. Это очень используется, поскольку это присутствует в данных.NA является такой же действительной точкой данных, как и любое другое значение в отношении R. Действительно неиспользованный уровень будетB вA <- factor(c("a","c"), levels = c("a","b","c")), ВA, уровеньb нет в данных.
Я добавил обновление с примером того, почему это не сработает. Hendy

Похожие вопросы