Как зациклить функцию ggplot2 для экспорта и сохранения около 40 графиков? - PullRequest
0 голосов
/ 06 июня 2019

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

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

Код, который работает, следующий:

plots <- ggplot(Everything.any, mapping = aes(x = stock_VWRETD, y = stock_10065)) +
    geom_point() +
    labs(x = 'Market Returns', y = 'Stock Returns', title ='Stock vs Market Returns') +
    geom_smooth(method='lm',formula=y~x)

Но я не хочу делать это еще 40 раз (а затем и в 5 раз больше по другим причинам). Код, который я нашел в Интернете и попытался изменить его для моих целей, выглядит следующим образом:

plotRegression <- function(z,na.rm=TRUE,...){
  nm <- colnames(z)
  for (i in seq_along(nm)){
    plots <- ggplot(z, mapping = aes(x = stock_VWRETD, y = nm[i])) +
    geom_point() +
    labs(x = 'Market Returns', y = 'Stock Returns', title ='Stock vs Market Returns') +
    geom_smooth(method='lm',formula=y~x)

    ggsave(plots,filename=paste("regression1",nm[i],".png",sep=" "))
  }
}

plotRegression(Everything.any)

Я ожидаю, что это будет хороший график, который я ожидал получить, график Возвращение акций против графика Рынок, но вместо этого по оси Y я получаю одно значение, которое является именем соответствующего столбца, и Рыночная стоимость изображена как обычно, но как бы на прямой числовой линии через одно значение оси y. Пожалуйста, дайте мне знать, что я делаю неправильно.

Желаемый участок:

enter image description here

Фактический участок:

enter image description here

Пример данных доступен на Google Диске здесь: https://drive.google.com/open?id=1Xa1RQQaDm0pGSf3Y-h5ZR0uTWE-NqHtt

Ответы [ 2 ]

1 голос
/ 06 июня 2019

вам нужно использовать aes_string вместо aes и ставить двойные кавычки вокруг переменной x, а затем вы можете напрямую использовать переменную i.Вы также можете упростить свой цикл вызова.Вот пример использования ириса.

library(ggplot2)

plotRegression <- function(z,na.rm=TRUE,...){

  nm <- colnames(z)

  for (i in nm){
        plots <- ggplot(z, mapping = aes_string(x = "Sepal.Length", y = i)) +
          geom_point()+
          geom_smooth(method='lm',formula=y~x)
        ggsave(plots,filename=paste("regression1_",i,".png",sep=""))
  }
}
myiris<-iris
plotRegression(myiris)
1 голос
/ 06 июня 2019

Проблема в том, что когда вы назначаете переменные эстетике в aes, вы смешиваете пустые имена и строки. В этом примере предполагается, что X и Y являются переменными в z:

aes(x = stock_VWRETD, y = nm[i])

Вы ссылаетесь на stock_VWRETD, используя голое имя (как требуется для aes), однако для y= вы предоставляете имя как символьный вектор, создаваемый colnames. Посмотрите, что произойдет, когда мы повторим это с набором данных iris:

ggplot(iris, aes(Petal.Length, 'Sepal.Length')) + geom_point()

Incorrect plot with y-variable assigned to a single string

Поскольку aes ожидает, что имена переменных будут заданы как голые имена, он не интерпретирует 'Sepal.Length' как переменную в iris, а как отдельный вектор (состоящий из одного символьного значения), который содержит y- значения для каждой точки.


Что вы можете сделать? Вот 2 варианта, которые оба дают правильный сюжет

1) Используйте aes_string и измените имена обеих переменных на символы:

ggplot(iris, aes_string('Petal.Length', 'Sepal.Length')) + geom_point()

2) Используйте подмножество квадратных скобок, чтобы вручную извлечь соответствующую переменную:

ggplot(iris, aes(Petal.Length, .data[['Sepal.Length']])) + geom_point()

Correct X-Y plot

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