r - ggplot facet_wrap, считывая все входные данные как NaN (с петлевым фильтром)

r ggplot2 wrap facet

10 просмотра

1 ответ

Я пытаюсь создать серию диаграмм ridgeline из набора данных, отфильтрованного в соответствии с циклом for.

# create list object to hold charts

print_list=list()

# loop through dataset and create charts based on facility type

for (i in data$fac_type) {

  data_filter <- filter(data, fac_type == i)

  plot <- ggplot(data=data_filter,aes(x=average,y=category, fill=category)) +
          scale_fill_manual(values= cols) +
          geom_density_ridges(
           rel_min_height=0.01,scale=0.9,
           jittered_points = TRUE,
           position=position_points_jitter(width=0.05, height=0),point_shape="|",point_size=2,point_alpha=0.7, alpha=0.7) +
          theme_ridges() +
          theme(legend.position="none",axis.text.y = element_text(angle=45, hjust=1)) +
          stat_density_ridges(quantile_lines = TRUE,alpha=0.7,scale=0.9,quantiles=2) +
          scale_x_continuous(limits=c(0,1),labels = scales::percent) +
          facet_wrap(~season)

  print_list[[i]] = plot

}

# print the charts from the list

for (i in data$fac_type) {

    data_filter <- filter(data, fac_type == i)

    filename=paste("./Charts/National - ",data_filter$fac_type,".jpeg",sep="")
        jpeg(filename,width=9,height=7,units="in",bg="white",quality=1,res=300,type=c("quartz"))

    print(print_list[[i]])

    dev.off()
}

Когда я запускаю выше, не facet_wrapполучая счастливых данных, хрустящих сообщений "Picking joint bandwidth of 0.0182"и совершенно точных диаграмм

Работа без привязки, отфильтрованная диаграмма

Но реализация facet_wrap дает нулевые наборы данных "Picking joint bandwidth of NaN"и соответствующие пустые грани.

Пустая фильтрованная, граненая диаграмма

Любопытно, что огранка работает отлично, если я использовал данные, не отфильтрованные.

Рабочая факсированная нефильтрованная диаграмма

Если я вставляю print(data_filter)в исходный цикл, он отображает правильно отфильтрованные наборы данных, например, ниже

Отфильтрованный фрагмент данных

Поэтому я пришел к выводу, что проблема заключается в том, что facet_wrap каким-то образом искажает данные при переупаковке диаграмм. Тяжелый поиск в Google и поиск SO не дали никаких подсказок, почему это может быть. Я подозреваю, что это связано с внутренними разработками ggplot, в которых я довольно новичок.

Может кто-нибудь мне помочь? Или предложить альтернативный, более элегантный способ сделать это? Мне нужно повторить эту операцию для нескольких наборов данных, поэтому мне нужно масштабируемое решение.

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

Автор: rbanick Источник Размещён: 17.05.2019 03:52

Ответы (1)


0 плюса

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

Автор: thomasvconti Размещён: 07.11.2018 01:27
Вопросы из категории :
32x32