Tengo los siguientes datos y estoy tratando de construir un for loop en 3 símbolos comunes;

symbols <- c("HOG", "GE", "GOOG")

Tengo el siguiente ggplot. Estoy tratando de hacer dos cosas.

1) Ejecute un ggplot en los tres símbolos en symbols

2) Cambie el título de cada ggplot para incorporar el nombre correcto de los símbolos

Un ejemplo usando GOOG a continuación.

library(ggplot2)
ggplot(subset(NFO_WCAnalysis, Ticker %in% c("GOOG"))) +
  geom_line(aes(Date, NFO, group = Ticker, colour = "Blue")) +
  geom_line(aes(Date, WC, group = Ticker, colour = "Red")) +
  labs(title="NFO and WC plot GOOG", x="Date", y="NFO / WC") +
  scale_color_manual(labels = c("NFO", "WC"), values = c("Blue", "Red")) +
  theme_bw() +
  guides(color=guide_legend("Legend"))

Los datos. (Puedo publicar mis intentos en for loop si es necesario) También estoy abierto a usar la funcionalidad de trazado base en lugar de ggplot.

structure(list(Ticker = c("GOOG", "GOOG", "GOOG", "GOOG", "GE", 
"GE", "GE", "GE", "HOG", "HOG", "HOG", "HOG"), Date = c(2017, 
2016, 2015, 2014, 2017, 2016, 2015, 2014, 2017, 2016, 2015, 2014
), REC = c(18705, 14232, 13909, 10849, 24438, 24076, 27022, 23237, 
2435.65, 2361.37, 2300.99, 2164.26), INV = c(749, 268, 0, 0, 
21923, 22354, 22515, 17689, 538.2, 499.92, 585.91, 448.87), OtherCurrentAssetsNotCash = c(80, 
596, 628, 852, 0, 0, 0, 0, 223.37, 227.06, 323.59, 370.96), Payables = c(3137, 
2041, 1931, 1715, 15153, 14435, 13680, 12067, 227.6, 235.32, 
235.61, 196.87), SpontaneousFunsIncDeftaxes = c(21476, 14941, 
14343, 13813, 19514, 18867, 17943, 14854, 529.82, 486.65, 471.97, 
449.32), NFO = c(-5079, -1886, -1737, -3827, 11694, 13128, 17914, 
14005, 2439.8, 2366.38, 2502.91, 2337.9), LTD = c(3969, 3935, 
1995, 3228, 110555, 105497, 147742, 190999, 4587.26, 4666.98, 
4832.47, 3761.53), EQ = c(152502, 139036, 120331, 103860, 64264, 
75827, 98273, 128158, 1844.28, 1920.16, 1839.65, 2909.29), OtherLongTermLiabilities = c(16211, 
7544, 5636, 4562, 144423, 119843, 165573, 238451, 382.97, 440.55, 
553.55, 468), FA = c(72987, 62089, 57347, 50531, 377945, 365183, 
493071, 654954, 6087.93, 6036.39, 5995.1, 5580.01), WC = c(99695, 
88426, 70615, 61119, -58703, -64016, -81483, -97346, 726.58, 
991.3, 1230.57, 1558.81), CreditPlusCashMinus = c(-104774, -90312, 
-72352, -64946, 70397, 77144, 99397, 111351, 1713.22, 1375.08, 
1272.34, 779.090000000001)), .Names = c("Ticker", "Date", "REC", 
"INV", "OtherCurrentAssetsNotCash", "Payables", "SpontaneousFunsIncDeftaxes", 
"NFO", "LTD", "EQ", "OtherLongTermLiabilities", "FA", "WC", "CreditPlusCashMinus"
), row.names = c(NA, -12L), class = "data.frame")
2
user113156 7 mar. 2018 a las 01:20

3 respuestas

La mejor respuesta

Creo que el mejor enfoque aquí es crear una lista de objetos ggplot, luego reemplazar el texto en lo que tiene actualmente.

Esto es lo que quiero decir:

#This will store all our ggplot objects, not necessary, but this gives us some extra flexibility
plotList <- list()

#This will loop through each of the symbol names
for(symbol in symbols){

    #What you had before, but with minor changes
    plotList[[symbol]] <- ggplot(subset(NFO_WCAnalysis, Ticker %in% symbol)) +
      geom_line(aes(Date, NFO, group = Ticker, colour = "Blue")) +
      geom_line(aes(Date, WC, group = Ticker, colour = "Red")) +
      labs(title=paste0("NFO and WC plot ", symbol), x="Date", y="NFO / WC") +
      scale_color_manual(labels = c("NFO", "WC"), values = c("Blue", "Red")) +
      theme_bw() +
      guides(color=guide_legend("Legend"))

}

Observe que todo lo que es diferente en el comando de trazado es que el "GOOG" ha sido reemplazado por symbol, que es el objeto por el que se repite. En el argumento del título, acabo de utilizar una operación paste0 para concatenar qué nombre de símbolo con el otro texto que desee.

Con los objetos almacenados en plotList[[symbol]] ahora puede llamarlos como quiera usando plotList[["GOOG"]] o el nombre del símbolo que desee :)

Debido a que es una lista, también puede usarla secuencialmente, p. plotList[[1]]. Esto significa que también puede pasar para imprimir cosas si lo desea más tarde, o simplemente tomar las que desee.

E.g.

for(i in 1:3){

    print(plotList[[i]])

}

Si solo quiere trazar las cosas inmediatamente en primer lugar, puede deshacerse del bit plotList[[symbol]] <- y simplemente envolver todas las instrucciones ggplot dentro de un comando print, y eso hará el mismo trabajo .

¡Buena suerte!

2
LachlanO 6 mar. 2018 a las 22:29

Solo se necesitan un par de cambios:

for(symbol in symbols)
  print(ggplot(subset(NFO_WCAnalysis, Ticker %in% symbol)) +
          geom_line(aes(Date, NFO, group = Ticker, colour = "Blue")) +
          geom_line(aes(Date, WC, group = Ticker, colour = "Red")) +
          labs(title= paste("NFO and WC plot", symbol), x = "Date", y = "NFO / WC") +
          scale_color_manual(labels = c("NFO", "WC"), values = c("Blue", "Red")) +
          theme_bw() +
          guides(color = guide_legend("Legend")))
1
Julius Vainora 6 mar. 2018 a las 22:23

Empezaría escribiendo una función. También transformaría los datos del formato ancho-largo, que funciona mejor con ggplot:

library(tidyverse)

plotSymbol <- function(data, symbol) {
  data %>%
    filter(Ticker == symbol) %>%
    select(Date, NFO, WC) %>%
    gather(variable,value, -Date) %>%
    ggplot(aes(Date, value)) + 
      geom_line(aes(color = variable, group = variable)) +
      labs(title = paste("NFO and WC plot", symbol),
           y = "NFO, WC") +
      scale_color_manual(values = c("blue", "red")) +
      theme_bw()
}

Ahora puedes ejecutar, por ejemplo:

plotSymbol(NFO_WCAnalysis, "GOOG")

Y en lugar de un bucle, puede usar lapply para generar una lista de objetos ggplot, uno por símbolo:

plots <- lapply(symbols, function(x) plotSymbol(NFO_WCAnalysis, x))

Ahora puede hacer lo que quiera con la lista plots. Con algunas modificaciones al código, podría, por ejemplo, escribir en archivos PNG utilizando el símbolo como parte del nombre del archivo.

1
neilfws 6 mar. 2018 a las 22:40