Панели facet_wrap не отображаются в последовательности уровней переменной facet_wrap - PullRequest
0 голосов
/ 21 января 2019

Я наблюдаю странное поведение, которое, я уверен, связано с добавлением большего количества материала в ggplot.Но я не могу понять, что является причиной такого поведения.

У меня есть вектор с последовательностью имен.

list.top.35.names 
 [1] "Jessie"    "Marion"    "Jackie"    "Alva"      "Trinidad"  "Ollie"     "Carrol"    "Jody"      "Baby"      "Lavern"    "Cleo"      "Marlo"    
[13] "Kerry"     "Ivory"     "Carey"     "Guadalupe" "Frankie"   "Kris"      "Tommie"    "Lupe"      "Arden"     "Darby"     "Angel"     "Hollis"   
[25] "Gale"      "Sammie"    "Lavon"     "Paris"     "Rosario"   "Alpha"     "Ariel"     "Jamie"     "Layne"     "Michel"    "Dee"  

Я переупорядочил свой фактор имени на основе приведенного выше списка.

data.babyname.all$name <- factor(data.babyname.all$name , levels = list.top.35.names )
str(data.babyname.all$name)
 Factor w/ 35 levels "Jessie","Marion",..

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

Справочная информация:

#install.packages("babynames") # run this in case you don't have the `babynames` package installed yet
#install.packages("ggrepel")

  library("babynames")
  library("knitr")
  library("tidyverse")
  library("ggrepel")

Набор данных, который я использую data.babynames.total = babynames

  list.top.35.names = c( "Jessie" ,   "Marion",    "Jackie" ,   "Alva"    ,  "Trinidad"  ,"Ollie"  ,   "Carrol"  ,  "Jody"  ,    "Baby"  ,    "Lavern"   , "Cleo"    ,  "Marlo"    , "Kerry" ,    "Ivory"  ,   "Carey" ,    "Guadalupe" ,"Frankie" ,  "Kris" ,     "Tommie" ,   "Lupe"   ,   "Arden"   ,  "Darby"  ,   "Angel"   ,  "Hollis"   , "Gale"  ,    "Sammie" ,   "Lavon"  ,   "Paris"  ,   "Rosario"  , "Alpha"   ,  "Ariel"  ,   "Jamie"    , "Layne"  ,   "Michel", "Dee") 

Я сделал больше очистки.Это просто небольшая уборка здесь ради аргумента.

  data.babynames.total = data.babynames.total  %>%
     filter(name %in% list.top.35.names) %>%
      group_by(name,year) %>% 
      mutate(perc= n/sum(n)) %>%
      ungroup()

data.babyname.all $ name <- factor (data.babyname.all $ name, levels = list.top.35.names) </p>

data.babyname.all %>% 
  ggplot( mapping = aes(x = year, y = perc, fill = sex)) +
  geom_density(stat = "identity", position = "stack" , show.legend = F ) +
  facet_wrap(~name, ncol= 7) +
  scale_fill_manual(values = c('#E1AEA1','#9ABACF'))  + 
  geom_point(data = most.unisex.year.and.value, mapping = aes(x =  year, y = perc), 
             size = 3, 
             fill = "white", 
             color = "black", 
             shape = 21) +
  theme_minimal() + #set theme
  theme(
          text = element_text(size = 10),
          axis.title.x = element_blank(),
          axis.title.y = element_blank(),
          panel.grid = element_blank(), 
          panel.border = element_blank(),
          plot.background = element_blank(),
          axis.ticks.x = element_line(color = "black"),
          axis.ticks.length =unit(.2,'cm')  ) + 
  scale_y_continuous(breaks = c(0,.50,1), labels= c("0%", "50%","%100")) +
  scale_x_continuous(breaks = c(1940, 1960, 1980,2000), labels= c('1940', "'60","'80",'2000')) +
 geom_text(mapping = aes(x =x , y = y , label = label),  check_overlap = F, na.rm = T) 

Вот каквывод выглядит так.Не стесняйтесь комментировать последнюю строку заговора. вывод ggplot

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Тот же код без geom_point (как указал @parpar) отлично работает

library("babynames")
library("knitr")
library("tidyverse")
library("ggrepel")

data.babyname.all <- babynames::babynames

data.babyname.all$name <- factor(data.babyname.all$name , levels = list.top.35.names )

list.top.35.names = c( "Jessie" ,   "Marion",    "Jackie" ,   "Alva"    ,  "Trinidad"  ,"Ollie"  ,   "Carrol"  ,  "Jody"  ,    "Baby"  ,    "Lavern"   , "Cleo"    ,  "Marlo"    , "Kerry" ,    "Ivory"  ,   "Carey" ,    "Guadalupe" ,"Frankie" ,  "Kris" ,     "Tommie" ,   "Lupe"   ,   "Arden"   ,  "Darby"  ,   "Angel"   ,  "Hollis"   , "Gale"  ,    "Sammie" ,   "Lavon"  ,   "Paris"  ,   "Rosario"  , "Alpha"   ,  "Ariel"  ,   "Jamie"    , "Layne"  ,   "Michel", "Dee") 


data.babynames.total = data.babyname.all  %>%
  filter(name %in% list.top.35.names) %>%
  group_by(name,year) %>% 
  mutate(perc= n/sum(n)) %>%
  ungroup()


data.babyname.all$name <- factor(data.babyname.all$name , levels = list.top.35.names )

data.babynames.total %>% 
  ggplot( mapping = aes(x = year, y = perc, fill = sex)) +
  geom_density(stat = "identity", position = "stack" , show.legend = F ) +
  facet_wrap(~name, ncol= 7) +
  scale_fill_manual(values = c('#E1AEA1','#9ABACF'))  +  
  theme_minimal() + #set theme
  theme(
    text = element_text(size = 10),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.grid = element_blank(), 
    panel.border = element_blank(),
    plot.background = element_blank(),
    axis.ticks.x = element_line(color = "black"),
    axis.ticks.length =unit(.2,'cm')  ) + 
  scale_y_continuous(breaks = c(0,.50,1), labels= c("0%", "50%","%100")) +
  scale_x_continuous(breaks = c(1940, 1960, 1980,2000), labels= c('1940', "'60","'80",'2000')) 

enter image description here

0 голосов
/ 21 января 2019

Я понял это.Most.unisex.year.and.value содержит столбцы с именами x и y.У этого есть 35 рядов.Все, что мне нужно было сделать, - это заказать фактор имен, основанный на порядке 35 лучших имен.

most.unisex.year.and.value$name <- factor(most.unisex.year.and.value$name , levels = list.top.35.names , ordered = TRUE)
0 голосов
/ 21 января 2019

Простите, что не устанавливаете пакеты и не тестируете все это, но в самом начале: разве вы не должны прямо указывать, что они заказаны? Как это:

data.babyname.all$name <- factor(data.babyname.all$name , levels = list.top.35.names, ordered = TRUE)
...