You forgot to reply-all ... I don't do private consulting, so please keep
the conversation on the mailing list.
Here are some ideas for extending your example. However, whether you WANT
to or not, you really need to learn to manipulate your data BEFORE you
give it to ggplot.
#########################################
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(rlang)
`RefDate` <- as.Date(c("2010-11-1","2010-12-01","2011-01-01"))
`Number of vegetables` <- c(14,23,45)
`Number of people` <- c(20,30,40)
MyData <- data.frame( RefDate
, `Number of vegetables`
, `Number of people`
, check.names=FALSE
)
MyVars <- c("Number of vegetables","Number of people")
# simple approach... notice "RefDate" is a string
for (A in MyVars) {
g2 <- ggplot( MyData
, aes_string( x = "RefDate"
, y = paste0( "`", A, "`")
)
) +
geom_line() +
labs( title = paste( A, "adjusted" ) )
print( g2 )
# ggsave( paste0( A,".jpg" )
# ,g2
# ,height=5
# ,width=8
# ,dpi=300
# )
}
# Using function FQPC here - works, but an inferior use of ggplot
# because ggplot does not build legends with wide data
FQPC <- function(x) {100*x/lag(x,1)-100} # % change
for (A in MyVars) {
g2 <- ggplot( MyData
, aes( x = RefDate
, y = FQPC( !!sym( A ) )
)
) +
geom_line() +
labs(title = paste( A,"adjusted" ) )
print( g2 )
# ggsave( paste0( A,".jpg" )
# ,g2
# ,height=5
# ,width=8
# ,dpi=300
# )
}
#> Warning: Removed 1 rows containing missing values (geom_path).
#'
#> Warning: Removed 1 rows containing missing values (geom_path).
# superior approach is to do the computations first
for ( A in MyVars ) {
DF <- MyData[ , c( "RefDate", A ) ]
DF[[ 2 ]] <- FQPC( DF[[ 2 ]] )
g2 <- ( ggplot( DF, aes( x = RefDate, y = !!sym( A ) ) )
+ geom_line()
+ labs( title = paste( A,"adjusted" ) )
)
print( g2 )
}
#> Warning: Removed 1 rows containing missing values (geom_path).
#'
#> Warning: Removed 1 rows containing missing values (geom_path).
# Another way to do the computations first
resultDF <- data_frame( variable = MyVars
, data = lapply( MyVars
, function( A ) {
DF <- setNames( MyData[ , c(
"RefDate", A ) ]
, c( "RefDate", "value"
)
)
DF[[ 2 ]] <- FQPC( DF[[ 2 ]] )
DF
}
)
)
for ( i in seq.int( nrow( resultDF ) ) ) {
A <- resultDF$variable[ i ]
g2 <- ( ggplot( resultDF$data[[ i ]], aes( x = RefDate, y = value ) )
+ geom_line()
+ ylab( A )
+ labs( title = paste( A, "adjusted" ) )
)
print( g2 )
}
#> Warning: Removed 1 rows containing missing values (geom_path).
#' #> Warning: Removed 1 rows containing missing values (geom_path).
# or put them together in order determined by MyVars:
resultDF %>%
mutate( variable = factor( variable, levels = MyVars ) ) %>%
unnest %>% # flattens separate data frames in data column into one long
data frame
ggplot( aes( x = RefDate, y = value ) ) +
geom_line() +
facet_grid( variable ~ ., scales = "free_y" )
#> Warning: Removed 1 rows containing missing values (geom_path).
#' Created on 2018-09-05 by the [reprex package](http://reprex.tidyverse.org)
(v0.2.0).
#####################################33
On Wed, 5 Sep 2018, phili...@cpanel1.stormweb.net wrote:
Thanks again for your help. Your suggested solution using aes_string(), which
I was not familiar with, worked perfectly when I plotted the column
variables. However, I also want to plot transformations of those variables
and the aes_string() approach does not work in that case. I implement the
transformations with a function and the function is expecting a numeric
rather than a string.
For example, when I use the function:
library(dplyr)
library(ggplot2)
`RefDate` <- as.Date(c("2010-11-1","2010-12-01","2011-01-01"))
`Number of vegetables` <- c(14,23,45)
`Number of people` <- c(20,30,40)
MyData <- data.frame(RefDate
,`Number of vegetables`
,`Number of people`
,check.names=FALSE
)
MyVars <- c("Number of vegetables","Number of people")
# No function here - it works
for (A in MyVars) {
g2 <- ggplot(MyData
,aes_string( x = RefDate
, y = paste0( "`", A, "`")
)
) +
geom_line() +
labs(title = paste( A,"adjusted" ) )
g2
ggsave( paste0( A,".jpg" )
,g2
,height=5
,width=8
,dpi=300
)
}
# Using function FQPC here - it does not work
FQPC <- function(x) {100*x/lag(x,1)-100} # % change
for (A in MyVars) {
g2 <- ggplot(MyData
,aes_string( x = RefDate
, y = FQPC(paste0( "`", A, "`"))
)
) +
geom_line() +
labs(title = paste( A,"adjusted" ) )
g2
ggsave( paste0( A,".jpg" )
,g2
,height=5
,width=8
,dpi=300
)
}
# I get the error: "Error in 100*x : non-numeric argument to binary
operator".
I need some way to convert the string representation of the variable, 'A',
back to a column name representation and, presumably, use aes() instead of
aes_string(). Any further thoughts about this?
Philip
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.