Используйте метки вместо имен переменных для l oop ggplot2 - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь создать функцию для l oop, чтобы сделать несколько линейных графиков ggplot, где меняется только переменная x. Тем не менее, полученные графики показывают имя переменной в качестве заголовка, а в ярлыках при наведении курсора на ggplotly вместо имени переменной отображается «x». Я хотел бы использовать метки переменных, которые уже встроены в набор данных, вместо имен переменных. Может ли кто-нибудь помочь мне с изменением функции таким образом, чтобы метки переменных использовались в ggplotly вместо имен переменных (имен столбцов df) и метки переменных вместо просто «x» в метке при наведении курсора?

Image of Plotly object, showing hover labels

Image DF with the build in variable labels

Ниже кода:

library(ggplot2)
library(cbsodataR)
library(plotly)
library(sjlabelled)
library(expss)
library(tidyr)
library(tidyverse)
library(sf)
library(dplyr)
library(stringr)

##Get data from dutch public data for one specific area
bevolking <- cbs_get_data("70072NED", 
                          RegioS = "GM0736")
#Create other values for variable $Perioden
bevolking$Perioden <- 1995:2020
#Only show data as from 2011
bevolking <- bevolking %>%
  filter(bevolking$Perioden>=2011) 
#Select variables from dataset
bevolking <- bevolking %>%
  select(c("Perioden", "Mannen_2", "Vrouwen_3")) 

#Create for loop function
plots <- list()
for(nm in names(bevolking)) {
  plots[[nm]] <- ggplot(bevolking, aes_string(y = nm, x = bevolking$Perioden)) +
    geom_line(color = "#10A593", size = 1) + 
    theme_bw() + 
    theme(panel.border = element_blank(), 
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          axis.line = element_line(colour = "black"), 
          axis.title.y=element_blank(),
          axis.ticks.y=element_blank(),
          axis.ticks.x=element_blank(),
          axis.line.y=element_blank()) +
    geom_point() +
    labs(title = (paste(nm)))+
    scale_x_continuous("Perioden",
                       labels = as.character(bevolking$Perioden), 
                       breaks = bevolking$Perioden)
}

#Display one plot as a plotly from the above function
ggplotly(plots[["Mannen_2"]]) 

1 Ответ

0 голосов
/ 01 мая 2020

use_labels не очень подходит для использования внутри циклов. Но если я правильно понимаю, что вам нужно:

library(ggplot2)
library(cbsodataR)
library(plotly)
library(sjlabelled)
library(expss)
library(tidyr)
library(tidyverse)
library(dplyr)
library(stringr)

##Get data from dutch public data for one specific area
bevolking <- cbs_get_data("70072NED", 
                          RegioS = "GM0736")
#Create other values for variable $Perioden
bevolking$Perioden <- 1995:2020
#Only show data as from 2011
bevolking <- bevolking %>%
    filter(bevolking$Perioden>=2011) 
#Select variables from dataset
bevolking <- bevolking %>%
    select(c("Perioden", "Mannen_2", "Vrouwen_3")) 

var_lab(bevolking$Perioden) = "Perioden"

#Create for loop function
plots <- list()
for(nm in names(bevolking)) {
    plots[[nm]] <- use_labels(bevolking, ggplot(..data, aes_string(y = var_lab(bevolking[[nm]]), x = Perioden)) +
        geom_line(color = "#10A593", size = 1) + 
        theme_bw() + 
        theme(panel.border = element_blank(), 
              panel.grid.major = element_blank(),
              panel.grid.minor = element_blank(),
              axis.line = element_line(colour = "black"), 
              axis.title.y=element_blank(),
              axis.ticks.y=element_blank(),
              axis.ticks.x=element_blank(),
              axis.line.y=element_blank()) +
        geom_point() +
        labs(title = var_lab(bevolking[[nm]]))+
        scale_x_continuous("Perioden",
                           labels = as.character(Perioden), 
                           breaks = Perioden)
    )
}

#Display one plot as a plotly from the above function

ggplotly(plots[["Mannen_2"]], tooltip=c("y")) 

ОБНОВЛЕНИЕ: «aes_string» не является идеальным, когда argumnets не являются хорошими именами переменных. Цитата из справки для aes_string:

# You can't easily mimic these calls with aes_string
aes(`$100`, colour = "smooth")
aes_(~ `$100`, colour = "smooth")
# Ok, you can, but it requires a _lot_ of quotes
aes_string("`$100`", colour = '"smooth"')

Итак, вам нужно вставить обратные метки вокруг var_lab (...). Или лучше использовать aes_: aes_(y = as.name(var_lab(bevolking[[nm]])), x = Perioden)

...