Funções de gravação para automatizar tarefas de plotagem repetitiva no ggplot2

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Leia Também  Esperança, perseverança e compreensão | SageBroadview Financial Planning

Preparando os dados

Os dados, conforme recuperados do Statistics Canada na Parte 5 da série Trabalhando com Dados do Statistics Canada na série R, ainda não estão prontos para plotagem: não possuem porcentagens, apenas contam. Além disso, os níveis de educação estão quase, mas não exatamente, na ordem correta: o 'Cert. ou dipl. acima de bacharel 'é anterior a' bacharelado ', embora deva, é claro, Segue o diploma de bacharel.

Então, vamos aplicar alguns retoques finais em nosso conjunto de dados, após o qual ele estará pronto para plotagem. Primeiro, vamos carregar arrumado:

library(tidyverse)

Então vamos calcular porcentagens e nivelar novamente o 'níveis' variável:

# prepare 'education' dataset for plotting
education % 
  group_by(region) %>% 
  mutate(percent = round(count/sum(count)*100, 1)) %>% 
  mutate(level = factor(level, # put education levels in logical order
                        levels = c("None", 
                                   "High school or equivalent", 
                                   "Apprenticeship or trades", 
                                   "College or equivalent", 
                                   "University below bachelor", 
                                   "Bachelor's degree", 
                                   "Cert. or dipl. above bachelor", 
                                   "Degree in health**", 
                                   "Master's degree", 
                                   "Doctorate*")))

Observe que precisávamos agrupar os dados pelo 'região' para garantir que nossas porcentagens sejam calculadas corretamente, ou seja, por região. Se você não tiver certeza se o conjunto de dados já foi agrupado, verifique isso com o dplyr :: is_grouped_df () função.

Funções de escrita para gerar vários gráficos

Agora, nossos dados estão prontos para serem plotados, então vamos escrever uma função que gerará seqüencialmente nossos gráficos - um para cada região. Preste atenção aos comentários no código:

## plot education data

# a function for sequential graphing of data by region
plot.education <- function(x = education) {
  
  # a vector of names of regions to loop over
  regions <- unique(x$region)
  
  # a loop to produce ggplot2 graphs 
  for (i in seq_along(regions)) {
    
    # make plots; note data = args in each geom
    plot % 
      ggplot(aes(x = level, fill = gender)) +
      geom_col(data = filter(x, region == regions[i], 
                             gender == "Male"), 
               aes(y = percent)) +
      geom_col(data = filter(x, region == regions[i], 
                             gender == "Female"), 
               # multiply by -1 to plot data left of 0 on the X axis
               aes(y = -1*percent)) +  
      geom_text(data = filter(x, region == regions[i], 
                              gender == "Male"), 
                aes(y = percent, label = percent), 
                hjust = -.1) +
      geom_text(data = filter(x, region == regions[i], 
                              gender == "Female"), 
                aes(y = -1*percent, label = percent), 
                hjust = 1.1) +
      expand_limits(y = c(-17, 17)) +
      scale_y_continuous(breaks = seq(-15, 15, by = 5),
                         labels = abs) + # axes labels as absolute values
      scale_fill_manual(name = "Gender",
                        values = c("Male" = "deepskyblue2",
                                   "Female" = "coral1")) +
      coord_flip() +
      theme_bw() +
      theme(plot.title = element_text(size = 14, face = "bold",
                                      hjust = .5,
                                      margin = margin(t = 5, b = 15)),
            plot.caption = element_text(size = 12, hjust = 0, 
                                        margin = margin(t = 15)),
            panel.grid.major = element_line(colour = "grey88"),
            panel.grid.minor = element_blank(),
            legend.title = element_text(size = 13, face = "bold"),
            legend.text = element_text(size = 12),
            axis.text = element_text(size = 12, color = "black"),
            axis.title.x = element_text(margin = margin(t = 10),
                                        size = 13, face = "bold"),
            axis.title.y = element_text(margin = margin(r = 10),
                                        size = 13, face = "bold")) +
      labs(x = "Education level", 
           y = "Percent of population", 
           fill = "Gender",
           title = paste0(regions[i], ": ", "Percentage of Population by Highest Education Level, 2016"),
           caption = "* Doesn’t include honorary doctorates.n** A degree in medicine, dentistry, veterinary medicine, or optometry.nData: Statistics Canada 2016 Census.")
    
    # create folder to save the plots to
    if (dir.exists("output")) { } 
      else {dir.create("output")}
    
    # save plots to the 'output' folder
    ggsave(filename = paste0("output/",
                             regions[i],
                             "_plot_education.png"),
           plot = plot,
           width = 11, height = 8.5, units = "in")
    
    # print each plot to screen
    print(plot)
  }
}

Vamos agora examinar em detalhes as principais seções deste código. Primeiro, começamos com a criação de um vetor de nomes de regiões para que nossa função faça loop e, em seguida, seguimos com um loop for simples: para (i em seq_along (regiões)). Colocamos nosso código de plotagem dentro os colchetes do laço {}.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Note o data = argumento em cada geom: região == regiões[i] diz ggplot () para pegar os dados que correspondem a cada elemento do 'regiões' vector, para cada nova iteração do loop for.

Leia Também  Batalha da Fintech entre titulares e recém-chegados gera acordos gigantescos de fusões e aquisições e captações de fundos, diz o relatório da Hampleton Partners

Como queremos que nossa trama reflita a hierarquia dos níveis de educação e para mostrar os dados por gênero, a melhor abordagem seria plotar os dados como uma pirâmide, com um gênero à esquerda da linha central e o outro - à direita. É por isso que cada geom é plotado duas vezes, com o dplyr :: filter () função usada para subconjunto dos dados.

o y = -1 * por cento argumento para o aes () A função diz ao geom para plotar os dados à esquerda da linha central 0. Tem que ser acompanhado por labels = abs argumento para scale_y_continuous (), que instrui essa função a usar valores absolutos para os rótulos do eixo Y, pois obviamente você não pode ter uma porcentagem negativa de pessoas com um nível de educação específico.

Observe também o limites_de_expansão (y = c (-17, 17)), o que garante que os limites do eixo permaneçam iguais em todos os gráficos gerados por nossa função. Este é um daqueles casos raros em que expand_limits () é preferível coord_flip (), já que com expand_limits () os limites do eixo permanecem os mesmos em todos os gráficos gerados automaticamente. No entanto, lembre-se de que expand_limits () apara as observações fora do intervalo definido a partir dos dados, portanto, elas devem ser usadas com cautela. Mais sobre isso aqui e aqui.

Próximo, coord_flip () converte um gráfico de barras em uma pirâmide, para que os níveis de educação estejam no eixo Y e as porcentagens no eixo X.

Por fim, observe como nosso loop for usa regiões[i] dentro de laboratórios () para adicionar iterativamente os nomes das regiões aos títulos das parcelas e nomear corretamente cada arquivo ao salvar nossas parcelas com ggsave ().

Para gerar os gráficos, execute:

plot.education()

Aqui está uma de nossas parcelas:

Se você fez tudo corretamente, deve haver mais cinco gráficos como este em sua pasta "output" - um para cada região em nosso conjunto de dados.

Criando temas de plotagem personalizados

A outra maneira de simplificar tarefas repetitivas de plotagem é criando seus próprios temas de plotagem personalizados. Como todo tema de enredo em ggplot2 é uma função, você pode salvar facilmente suas configurações de tema favoritas como uma função personalizada. Criar um tema é mais fácil do que escrever funções para gerar vários gráficos, pois você não precisará escrever nenhum loop.

Suponha que você queira salvar o tema de nossas parcelas educacionais e usá-lo em outras parcelas. Para fazer isso, basta agrupar as configurações do tema em função():

## Save custom theme as a function ##
theme_custom <- function() {
  theme_bw() + # note ggplot2 theme is used as a basis
  theme(plot.title = element_text(size = 14, face = "bold",
                                  hjust = .5,
                                  margin = margin(t = 5, b = 15)),
        plot.caption = element_text(size = 11, hjust = 0, 
                                    margin = margin(t = 15)),
        panel.grid.major = element_line(colour = "grey88"),
        panel.grid.minor = element_blank(),
        legend.title = element_text(size = 13, face = "bold"),
        legend.text = element_text(size = 12),
        axis.text = element_text(size = 12),
        axis.title.x = element_text(margin = margin(t = 10),
                                    size = 13, face = "bold"),
        axis.title.y = element_text(margin = margin(r = 10),
                                    size = 13, face = "bold"))
}

Observe que esse código leva um dos ggplot2 temas como base e, em seguida, altera alguns de seus elementos ao nosso gosto. Você pode alterar qualquer tema como este: a ggplot2 tema, um tema personalizado de outro pacote, como ggthemesou seu próprio tema personalizado.

Leia Também  Enganado pela aleatoriedade | R-bloggers

Vamos agora usar o tema salvo em uma plotagem. Geralmente, não importa que tipo de dados vamos visualizar, pois os temas tendem a ser bastante universais. Observe, no entanto, que às vezes os dados e o tipo de visualização são importantes. Por exemplo, nosso theme_custom () não funcionará para um gráfico de pizza, porque nosso tema possui linhas de grade e rotula os eixos X e Y.

Para ilustrar como esse tema se encaixa em um tipo de dados totalmente diferente, vamos plotar alguns dados sobre pinguins. Por que pinguins? Porque eu amo Linux!

Os dados foram divulgados recentemente como o palmerpenguins pacote contendo várias medidas de três espécies de pinguins (descobertas via @allison_horst). O pacote é bastante educacional: por exemplo, aprendi que o Gentoo não é apenas um Linux, mas também um pinguim!

palmerpenguins ainda não está no CRAN, você precisará instalá-lo no GitHub:

devtools::install_github("allisonhorst/palmerpenguins")
library(palmerpenguins)

Vamos agora fazer um gráfico de dispersão mostrando a relação entre o comprimento da conta e a massa corporal nas três espécies de pinguins de palmerpenguins. Também vamos adicionar linhas de regressão com intervalos de confiança de 95% ao nosso gráfico e aplicar nosso tema personalizado:

## Plot penguins data with a custom theme
plot_penguins % 
  group_by(species) %>% 
  ggplot(aes(x = bill_length_mm,
             y = body_mass_g,
             color = species)) +
  geom_point(size = 2, na.rm = TRUE) +
  geom_smooth(aes(fill = species), 
              formula = y ~ x, # optional: removes message
              method = "lm", 
              alpha = .3, # alpha level for conf. interval
              na.rm = TRUE) + 
  # Note that you need identical name, labels, and values 
  # in both manual scales to avoid legend duplication:
  # this merges two legends into one.
  scale_color_manual(name = "Species",
                     values = c("Adelie" = "orange2",
                                "Chinstrap" = "dodgerblue",
                                "Gentoo" = "orchid")) +
  scale_fill_manual(name = "Species",
                    values = c("Adelie" = "orange2",
                               "Chinstrap" = "dodgerblue",
                               "Gentoo" = "orchid")) +
  theme_custom() + # here is our custom theme
  labs(x = "Bill length, mm",
       y = "Body mass, grams",
       title = "Body Mass to Bill Length in Adelie, Chinstrap, and Gentoo Penguins",
       caption = "Data: Gorman, Williams, and Fraser 2014")

Como de costume, vamos salvar o gráfico na pasta 'output' e imprimi-lo na tela:

# save plot to 'output' folder
ggsave("output/plot_penguins.png", 
       plot_penguins,
       width = 11, height = 8.5, units = "in")

# print plot to screen
print(plot_penguins)

Aqui está:

Atualizando temas de plotagem

Agora, suponha que sua organização use um tema de cor verde em seus sites e relatórios, para que o gráfico de dados do pinguim precise se adequar ao estilo geral. Felizmente, atualizar um tema personalizado é muito fácil: você reatribui os elementos do tema que deseja alterar, por exemplo, para usar uma cor diferente:

# further change some elements of our custom theme
theme_custom_green <- function() {
  theme_custom() +
  theme(plot.title = element_text(color = "darkgreen"),
        plot.caption =  element_text(color = "darkgreen"),
        panel.border = element_rect(color = "darkgreen"),
        axis.title = element_text(color = "darkgreen"),
        axis.text = element_text(color = "darkgreen"),
        axis.ticks = element_line(color = "darkgreen"),
        legend.title = element_text(color = "darkgreen"),
        legend.text = element_text(color = "darkgreen"),
        panel.grid.major = element_blank())
}

Em seguida, basta substituir theme_custom () no código acima com theme_custom_green (). Não são necessárias outras alterações!

E por último mas não menos importante, aqui está a citação para os dados dos pinguins:

Gorman KB, Williams TD, Fraser WR (2014) Dimorfismo sexual ecológico e variabilidade ambiental em uma comunidade de pingüins antárticos (gênero Pygoscelis). PLoS ONE 9 (3): e90081. https://doi.org/10.1371/journal.pone.0090081.

A postagem Escrevendo funções para automatizar tarefas de plotagem repetitiva no ggplot2 apareceu primeiro no Blog do Data Enthusiast.

var vglnk = {key: '949efb41171ac6ec1bf7f206d57e90b8'}; (função (d, t) {var s = d.createElement

Para Deixe um comentário para o autor, siga o link e comente no blog: Blog do Entusiasta de Dados.

R-bloggers.com oferece atualizações diárias por email sobre notícias e tutoriais do R sobre o aprendizado do R e muitos outros tópicos. Clique aqui se você deseja publicar ou encontrar um emprego em ciência da dados / R.
Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.


cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br