OK, I think I got this:

For example every 3rd element would be:
sydf$monthday[seq(1, length(sydf$monthday), 3)]

Thanks,
Steven

-----Original Message-----
From: nst...@gmail.com <nst...@gmail.com> 
Sent: Tuesday, July 16, 2019 9:39 AM
To: 'Jim Lemon' <drjimle...@gmail.com>
Cc: 'r-help mailing list' <r-help@r-project.org>
Subject: RE: [R] Plotting in R

Thanks Jim,

Yes, I only want to show the month and day as labels, because on my chart I am 
actually showing 2 line charts, one from the previous year, and one from this 
year, to compare them, and the month and day are matching for them, but the 
year would be different, so it makes sense to show only month and day on the x 
axis.
So it looks like I got the solution already for that part, the new challenge is 
that there were too many labels and overlapping on each other.
What is the best way to evenly sample values from a long list of string values?
So let's say my data was this overly simplified:
sydf<-read.table(text="year monthday rate
 1993 05-01 0.608
 1994 06-01 0.622
 1996 07-01 0.623
 1998 08-01 0.647
 2000 09-01 0.646
 2002 10-01 0.625
 2004 11-01 0.628
 2006 12-01 0.685
 2008 01-01 0.679
 2010 02-01 0.595
 2012 03-01 0.567
 2014 04-01 0.599
 2016 05-01 0.642
 2018 06-01 0.685",
                 header=TRUE,
                 stringsAsFactors=FALSE)

Then my x axis would be based on the values of sydf$monthday - In my case there 
are lots of values. How can I subset this to have only every n-th value? I 
guess this must be some common operation in R.
So if I have 200 values, and I only want to show 20 of them as labels, I would 
calculate n = 200/20 = 10 and I want to get every 10th value in the list 
sydf$monthday. But the list has strings, so I cannot use "by =".

Thank you,
Steven

-----Original Message-----
From: Jim Lemon <drjimle...@gmail.com>
Sent: Friday, July 12, 2019 6:41 PM
To: nst...@gmail.com
Cc: r-help mailing list <r-help@r-project.org>
Subject: Re: [R] Plotting in R

Oh, sorry, I think I see what you have tried to do. You want yearly ticks but 
month-day labels. These won't mean much unless you also have the year. If you 
ask for a date with just the year, as.Date will give you a date in the middle 
of that year:

as.Date("2002","%Y")
[1] "2002-07-13"

So making the labels these mid-year dates as character strings might do what 
you want:

yrlabels<-as.character(yrticks)

Jim

On Sat, Jul 13, 2019 at 8:33 AM Jim Lemon <drjimle...@gmail.com> wrote:
>
> Hi Steven,
> year1 is a number (e.g. 1993), monthday (e.g. 05-01) is not.
>
> Jim
>
> On Fri, Jul 12, 2019 at 10:56 PM <nst...@gmail.com> wrote:
> >
> > Thanks Jim.
> >
> > I am trying to apply this to my version with plot_ly, and couldn't make it 
> > to work.
> > The sydf$year1 field is numeric, so the min() and max() works, but when I 
> > tried to use your formula for the sydf$monthday field I get an error:
> > yrticks <- 
> > as.Date(as.character(seq(min(sydf$monthday),max(sydf$monthday),by=2)),
> >                   "%Y")
> >
> > Error in seq.default(min(sydf$monthday), max(sydf$monthday), by = 2) :
> >   'from' must be a finite number
> > In addition: Warning message:
> > In seq.default(min(sydf$monthday), max(sydf$monthday), by = 2) :
> >   NAs introduced by coercion
> >
> > So I thought maybe you need to sample the tickvals not the ticktext and it 
> > would show the corresponding tick labels in the right palaces. Then I tried 
> > the way you had like this:
> > sydf<-read.table(text="year1 monthday rate
> >  1993 05-01 0.608
> >  1994 06-01 0.622
> >  1996 07-01 0.623
> >  1998 08-01 0.647
> >  2000 09-01 0.646
> >  2002 10-01 0.625
> >  2004 11-01 0.628
> >  2006 12-01 0.685
> >  2008 01-01 0.679
> >  2010 02-01 0.595
> >  2012 03-01 0.567
> >  2014 04-01 0.599
> >  2016 05-01 0.642
> >  2018 06-01 0.685",
> >                  header=TRUE,
> >                  stringsAsFactors=FALSE)
> >
> > yrticks <- as.Date(as.character(seq(min(sydf$year1),max(sydf$year1),by=2)),
> >                   "%Y")
> >
> > library(plotly)
> > plot_ly(sydf,
> >         x = ~year1,
> >         y = ~rate,
> >         type = 'scatter', mode = 'lines') %>%
> >   layout(
> >     xaxis = list(
> >       ticktext = sydf$monthday,
> >       tickvals = sydf$yrticks,
> >       tickmode = "array",
> >       tickangle = 270
> >     ))
> >
> > But the chart didn't show any tick labels.
> > I guess I need to sample sydf$monthday, right? Because that's what I want 
> > to show as tick labels. But the problem is that monthday is string, and 
> > can't use a value for "by=", maybe I need to sample somehow by the index 
> > position.
> >
> > Thanks,
> > Steven
> >
> > -----Original Message-----
> > From: Jim Lemon <drjimle...@gmail.com>
> > Sent: Thursday, July 11, 2019 10:41 PM
> > To: nst...@gmail.com
> > Cc: r-help mailing list <r-help@r-project.org>
> > Subject: Re: [R] Plotting in R
> >
> > Hi Steven,
> > Neat solution. With a lot more values on the time axis, you will be better 
> > off with something like:
> >
> > yrticks<-as.Date(as.character(seq(min(sydf$year1),max(sydf$year1),by
> > =2)),
> >  "%Y")
> > axis(1,at=yrticks,labels=format(yrticks,"%Y"))
> >
> > You probably won't need staxlab for that.
> >
> > Jim
> >
> > On Fri, Jul 12, 2019 at 11:55 AM <nst...@gmail.com> wrote:
> > >
> > > Thanks Jim, that worked.
> > >
> > > > I expected that the axis labels would be crowded so I used the plotrix 
> > > > library to stagger the x-axis labels. Hope this solves your problem.
> > > I liked how that showed, not overlapping on each other. I wasn't aware of 
> > > the plotrix library.
> > >
> > > In my code I was using plot_ly for visualization, because it looked nicer 
> > > compared to the simple plot() function, and I have the chart in a Shiny 
> > > dashboard (RMD file).
> > > I found in the meantime today some code example for plot_ly and using the 
> > > same data it looks like this:
> > > sydf<-read.table(text="year1 monthday rate
> > >  1993 05-01 0.608
> > >  1994 06-01 0.622
> > >  1996 07-01 0.623
> > >  1998 08-01 0.647
> > >  2000 09-01 0.646
> > >  2002 10-01 0.625
> > >  2004 11-01 0.628
> > >  2006 12-01 0.685
> > >  2008 01-01 0.679
> > >  2010 02-01 0.595
> > >  2012 03-01 0.567
> > >  2014 04-01 0.599
> > >  2016 05-01 0.642
> > >  2018 06-01 0.685",
> > >                  header=TRUE,
> > >                  stringsAsFactors=FALSE)
> > >
> > > library(plotly)
> > > plot_ly(sydf,
> > >         x = ~year1,
> > >         y = ~rate,
> > >         type = 'scatter', mode = 'lines') %>%
> > >   layout(
> > >     xaxis = list(
> > >       ticktext = sydf$monthday,
> > >       tickvals = sydf$year1,
> > >       tickmode = "array",
> > >       tickangle = 270
> > >     ))
> > >
> > > This is where I found about the parameters:
> > > https://plot.ly/r/tick-formatting/
> > >
> > > Now my other challenge is that with my data I have a lot more values on 
> > > the x axis, and they overlap even when turned vertically. I guess there 
> > > must be a way of taking a number of values evenly from the list of x axis 
> > > lables, and use that for the "ticktext" parameter.
> > > I thought it must be some variation of the seq(from, to, by= ). Can I use 
> > > that with a list of strings?
> > >
> > > Thanks,
> > > Steven
> > >
> > > -----Original Message-----
> > > From: Jim Lemon <drjimle...@gmail.com>
> > > Sent: Thursday, July 11, 2019 7:46 PM
> > > To: nst...@gmail.com; r-help mailing list <r-help@r-project.org>
> > > Subject: Re: [R] Plotting in R
> > >
> > > Hi Steven,
> > > It is pretty easy, but there are one or two things to watch for.
> > > First, don't use a hyphen in a field name unless you enclose it in 
> > > single quotes when extracting it. I've just removed the hyphen in 
> > > this
> > > example:
> > >
> > > sydf<-read.table(text="year1 monthday rate
> > >  1993 05-01 0.608
> > >  1994 06-01 0.622
> > >  1996 07-01 0.623
> > >  1998 08-01 0.647
> > >  2000 09-01 0.646
> > >  2002 10-01 0.625
> > >  2004 11-01 0.628
> > >  2006 12-01 0.685
> > >  2008 01-01 0.679
> > >  2010 02-01 0.595
> > >  2012 03-01 0.567
> > >  2014 04-01 0.599
> > >  2016 05-01 0.642
> > >  2018 06-01 0.685",
> > >  header=TRUE,
> > >  stringsAsFactors=FALSE)
> > > sydf$date<-as.Date(paste(sydf$year1,sydf$monthday),"%Y %m-%d")
> > > library(plotrix)
> > > par(mar=c(6,4,4,2))
> > > plot(sydf$date,sydf$rate,type="b",xaxt="n")
> > > staxlab(1,at=sydf$date,labels=sydf$monthday)
> > >
> > > Note that I have also added the stringsAsFactors argument to prevent 
> > > monthdate being read as a factor. I expected that the axis labels would 
> > > be crowded so I used the plotrix library to stagger the x-axis labels. 
> > > Hope this solves your problem.
> > >
> > > Jim
> > >
> > > On Fri, Jul 12, 2019 at 1:59 AM <nst...@gmail.com> wrote:
> > > >
> > > > Hi Jim,
> > > >
> > > > Thanks for your email.
> > > > My question was: how to change the x axis labels without changing the 
> > > > chart.
> > > > Or is that not possible?
> > > > Using your example, I added another column:
> > > > sydf<-read.table(text="year1 month-day rate
> > > >  1993 05-01 0.608
> > > >  1994 06-01 0.622
> > > >  1996 07-01 0.623
> > > >  1998 08-01 0.647
> > > >  2000 09-01 0.646
> > > >  2002 10-01 0.625
> > > >  2004 11-01 0.628
> > > >  2006 12-01 0.685
> > > >  2008 01-01 0.679
> > > >  2010 02-01 0.595
> > > >  2012 03-01 0.567
> > > >  2014 04-01 0.599
> > > >  2016 05-01 0.642
> > > >  2018 06-01 0.685",
> > > >                  header=TRUE)
> > > >
> > > > How can I show the column "month-day" as labels on the x axis, 
> > > > but still have the plot showing the chart as rate based on year?
> > > > I tried this:
> > > > plot(sydf$year,sydf$rate,type="b",
> > > >      xlab="month-day",ylab="Rate")
> > > >
> > > > but this only changes the title of the x axis to "month-day". I 
> > > > want the values on the x axis to show 05-01  06-01, etc.
> > > > Is that possible?
> > > >
> > > > Thanks,
> > > > Steven
> > > >
> > > > -----Original Message-----
> > > > From: R-help <r-help-boun...@r-project.org> On Behalf Of Jim 
> > > > Lemon
> > > > Sent: Sunday, July 7, 2019 2:59 AM
> > > > To: Steven Yen <st...@ntu.edu.tw>; r-help mailing list 
> > > > <r-help@r-project.org>
> > > > Subject: Re: [R] Plotting in R
> > > >
> > > > Hi Steven,
> > > > A basic plot can be displayed like this:
> > > >
> > > > sydf<-read.table(text="year rate
> > > >  1993 0.608
> > > >  1994 0.622
> > > >  1996 0.623
> > > >  1998 0.647
> > > >  2000 0.646
> > > >  2002 0.625
> > > >  2004 0.628
> > > >  2006 0.685
> > > >  2008 0.679
> > > >  2010 0.595
> > > >  2012 0.567
> > > >  2014 0.599
> > > >  2016 0.642
> > > >  2018 0.685",
> > > > header=TRUE)
> > > > plot(sydf$year,sydf$rate,type="b",
> > > > xlab="Year",ylab="Rate")
> > > >
> > > > When you add more years and rates to the data frame, the axes 
> > > > will change to include the years and rates outside the ones in 
> > > > your example. As some have noted, this is a very basic question.
> > > >
> > > > Jim
> > > >
> > > > On Sat, Jul 6, 2019 at 11:33 PM Steven Yen <st...@ntu.edu.tw> wrote:
> > > > >
> > > > > I have a data frame containing two variables: year and rate (shown 
> > > > > below).
> > > > > Which function can I use to plot rate (y-axis) against year (x-axis)?
> > > > > There will be more columns of rate later on.
> > > > > Thank you.
> > > > >
> > > > > year rate 1 1993 0.608 2 1994 0.622 3 1996 0.623 4 1998 0.647
> > > > > 5
> > > > > 2000
> > > > > 0.646 6 2002 0.625 7 2004 0.628 8 2006 0.685 9 2008 0.679 10
> > > > > 2010
> > > > > 0.595
> > > > > 11 2012 0.567 12 2014 0.599 13 2016 0.642 14 2018 0.685
> > > > >
> > > > >
> > > > > --
> > > > > st...@ntu.edu.tw (S.T. Yen)
> > > > >
> > > > >
> > > > >
> > > > > ---
> > > > > This email has been checked for viruses by Avast antivirus software.
> > > > > https://www.avast.com/antivirus
> > > > >
> > > > >         [[alternative HTML version deleted]]
> > > > >
> > > > > ______________________________________________
> > > > > 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.
> > > >
> > > > ______________________________________________
> > > > 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.
> > > >
> > >
> >

______________________________________________
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.

Reply via email to