9

Edited to give a fuller example of code and specific issue

I'm writing a function to produce time series plots of stock prices. However, I'm getting the following error

Error in eval(expr, envir, enclos) : object 'df1234' not found

Here's an example of the function:

plot.prices <- function(df1234) {
  require(ggplot2)
  g <- ggplot(df1234, aes(x= as.Date(Date, format= "%Y-%m-%d"), y= df1234[, 3], 
              colour= brewer.pal(12,"Set3")[1])) + geom_point(size=1)
  g + geom_point(aes(x= date, y = df1234[, 4], 
                 colour= brewer.pal(12,"Set3")[2]), size=1)

  # ... code not shown...
  g
}

And example data:

spy <- read.csv(file= 'http://ichart.finance.yahoo.com/table.csv?s=SPY&d=11&e=1&f=2012&g=d&a=0&b=29&c=1993&ignore=.csv', header= T)

plot.prices(spy) # produces error
g <- ggplot(spy, aes(x= as.Date(Date, format= "%Y-%m-%d"), y= spy[, 3], 
              colour= brewer.pal(12,"Set3")[1])) + geom_point(size=1)
  g + geom_point(aes(x= as.Date(Date), y = spy[, 4], 
                 colour= brewer.pal(12,"Set3")[2]), size=1)
## does not produce error

As you can see, the code is identical. I get an error if the call to ggplot() is INSIDE the function but not if the call to ggplot() is OUTSIDE the function.

Anyone have any idea why the seeming contradiction?

alexwhitworth
  • 4,839
  • 5
  • 32
  • 59

2 Answers2

10

The error occur because you use df[, 7] in gglpot2, use column name Adj.Close will fix the problem.

 g <- ggplot(df, aes(x= as.Date(Date, format= "%Y-%m-%d"),
                  y= Adj.Close)) + geom_point(size=1)

In fact the error , it is a scoping error. aes can't find the df environnement. It tries to look for it the global scope .

if you you want to use use indexing calls , you can use aes_string for example , and manipulate strings not expressions

plot.prices <- function(df) {
  require(ggplot2)

  df$Date <- as.Date(df$Date, format= "%Y-%m-%d")

  g <- ggplot(df, aes_string(x= 'Date',
                      y= colnames(df)[7])) + geom_point(size=1)

  # ... code not shown...
  g
}

enter image description here

agstudy
  • 119,832
  • 17
  • 199
  • 261
  • This would fix the problem in the example function. However, the full code includes adding layers for multiple columns.... I didn't put the full detail because it would make the example data difficult. <\n> **Bottom Line** I need to be able to use indexing calls for the aes(y= ...) call. – alexwhitworth Dec 01 '12 at 23:18
  • @Alex I append my solution for indexing – agstudy Dec 01 '12 at 23:31
  • I edited my problem to give a fuller example of the error. Perhaps the issue is the addition of colour= brewer.pal(...) – alexwhitworth Dec 01 '12 at 23:44
  • 1
    Where did you get brewer.pal? Is it in the 'RColorBrewer' package? – Mark Miller Dec 02 '12 at 00:06
  • 2
    @Alex before trying to do complex plots with ggplot2 try to understand the basics : aesthetic mapping and the lexical scoping. – agstudy Dec 02 '12 at 00:58
  • For parameterizing col names in ggplot functions, see also [Making plot functions with ggplot and aes_string](http://stackoverflow.com/questions/10004847/making-plot-functions-with-ggplot-and-aes-string). If you stored the column `as.Date(Date, format= "%Y-%m-%d")` then you could use `aes_string` to reference both x,y series. – smci Jul 20 '13 at 10:44
1

I am not sure whether this is what you want, but it might help. I modified agstudy's code:

spy <- read.csv(file= 'http://ichart.finance.yahoo.com/table.csv?s=SPY&d=11&e=1&f=2012&g=d&a=0&b=29&c=1993&ignore=.csv', header= T)

library(ggplot2)
library(RColorBrewer)

 plot.prices <- function(df) {

   df$Date <- as.Date(df$Date, format= "%Y-%m-%d")

   g <- ggplot(df, aes_string(x='Date', y= colnames(df)[3])) + 
                   geom_point(colour= brewer.pal(12,"Set3")[1], size=1)

   gg <- g + geom_point(aes_string(x='Date', y= colnames(df)[4]),
                   colour= brewer.pal(12,"Set3")[2], size=1)
   gg
 }

 plot.prices(spy)

Here is code without using brewer.pal:

library(ggplot2)

spy <- read.csv(file= 'http://ichart.finance.yahoo.com/table.csv?s=SPY&d=11&e=1&f=2012&g=d&a=0&b=29&c=1993&ignore=.csv', header= T)

 plot.prices <- function(df) {

   df$Date <- as.Date(df$Date, format= "%Y-%m-%d")

   g <- ggplot(df, aes_string(x='Date', y= colnames(df)[3])) + 
                   geom_point(colour= 'green', fill='green', size=1)

   gg <- g + geom_point(aes_string(x='Date', y= colnames(df)[4]),
                   colour= 'black', fill='black', size=1)
   gg
 }

 plot.prices(spy)
Mark Miller
  • 12,483
  • 23
  • 78
  • 132