ggplot facet_wrap считывает все входные данные как NaN (с зацикленным фильтром) - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь сгенерировать серию диаграмм ребристых линий из набора данных, отфильтрованного в соответствии с циклом 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" и совершенно прекрасные графики

Рабочая негласная, отфильтрованная диаграмма:
Working unfaceted, filtered chart

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

Пустой отфильтрованный, граненый график:
Empty filtered, faceted chart

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

Рабочий граненый нефильтрованный график:
Working faceted unfiltered chart

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

Фрагмент отфильтрованных данных:
Filtered data snippet

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

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

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

1 Ответ

0 голосов
/ 07 ноября 2018

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

...