R Передача аргументов для ggplot через вызов функции с facet_wrap и поднабором данных - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть продольные данные, которые я передаю в ggplot с facet_wrap и подмножеством кадра данных. Я sh '' функционирую ', изменяю это, и у меня возникают проблемы. Я видел похожие посты к этому, но не один с facet_wrap и поднабором данных внутри функции. Например, я использовал информацию из этого поста в прошлом для создания простых графиков. Ниже я показываю раздел кода для генерации фиктивных данных и затем построения графика c. Это работает хорошо. Когда я пытаюсь использовать вызов функции, я получаю сообщение об ошибке:

Ваша помощь очень ценится. Спасибо !!

Ошибка: переменные фасетирования должны иметь хотя бы одно значение

# Test

# Generate data
DF <- expand.grid(Time=(0:10), variable=as.factor(c("ux0", "ux1", "ux2")), model=as.factor(c("Model 1", "Model 2", "Model 3")))
DF$value <- DF$Time + rnorm(nrow(DF), 0, 20)

# load libraries
library(ggplot2)
library(scales)

# Define themes
My_Theme = theme_bw()+
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        aspect.ratio = 1,
        axis.title=element_text(size=7),
        axis.text.x=element_text(size=rel(0.6)),
        axis.text.y=element_text(size=rel(0.6)),
        strip.text = element_text(size = 6))

#Plot
my.plot  =  
  ggplot(subset(DF, variable %in% "ux1")) +
  geom_line(aes(x=Time, y=value)) +
  facet_wrap( ~ model, ncol=3) + 
  labs(x = "Time [s]", y = expression(paste("U"[X],","[1]))) +
  My_Theme
print(my.plot)

#Now try with function
makePlots <- function(data, subSetVar, subSetval, xVar, yVar, facetVar, 
                      xLabel, yLabel){

  # Common Theme to all plots

  My_Theme = theme_bw()+
    theme(panel.grid.major = element_blank(), 
          panel.grid.minor = element_blank(),
          aspect.ratio = 1,
          axis.title=element_text(size=7),
          axis.text.x=element_text(size=rel(0.6)),
          axis.text.y=element_text(size=rel(0.6)),
          strip.text = element_text(size = 6))

  my.plot  =  
    ggplot(subset(data, subSetVar %in% subSetval)) + 
    geom_line(aes(x=xVar, y=yVar)) + 
    facet_wrap(facetVar, ncol=3) + 
    labs(x = xLabel, y = yLabel) +
    My_Theme


  # Output to Plots window in RStudio
  print(my.plot)

}

my.plot <- makePlots(DF, "variable", "ux1", "Time", "value", "model",
                     "Time [s]", expression(paste("U"[X],","[1])))

'' '

1 Ответ

1 голос
/ 02 апреля 2020

Чтобы передать символьные строки как переменные в ggplot, вам нужно внести некоторые изменения в my.plot часть перед переносом в функцию.

Для подмножества набора данных вам нужно передать имена столбцов с [[ ]], чтобы он работал. Для определения x и y вы можете использовать aes_string (https://ggplot2.tidyverse.org/reference/aes_.html). Наконец, для фасетирования передайте вектор символов в виде формулы (как описано в этом посте: Передача строковой переменной facet_wrap () в ggplot с использованием R ).

my.plot  =  
    ggplot(subset(data, data[[subSetVar]] %in% subSetval)) + 
    geom_line(aes_string(x=xVar, y=yVar)) +
    facet_wrap(as.formula(paste("~", facetVar)), ncol=3) + 
    labs(x = xLabel, y = yLabel) +
    My_Theme

Затем следует работать и получить тот же график:

my.plot <- makePlots(DF, "variable", "ux1", "Time", "value", "model",
                     "Time [s]", expression(paste("U"[X],","[1])))

enter image description here

Отвечает ли он на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...