Multiple plots and postscripts using split function

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
fd
Reply | Threaded
Open this post in threaded view
|

Multiple plots and postscripts using split function

fd
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

David Carlson
This is one of those times when you would do better to just use a loop. It will be easier to debug and to see what is going on. Replace the sapply() call with

for (i in 1:length(ind)) {
        postscript(names(ind[i]))
        par(mar=c(6,8,6,5), cex=0.8)    
    plot(ind[[i]][,c('YEAR','VALUE')],
                type='b',
                main = ind[[i]][1, "NAME"],
                . . . other commands . . . )
        dev.off()
}

-------------------------------------
David L Carlson
Department of Anthropology
Texas A&M University
College Station, TX 77840-4352



-----Original Message-----
From: [hidden email] [mailto:[hidden email]] On Behalf Of fd
Sent: Thursday, July 31, 2014 9:37 AM
To: [hidden email]
Subject: [R] Multiple plots and postscripts using split function

Hi,

I'm relatively new to R and I would like to do the following:

I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and would like
to do several xy plots with the year on the x-axis and the data values
(measurements) on the y-axis and after that export the different plots to
postcript.

My .csv file looks something like this (only an example):

NAME ID YEAR VALUE
ADAMS 885 1988 -2
ADAMS 885 1989 0
BAHIA DEL DIABLO 2665 1999 4
BAHIA DEL DIABLO 2665 2000 8
BAHIA DEL DIABLO 2665 2001 19
BAHIA DEL DIABLO 2665 2002 13
BAHIA DEL DIABLO 2665 2003 13
BARTLEY 893 1983 0
BARTLEY 893 1984 -1
BARTLEY 893 1985 0
BARTLEY 893 1988 2
BARTLEY 893 1989 -1
CANADA 877 1972 -1

I have split the different items into groups and I'd like the plots to have
the title of NAME but the filename of the postscript to be exported should
have the ID as filename.

My code so far:

#Set Working Directory:
setwd("/Users/Desktop/FV")
# Read CSV
dat <- read.csv("FV.csv", sep=";", header=TRUE)
# Split Data
ind <- split(x = dat,f = dat[,'ID'])
nam <- names(ind)

sapply(nam, function(x) {
        postscript(x)
        par(mar=c(6,8,6,5), cex=0.8)     
    plot(ind[[x]][,c('YEAR','VALUE')],
        type='b',
        main = x,
        xlab="Time [Years]",
        ylab="Front variation")      
        axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-0.3)
    axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
tcl=-0.3)
   
        dev.off()
})

This results in plots with the title and filename of the resulting
postscript being the same. Is there a way to get the plot title out of the
NAME column and the filename out of the ID?

Additionally I'd only like to plot graphs for items with more than 3 data
values. Is this possible to incorporate in the split command?

Another point is that some items have gaps in the time series where no
measurements were taken (in my example: BARTLEY from 1983 to 1985 and 1988
to 1989). I would like to plot using type= 'b' so that the points are
connected with lines, but when doing that, the values between 1985 and 1988
are automatically connected which I don't want. I'd like the plot to start
again at the value where the gap ends (in my example from 1988 onwards). Is
there a solution for this?

Any help is kindly appreciated! Thanks for your help.

Kind regards,
fd



--
View this message in context: http://r.789695.n4.nabble.com/Multiple-plots-and-postscripts-using-split-function-tp4694850.html
Sent from the R help mailing list archive at Nabble.com.

______________________________________________
[hidden email] mailing list
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.
______________________________________________
[hidden email] mailing list
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.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

Don McKenzie-2
While you’re at it, assign length(ind) to a variable before starting the loop. Otherwise length() is called at each iteration.  e.g.,

ind.length <- length(ind)
for (i in 1:ind.length)  {

etc.

On Jul 31, 2014, at 10:57 AM, David L Carlson <[hidden email]> wrote:

> This is one of those times when you would do better to just use a loop. It will be easier to debug and to see what is going on. Replace the sapply() call with
>
> for (i in 1:length(ind)) {
> postscript(names(ind[i]))
> par(mar=c(6,8,6,5), cex=0.8)    
>   plot(ind[[i]][,c('YEAR','VALUE')],
> type='b',
> main = ind[[i]][1, "NAME"],
> . . . other commands . . . )
> dev.off()
> }
>
> -------------------------------------
> David L Carlson
> Department of Anthropology
> Texas A&M University
> College Station, TX 77840-4352
>
>
>
> -----Original Message-----
> From: [hidden email] [mailto:[hidden email]] On Behalf Of fd
> Sent: Thursday, July 31, 2014 9:37 AM
> To: [hidden email]
> Subject: [R] Multiple plots and postscripts using split function
>
> Hi,
>
> I'm relatively new to R and I would like to do the following:
>
> I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and would like
> to do several xy plots with the year on the x-axis and the data values
> (measurements) on the y-axis and after that export the different plots to
> postcript.
>
> My .csv file looks something like this (only an example):
>
> NAME ID YEAR VALUE
> ADAMS 885 1988 -2
> ADAMS 885 1989 0
> BAHIA DEL DIABLO 2665 1999 4
> BAHIA DEL DIABLO 2665 2000 8
> BAHIA DEL DIABLO 2665 2001 19
> BAHIA DEL DIABLO 2665 2002 13
> BAHIA DEL DIABLO 2665 2003 13
> BARTLEY 893 1983 0
> BARTLEY 893 1984 -1
> BARTLEY 893 1985 0
> BARTLEY 893 1988 2
> BARTLEY 893 1989 -1
> CANADA 877 1972 -1
>
> I have split the different items into groups and I'd like the plots to have
> the title of NAME but the filename of the postscript to be exported should
> have the ID as filename.
>
> My code so far:
>
> #Set Working Directory:
> setwd("/Users/Desktop/FV")
> # Read CSV
> dat <- read.csv("FV.csv", sep=";", header=TRUE)
> # Split Data
> ind <- split(x = dat,f = dat[,'ID'])
> nam <- names(ind)
>
> sapply(nam, function(x) {
> postscript(x)
> par(mar=c(6,8,6,5), cex=0.8)    
>     plot(ind[[x]][,c('YEAR','VALUE')],
> type='b',
> main = x,
> xlab="Time [Years]",
> ylab="Front variation")      
> axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-0.3)
>     axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
> tcl=-0.3)
>    
> dev.off()
> })
>
> This results in plots with the title and filename of the resulting
> postscript being the same. Is there a way to get the plot title out of the
> NAME column and the filename out of the ID?
>
> Additionally I'd only like to plot graphs for items with more than 3 data
> values. Is this possible to incorporate in the split command?
>
> Another point is that some items have gaps in the time series where no
> measurements were taken (in my example: BARTLEY from 1983 to 1985 and 1988
> to 1989). I would like to plot using type= 'b' so that the points are
> connected with lines, but when doing that, the values between 1985 and 1988
> are automatically connected which I don't want. I'd like the plot to start
> again at the value where the gap ends (in my example from 1988 onwards). Is
> there a solution for this?
>
> Any help is kindly appreciated! Thanks for your help.
>
> Kind regards,
> fd
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Multiple-plots-and-postscripts-using-split-function-tp4694850.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> [hidden email] mailing list
> 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.
> ______________________________________________
> [hidden email] mailing list
> 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.
Don McKenzie
Research Ecologist
Pacific Wildland Fire Sciences Lab
US Forest Service

Affiliate Professor
School of Environmental and Forest Sciences
University of Washington
[hidden email]





        [[alternative HTML version deleted]]


______________________________________________
[hidden email] mailing list
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.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

Jeff Newmiller
The range vector is evaluated at the start of the loop, so it is only evaluated once. ind.length would be an unnecessary extra variable.
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<[hidden email]>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
---------------------------------------------------------------------------
Sent from my phone. Please excuse my brevity.

On July 31, 2014 11:09:59 AM PDT, Don McKenzie <[hidden email]> wrote:

>While you�re at it, assign length(ind) to a variable before starting
>the loop. Otherwise length() is called at each iteration.  e.g.,
>
>ind.length <- length(ind)
>for (i in 1:ind.length)  {
>
>etc.
>
>On Jul 31, 2014, at 10:57 AM, David L Carlson <[hidden email]>
>wrote:
>
>> This is one of those times when you would do better to just use a
>loop. It will be easier to debug and to see what is going on. Replace
>the sapply() call with
>>
>> for (i in 1:length(ind)) {
>> postscript(names(ind[i]))
>> par(mar=c(6,8,6,5), cex=0.8)    
>>   plot(ind[[i]][,c('YEAR','VALUE')],
>> type='b',
>> main = ind[[i]][1, "NAME"],
>> . . . other commands . . . )
>> dev.off()
>> }
>>
>> -------------------------------------
>> David L Carlson
>> Department of Anthropology
>> Texas A&M University
>> College Station, TX 77840-4352
>>
>>
>>
>> -----Original Message-----
>> From: [hidden email]
>[mailto:[hidden email]] On Behalf Of fd
>> Sent: Thursday, July 31, 2014 9:37 AM
>> To: [hidden email]
>> Subject: [R] Multiple plots and postscripts using split function
>>
>> Hi,
>>
>> I'm relatively new to R and I would like to do the following:
>>
>> I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and
>would like
>> to do several xy plots with the year on the x-axis and the data
>values
>> (measurements) on the y-axis and after that export the different
>plots to
>> postcript.
>>
>> My .csv file looks something like this (only an example):
>>
>> NAME ID YEAR VALUE
>> ADAMS 885 1988 -2
>> ADAMS 885 1989 0
>> BAHIA DEL DIABLO 2665 1999 4
>> BAHIA DEL DIABLO 2665 2000 8
>> BAHIA DEL DIABLO 2665 2001 19
>> BAHIA DEL DIABLO 2665 2002 13
>> BAHIA DEL DIABLO 2665 2003 13
>> BARTLEY 893 1983 0
>> BARTLEY 893 1984 -1
>> BARTLEY 893 1985 0
>> BARTLEY 893 1988 2
>> BARTLEY 893 1989 -1
>> CANADA 877 1972 -1
>>
>> I have split the different items into groups and I'd like the plots
>to have
>> the title of NAME but the filename of the postscript to be exported
>should
>> have the ID as filename.
>>
>> My code so far:
>>
>> #Set Working Directory:
>> setwd("/Users/Desktop/FV")
>> # Read CSV
>> dat <- read.csv("FV.csv", sep=";", header=TRUE)
>> # Split Data
>> ind <- split(x = dat,f = dat[,'ID'])
>> nam <- names(ind)
>>
>> sapply(nam, function(x) {
>> postscript(x)
>> par(mar=c(6,8,6,5), cex=0.8)    
>>     plot(ind[[x]][,c('YEAR','VALUE')],
>> type='b',
>> main = x,
>> xlab="Time [Years]",
>> ylab="Front variation")      
>> axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-0.3)
>>     axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
>> tcl=-0.3)
>>    
>> dev.off()
>> })
>>
>> This results in plots with the title and filename of the resulting
>> postscript being the same. Is there a way to get the plot title out
>of the
>> NAME column and the filename out of the ID?
>>
>> Additionally I'd only like to plot graphs for items with more than 3
>data
>> values. Is this possible to incorporate in the split command?
>>
>> Another point is that some items have gaps in the time series where
>no
>> measurements were taken (in my example: BARTLEY from 1983 to 1985 and
>1988
>> to 1989). I would like to plot using type= 'b' so that the points are
>> connected with lines, but when doing that, the values between 1985
>and 1988
>> are automatically connected which I don't want. I'd like the plot to
>start
>> again at the value where the gap ends (in my example from 1988
>onwards). Is
>> there a solution for this?
>>
>> Any help is kindly appreciated! Thanks for your help.
>>
>> Kind regards,
>> fd
>>
>>
>>
>> --
>> View this message in context:
>http://r.789695.n4.nabble.com/Multiple-plots-and-postscripts-using-split-function-tp4694850.html
>> Sent from the R help mailing list archive at Nabble.com.
>>
>> ______________________________________________
>> [hidden email] mailing list
>> 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.
>> ______________________________________________
>> [hidden email] mailing list
>> 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.
>
>Don McKenzie
>Research Ecologist
>Pacific Wildland Fire Sciences Lab
>US Forest Service
>
>Affiliate Professor
>School of Environmental and Forest Sciences
>University of Washington
>[hidden email]
>
>
>
>
>
> [[alternative HTML version deleted]]
>
>
>
>------------------------------------------------------------------------
>
>______________________________________________
>[hidden email] mailing list
>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.

______________________________________________
[hidden email] mailing list
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.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

William Dunlap
Even better is to replace
    for(i in 1:length(something)) {}
with
    for(i in seq_along(something)) {}
The former gives you 2 iterations, the 2nd probably causing an error,
when length(something) is 0.  The latter always gives one iteration
per element of 'something'.


Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Thu, Jul 31, 2014 at 11:56 AM, Jeff Newmiller
<[hidden email]> wrote:

> The range vector is evaluated at the start of the loop, so it is only evaluated once. ind.length would be an unnecessary extra variable.
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<[hidden email]>        Basics: ##.#.       ##.#.  Live Go...
>                                       Live:   OO#.. Dead: OO#..  Playing
> Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
>
> On July 31, 2014 11:09:59 AM PDT, Don McKenzie <[hidden email]> wrote:
>>While you�re at it, assign length(ind) to a variable before starting
>>the loop. Otherwise length() is called at each iteration.  e.g.,
>>
>>ind.length <- length(ind)
>>for (i in 1:ind.length)  {
>>
>>etc.
>>
>>On Jul 31, 2014, at 10:57 AM, David L Carlson <[hidden email]>
>>wrote:
>>
>>> This is one of those times when you would do better to just use a
>>loop. It will be easier to debug and to see what is going on. Replace
>>the sapply() call with
>>>
>>> for (i in 1:length(ind)) {
>>>      postscript(names(ind[i]))
>>>      par(mar=c(6,8,6,5), cex=0.8)
>>>      plot(ind[[i]][,c('YEAR','VALUE')],
>>>              type='b',
>>>              main = ind[[i]][1, "NAME"],
>>>              . . . other commands . . . )
>>>      dev.off()
>>> }
>>>
>>> -------------------------------------
>>> David L Carlson
>>> Department of Anthropology
>>> Texas A&M University
>>> College Station, TX 77840-4352
>>>
>>>
>>>
>>> -----Original Message-----
>>> From: [hidden email]
>>[mailto:[hidden email]] On Behalf Of fd
>>> Sent: Thursday, July 31, 2014 9:37 AM
>>> To: [hidden email]
>>> Subject: [R] Multiple plots and postscripts using split function
>>>
>>> Hi,
>>>
>>> I'm relatively new to R and I would like to do the following:
>>>
>>> I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and
>>would like
>>> to do several xy plots with the year on the x-axis and the data
>>values
>>> (measurements) on the y-axis and after that export the different
>>plots to
>>> postcript.
>>>
>>> My .csv file looks something like this (only an example):
>>>
>>> NAME                         ID              YEAR    VALUE
>>> ADAMS                                885             1988            -2
>>> ADAMS                                885             1989            0
>>> BAHIA DEL DIABLO             2665            1999            4
>>> BAHIA DEL DIABLO             2665            2000            8
>>> BAHIA DEL DIABLO             2665            2001            19
>>> BAHIA DEL DIABLO             2665            2002            13
>>> BAHIA DEL DIABLO             2665            2003            13
>>> BARTLEY                              893             1983            0
>>> BARTLEY                              893             1984            -1
>>> BARTLEY                              893             1985            0
>>> BARTLEY                              893             1988            2
>>> BARTLEY                              893             1989            -1
>>> CANADA                               877             1972            -1
>>>
>>> I have split the different items into groups and I'd like the plots
>>to have
>>> the title of NAME but the filename of the postscript to be exported
>>should
>>> have the ID as filename.
>>>
>>> My code so far:
>>>
>>> #Set Working Directory:
>>> setwd("/Users/Desktop/FV")
>>> # Read CSV
>>> dat <- read.csv("FV.csv", sep=";", header=TRUE)
>>> # Split Data
>>> ind <- split(x = dat,f = dat[,'ID'])
>>> nam <- names(ind)
>>>
>>> sapply(nam, function(x) {
>>>      postscript(x)
>>>      par(mar=c(6,8,6,5), cex=0.8)
>>>      plot(ind[[x]][,c('YEAR','VALUE')],
>>>      type='b',
>>>      main = x,
>>>      xlab="Time [Years]",
>>>      ylab="Front variation")
>>>      axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-0.3)
>>>      axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
>>> tcl=-0.3)
>>>
>>>      dev.off()
>>> })
>>>
>>> This results in plots with the title and filename of the resulting
>>> postscript being the same. Is there a way to get the plot title out
>>of the
>>> NAME column and the filename out of the ID?
>>>
>>> Additionally I'd only like to plot graphs for items with more than 3
>>data
>>> values. Is this possible to incorporate in the split command?
>>>
>>> Another point is that some items have gaps in the time series where
>>no
>>> measurements were taken (in my example: BARTLEY from 1983 to 1985 and
>>1988
>>> to 1989). I would like to plot using type= 'b' so that the points are
>>> connected with lines, but when doing that, the values between 1985
>>and 1988
>>> are automatically connected which I don't want. I'd like the plot to
>>start
>>> again at the value where the gap ends (in my example from 1988
>>onwards). Is
>>> there a solution for this?
>>>
>>> Any help is kindly appreciated! Thanks for your help.
>>>
>>> Kind regards,
>>> fd
>>>
>>>
>>>
>>> --
>>> View this message in context:
>>http://r.789695.n4.nabble.com/Multiple-plots-and-postscripts-using-split-function-tp4694850.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> [hidden email] mailing list
>>> 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.
>>> ______________________________________________
>>> [hidden email] mailing list
>>> 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.
>>
>>Don McKenzie
>>Research Ecologist
>>Pacific Wildland Fire Sciences Lab
>>US Forest Service
>>
>>Affiliate Professor
>>School of Environmental and Forest Sciences
>>University of Washington
>>[hidden email]
>>
>>
>>
>>
>>
>>       [[alternative HTML version deleted]]
>>
>>
>>
>>------------------------------------------------------------------------
>>
>>______________________________________________
>>[hidden email] mailing list
>>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.
>
> ______________________________________________
> [hidden email] mailing list
> 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.

______________________________________________
[hidden email] mailing list
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.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

PIKAL Petr
In reply to this post by fd
Hi

Maybe others will disagree but I find for cycle for this type of task better than sapply.

for(i in 1:length(ind)) {

if (there are more than 3 date items*) {

postscript(ind[i])
do all plotting
dev.off()
}}

If you want to plot with gaps you need to add all relevant YEARs for x axis with missing value in y before plotting. Then R plots it automatically with gap.

x<-1:10
y<-rnorm(10)
y[5:6]<-NA
plot(x,y, type="b")

I would suggest to use merge for this task.

table(dat$ID)
gives you number of unique values for each ID and you can use it for discarding this ID from the list.

Regards
Petr


> -----Original Message-----
> From: [hidden email] [mailto:r-help-bounces@r-
> project.org] On Behalf Of fd
> Sent: Thursday, July 31, 2014 4:37 PM
> To: [hidden email]
> Subject: [R] Multiple plots and postscripts using split function
>
> Hi,
>
> I'm relatively new to R and I would like to do the following:
>
> I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and would
> like to do several xy plots with the year on the x-axis and the data
> values
> (measurements) on the y-axis and after that export the different plots
> to postcript.
>
> My .csv file looks something like this (only an example):
>
> NAME                          ID              YEAR    VALUE
> ADAMS                         885             1988            -2
> ADAMS                         885             1989            0
> BAHIA DEL DIABLO              2665            1999            4
> BAHIA DEL DIABLO              2665            2000            8
> BAHIA DEL DIABLO              2665            2001            19
> BAHIA DEL DIABLO              2665            2002            13
> BAHIA DEL DIABLO              2665            2003            13
> BARTLEY                               893             1983            0
> BARTLEY                               893             1984            -1
> BARTLEY                               893             1985            0
> BARTLEY                               893             1988            2
> BARTLEY                               893             1989            -1
> CANADA                                877             1972            -1
>
> I have split the different items into groups and I'd like the plots to
> have the title of NAME but the filename of the postscript to be
> exported should have the ID as filename.
>
> My code so far:
>
> #Set Working Directory:
> setwd("/Users/Desktop/FV")
> # Read CSV
> dat <- read.csv("FV.csv", sep=";", header=TRUE) # Split Data ind <-
> split(x = dat,f = dat[,'ID']) nam <- names(ind)
>
> sapply(nam, function(x) {
>       postscript(x)
>       par(mar=c(6,8,6,5), cex=0.8)
>       plot(ind[[x]][,c('YEAR','VALUE')],
>       type='b',
>       main = x,
>       xlab="Time [Years]",
>       ylab="Front variation")
>       axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-
> 0.3)
>       axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
> tcl=-0.3)
>
>       dev.off()
> })
>
> This results in plots with the title and filename of the resulting
> postscript being the same. Is there a way to get the plot title out of
> the NAME column and the filename out of the ID?
>
> Additionally I'd only like to plot graphs for items with more than 3
> data values. Is this possible to incorporate in the split command?
>
> Another point is that some items have gaps in the time series where no
> measurements were taken (in my example: BARTLEY from 1983 to 1985 and
> 1988 to 1989). I would like to plot using type= 'b' so that the points
> are connected with lines, but when doing that, the values between 1985
> and 1988 are automatically connected which I don't want. I'd like the
> plot to start again at the value where the gap ends (in my example from
> 1988 onwards). Is there a solution for this?
>
> Any help is kindly appreciated! Thanks for your help.
>
> Kind regards,
> fd
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Multiple-
> plots-and-postscripts-using-split-function-tp4694850.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> [hidden email] mailing list
> 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.

________________________________
Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a jsou určeny pouze jeho adresátům.
Jestliže jste obdržel(a) tento e-mail omylem, informujte laskavě neprodleně jeho odesílatele. Obsah tohoto emailu i s přílohami a jeho kopie vymažte ze svého systému.
Nejste-li zamýšleným adresátem tohoto emailu, nejste oprávněni tento email jakkoliv užívat, rozšiřovat, kopírovat či zveřejňovat.
Odesílatel e-mailu neodpovídá za eventuální škodu způsobenou modifikacemi či zpožděním přenosu e-mailu.

V případě, že je tento e-mail součástí obchodního jednání:
- vyhrazuje si odesílatel právo ukončit kdykoliv jednání o uzavření smlouvy, a to z jakéhokoliv důvodu i bez uvedení důvodu.
- a obsahuje-li nabídku, je adresát oprávněn nabídku bezodkladně přijmout; Odesílatel tohoto e-mailu (nabídky) vylučuje přijetí nabídky ze strany příjemce s dodatkem či odchylkou.
- trvá odesílatel na tom, že příslušná smlouva je uzavřena teprve výslovným dosažením shody na všech jejích náležitostech.
- odesílatel tohoto emailu informuje, že není oprávněn uzavírat za společnost žádné smlouvy s výjimkou případů, kdy k tomu byl písemně zmocněn nebo písemně pověřen a takové pověření nebo plná moc byly adresátovi tohoto emailu případně osobě, kterou adresát zastupuje, předloženy nebo jejich existence je adresátovi či osobě jím zastoupené známá.

This e-mail and any documents attached to it may be confidential and are intended only for its intended recipients.
If you received this e-mail by mistake, please immediately inform its sender. Delete the contents of this e-mail with all attachments and its copies from your system.
If you are not the intended recipient of this e-mail, you are not authorized to use, disseminate, copy or disclose this e-mail in any manner.
The sender of this e-mail shall not be liable for any possible damage caused by modifications of the e-mail or by delay with transfer of the email.

In case that this e-mail forms part of business dealings:
- the sender reserves the right to end negotiations about entering into a contract in any time, for any reason, and without stating any reasoning.
- if the e-mail contains an offer, the recipient is entitled to immediately accept such offer; The sender of this e-mail (offer) excludes any acceptance of the offer on the part of the recipient containing any amendment or variation.
- the sender insists on that the respective contract is concluded only upon an express mutual agreement on all its aspects.
- the sender of this e-mail informs that he/she is not authorized to enter into any contracts on behalf of the company except for cases in which he/she is expressly authorized to do so in writing, and such authorization or power of attorney is submitted to the recipient or the person represented by the recipient, or the existence of such authorization is known to the recipient of the person represented by the recipient.
______________________________________________
[hidden email] mailing list
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.
fd
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

fd
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

Jim Lemon
On Sat, 2 Aug 2014 05:22:26 AM Florian Denzinger wrote:
> Thank you everyone for your help so far.
>
> I am still working on the problem to get a merged new dataframe
which fills
> in new rows with NA values for each year that is missing for plotting
with
> gaps ( in the example the item BARTLEY: years 1984 to 1987 should
be filled
> with a row containing NA values). Could someone maybe help me
with this?

Hi Florian,
This is pretty messy, but it might do what you want:
fddf<-read.table(text="NAME,ID,YEAR,VALUE
ADAMS,885,1988,-2
ADAMS,885,1989,0
BAHIA DEL DIABLO,2665,1999,4
BAHIA DEL DIABLO,2665,2000,8
BAHIA DEL DIABLO,2665,2001,19
BAHIA DEL DIABLO,2665,2002,13
BAHIA DEL DIABLO,2665,2003,13
BARTLEY,893,1983,0
BARTLEY,893,1988,2
BARTLEY,893,1989,-1
CANADA,877,1972,-1
CLARK CPI,894,1973,-3",sep=",",header=TRUE)

fillgaps<-function(x,rangevar,fillvar,fillval=NA) {
 dimx<-dim(x)
 if(dimx[1] > 1) {
  newxrangevar<-min(x[[rangevar]]):max(x[[rangevar]])
  nrows<-length(newxrangevar)
  newx<-list()
  rangevarno<-which(names(x) %in% rangevar)
  fillvarno<-which(names(x) %in% fillvar)
  cat(rangevarno,fillvarno,"\n")
  for(xcol in 1:dimx[2]) {
   if(xcol == rangevarno) {
    newx[[xcol]]<-newxrangevar
   }
   else {
    if(xcol == fillvarno) {
     newx[[xcol]]<-rep(NA,nrows)
     newx[[xcol]][which(newxrangevar %in% x[[rangevar]])]<-x[[fillvar]]
    }
    else {
     if(is.numeric(x[1,xcol]))
      newx[[xcol]]<-rep(x[1,xcol],length.out=nrows)
     else
      newx[[xcol]]<-rep(as.character(x[1,xcol]),nrows)
    }
   }
  }
  newx<-as.data.frame(newx)
  names(newx)<-names(x)
 }
 else newx<-x
 return(newx)
}

fddfn<-levels(fddf$NAME)
for(fdvar in 1:length(fddfnames)) {
 if(fdvar == 1)
  newx<-fillgaps(fddf[fddf$NAME == fddfn[fdvar],],"YEAR","VALUE")
 else
  newx<-rbind(newx,fillgaps(fddf[fddf$NAME ==
fddfn[fdvar],],"YEAR","VALUE"))
}

Jim

______________________________________________
[hidden email] mailing list
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.
Reply | Threaded
Open this post in threaded view
|

Re: Multiple plots and postscripts using split function

William Dunlap
In reply to this post by fd
Have you tried using the merge() function?  E.g.,

lapply(split(d, d$NAME), function(di)merge(all=TRUE, di,
data.frame(YEAR=seq(min(di$YEAR), max(di$YEAR), by=1))))
Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Fri, Aug 1, 2014 at 8:22 PM, Florian Denzinger
<[hidden email]> wrote:

> Thank you everyone for your help so far.
>
> I am still working on the problem to get a merged new dataframe which fills in new rows with NA values for each year that is missing for plotting with gaps ( in the example the item BARTLEY: years 1984 to 1987 should be filled with a row containing NA values). Could someone maybe help me with this? Thank you.
>
>
>     NAME                                 ID             YEAR    VALUE
>     ADAMS                               885             1988          -2
>     ADAMS                               885             1989            0
>     BAHIA DEL DIABLO    2665    1999            4
>     BAHIA DEL DIABLO    2665    2000            8
>     BAHIA DEL DIABLO    2665    2001          19
>     BAHIA DEL DIABLO    2665    2002          13
>     BAHIA DEL DIABLO    2665    2003          13
>     BARTLEY                             893             1983            0
>     BARTLEY                             893             1988            2
>     BARTLEY                             893             1989           -1
>     CANADA                              877             1972           -1
>     CLARK CPI                   894             1973           -3
>
> Am 01.08.2014 um 11:27 schrieb PIKAL Petr <[hidden email]>:
>
>> Hi
>>
>> Maybe others will disagree but I find for cycle for this type of task better than sapply.
>>
>> for(i in 1:length(ind)) {
>>
>> if (there are more than 3 date items*) {
>>
>> postscript(ind[i])
>> do all plotting
>> dev.off()
>> }}
>>
>> If you want to plot with gaps you need to add all relevant YEARs for x axis with missing value in y before plotting. Then R plots it automatically with gap.
>>
>> x<-1:10
>> y<-rnorm(10)
>> y[5:6]<-NA
>> plot(x,y, type="b")
>>
>> I would suggest to use merge for this task.
>>
>> table(dat$ID)
>> gives you number of unique values for each ID and you can use it for discarding this ID from the list.
>>
>> Regards
>> Petr
>>
>>
>>> -----Original Message-----
>>> From: [hidden email] [mailto:r-help-bounces@r-
>>> project.org] On Behalf Of fd
>>> Sent: Thursday, July 31, 2014 4:37 PM
>>> To: [hidden email]
>>> Subject: [R] Multiple plots and postscripts using split function
>>>
>>> Hi,
>>>
>>> I'm relatively new to R and I would like to do the following:
>>>
>>> I have a .csv file with four columns (NAME, ID, YEAR, VALUE) and would
>>> like to do several xy plots with the year on the x-axis and the data
>>> values
>>> (measurements) on the y-axis and after that export the different plots
>>> to postcript.
>>>
>>> My .csv file looks something like this (only an example):
>>>
>>> NAME                          ID              YEAR    VALUE
>>> ADAMS                         885             1988            -2
>>> ADAMS                         885             1989            0
>>> BAHIA DEL DIABLO              2665            1999            4
>>> BAHIA DEL DIABLO              2665            2000            8
>>> BAHIA DEL DIABLO              2665            2001            19
>>> BAHIA DEL DIABLO              2665            2002            13
>>> BAHIA DEL DIABLO              2665            2003            13
>>> BARTLEY                               893             1983            0
>>> BARTLEY                               893             1984            -1
>>> BARTLEY                               893             1985            0
>>> BARTLEY                               893             1988            2
>>> BARTLEY                               893             1989            -1
>>> CANADA                                877             1972            -1
>>>
>>> I have split the different items into groups and I'd like the plots to
>>> have the title of NAME but the filename of the postscript to be
>>> exported should have the ID as filename.
>>>
>>> My code so far:
>>>
>>> #Set Working Directory:
>>> setwd("/Users/Desktop/FV")
>>> # Read CSV
>>> dat <- read.csv("FV.csv", sep=";", header=TRUE) # Split Data ind <-
>>> split(x = dat,f = dat[,'ID']) nam <- names(ind)
>>>
>>> sapply(nam, function(x) {
>>>      postscript(x)
>>>      par(mar=c(6,8,6,5), cex=0.8)
>>>      plot(ind[[x]][,c('YEAR','VALUE')],
>>>      type='b',
>>>      main = x,
>>>      xlab="Time [Years]",
>>>      ylab="Front variation")
>>>      axis(1, at = seq(1800,2100,5), cex.axis=1, labels=FALSE, tcl=-
>>> 0.3)
>>>      axis(2, at = seq(-100000,100000,500), cex.axis=1, labels=FALSE,
>>> tcl=-0.3)
>>>
>>>      dev.off()
>>> })
>>>
>>> This results in plots with the title and filename of the resulting
>>> postscript being the same. Is there a way to get the plot title out of
>>> the NAME column and the filename out of the ID?
>>>
>>> Additionally I'd only like to plot graphs for items with more than 3
>>> data values. Is this possible to incorporate in the split command?
>>>
>>> Another point is that some items have gaps in the time series where no
>>> measurements were taken (in my example: BARTLEY from 1983 to 1985 and
>>> 1988 to 1989). I would like to plot using type= 'b' so that the points
>>> are connected with lines, but when doing that, the values between 1985
>>> and 1988 are automatically connected which I don't want. I'd like the
>>> plot to start again at the value where the gap ends (in my example from
>>> 1988 onwards). Is there a solution for this?
>>>
>>> Any help is kindly appreciated! Thanks for your help.
>>>
>>> Kind regards,
>>> fd
>>>
>>>
>>>
>>> --
>>> View this message in context: http://r.789695.n4.nabble.com/Multiple-
>>> plots-and-postscripts-using-split-function-tp4694850.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> [hidden email] mailing list
>>> 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.
>>
>> ________________________________
>> Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a jsou určeny pouze jeho adresátům.
>> Jestliže jste obdržel(a) tento e-mail omylem, informujte laskavě neprodleně jeho odesílatele. Obsah tohoto emailu i s přílohami a jeho kopie vymažte ze svého systému.
>> Nejste-li zamýšleným adresátem tohoto emailu, nejste oprávněni tento email jakkoliv užívat, rozšiřovat, kopírovat či zveřejňovat.
>> Odesílatel e-mailu neodpovídá za eventuální škodu způsobenou modifikacemi či zpožděním přenosu e-mailu.
>>
>> V případě, že je tento e-mail součástí obchodního jednání:
>> - vyhrazuje si odesílatel právo ukončit kdykoliv jednání o uzavření smlouvy, a to z jakéhokoliv důvodu i bez uvedení důvodu.
>> - a obsahuje-li nabídku, je adresát oprávněn nabídku bezodkladně přijmout; Odesílatel tohoto e-mailu (nabídky) vylučuje přijetí nabídky ze strany příjemce s dodatkem či odchylkou.
>> - trvá odesílatel na tom, že příslušná smlouva je uzavřena teprve výslovným dosažením shody na všech jejích náležitostech.
>> - odesílatel tohoto emailu informuje, že není oprávněn uzavírat za společnost žádné smlouvy s výjimkou případů, kdy k tomu byl písemně zmocněn nebo písemně pověřen a takové pověření nebo plná moc byly adresátovi tohoto emailu případně osobě, kterou adresát zastupuje, předloženy nebo jejich existence je adresátovi či osobě jím zastoupené známá.
>>
>> This e-mail and any documents attached to it may be confidential and are intended only for its intended recipients.
>> If you received this e-mail by mistake, please immediately inform its sender. Delete the contents of this e-mail with all attachments and its copies from your system.
>> If you are not the intended recipient of this e-mail, you are not authorized to use, disseminate, copy or disclose this e-mail in any manner.
>> The sender of this e-mail shall not be liable for any possible damage caused by modifications of the e-mail or by delay with transfer of the email.
>>
>> In case that this e-mail forms part of business dealings:
>> - the sender reserves the right to end negotiations about entering into a contract in any time, for any reason, and without stating any reasoning.
>> - if the e-mail contains an offer, the recipient is entitled to immediately accept such offer; The sender of this e-mail (offer) excludes any acceptance of the offer on the part of the recipient containing any amendment or variation.
>> - the sender insists on that the respective contract is concluded only upon an express mutual agreement on all its aspects.
>> - the sender of this e-mail informs that he/she is not authorized to enter into any contracts on behalf of the company except for cases in which he/she is expressly authorized to do so in writing, and such authorization or power of attorney is submitted to the recipient or the person represented by the recipient, or the existence of such authorization is known to the recipient of the person represented by the recipient.
>
> ______________________________________________
> [hidden email] mailing list
> 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.

______________________________________________
[hidden email] mailing list
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.