-2

I have factor levels like "node002" "node004" "node006" "node016" "node017" "node018" which are being plotted against dates. I am trying to underlay a given factor level for a period using geom_rect. For the dates, I can do something like ymin=as.Date("8-Apr-2014", format="%d-%b-%Y").

Is it possible to I stipulate, say ymin in terms of the factor levels? If so, how would it be done?

Here is some more information to try to clarify the issue:

The data look like this:

17-Mar-2014 node004 node016 node018 node020 node025 node034 node041
15-Sep-2014 node002 node016 node061 node098
8-Sep-2014 node002 node016 node020 node061
1-Sep-2014 node002 node016 node020 node061
25-Aug-2014 node002 node020 node061
11-Aug-2014 node006 node020
4-Aug-2014 node020
28-Jul-2014 node020
21-Jul-2014 node020
14-Jul-2014 node016 node020 node061
7-Jul-2014 node016 node020 node061
30-Jun-2014 node016 node020 node061
23-Jun-2014 node016 node020 node061
7-Apr-2014 node004 node018 node025 node034 node041 node057
10-Mar-2014 node004 node016 node018 node020 node025 node034 node041
3-Mar-2014 node004 node016 node018 node020 node025 node034 node041
19-Aug-2013 node016 node018 node025 node057 node065
12-Aug-2013 node025 node057 node080
5-Aug-2013 node020 node025 node080
29-Jul-2013 node020 node025 node080
22-Jul-2013 node025 node080
15-Jul-2013 node025 node080
8-Jul-2013 node025
1-Jul-2013 node025
24-Jun-2013 node025
17-Jun-2013 node025
27-May-2013 node057
13-May-2013 node018 node025 node057 node080
6-May-2013 node017 node018 node025 node057
29-Apr-2013 node018
22-Apr-2013 node018 node020 node025 node050 node080
15-Apr-2013 node018 node020 node025 node080
8-Apr-2013 node018 node020 node025 node080
1-Apr-2013 node018 node020 node025 node080
25-Mar-2013 node017 node080
18-Mar-2013 node047
11-Mar-2013 node025
25-Feb-2013 node034
18-Feb-2013 node034
11-Feb-2013 node025 node034 node061
4-Feb-2013 node025 node034 node061
28-Jan-2013 node025 node034 node061
21-Jan-2013 node025 node034 node050 node061
14-Jan-2013 node025 node034 node061
7-Jan-2013 node025 node061*emphasized text*
16-Jun-2014 node016 node020 node061
9-Jun-2014 node016 node020 node061
2-Jun-2014 node016 node020 node061
26-May-2014 node016 node020 node061
19-May-2014 node020 node061
12-May-2014 node016 node020 node061
5-May-2014 node020
28-Apr-2014 node004 node018 node025 node034 node041 node057
21-Apr-2014 node004 node016 node018 node025 node034 node041 node057
14-Apr-2014 node004 node016 node018 node025 node034 node041 node057
31-Mar-2014 node004 node018 node025 node034 node041 node057
24-Mar-2014 node004 node018 node020 node034 node041 node057
17-Feb-2014 node004 node016 node018 node034
10-Feb-2014 node004 node018 node020
3-Feb-2014 node004 node018 node025
27-Jan-2014 node004 node018 node020 node025
20-Jan-2014 node004 node018 node020 node025
13-Jan-2014 node004 node018 node020 node025 node041
6-Jan-2014 node016 node020 node025 node041 node047 node082
30-Dec-2013 node016 node020 node025 node041
23-Dec-2013 node016 node020 node025 node041 node057
16-Dec-2013 node020 node025 node041 node087
9-Dec-2013 node016 node018 node020 node025 node065
2-Dec-2013 node018 node020 node025
25-Nov-2013 node020 node025
18-Nov-2013 node020 node025
11-Nov-2013 node020
4-Nov-2013 node020
28-Oct-2013 node016 node020 node025
21-Oct-2013 node025
14-Oct-2013 node017 node020 node025
7-Oct-2013 node020 node025
30-Sep-2013 node016 node020 node025
23-Sep-2013 node020 node025 node057
16-Sep-2013 node025 node057
9-Sep-2013 node025
2-Sep-2013 node016 node025
26-Aug-2013 node016 node018 node025 node057 node065
18-Aug-2014 node002 node006 node020

The code I have tried looks like this

require(ggplot2)
require(reshape2)
require(scales)

df <- read.table("~/tmp/ipmi_data.txt",fill=T)
flatdata <- melt(df,id.vars="V1")
flatdata <- flatdata[!flatdata$value=="",]
flatdata <- flatdata[order(flatdata$value),]
flatdata$value <- factor(flatdata$value,levels=sort(levels(flatdata$value)))
ggplot(flatdata[flatdata$value != "",]) +
  geom_point(aes(x=value,y=as.Date(V1,format="%d-%b-%Y")),size=3,alpha=0.9) + 
  scale_x_discrete(name="Node") +
  ylab("Date") +
  geom_rect(aes(ymin=as.Date("8-Apr-2014", format="%d-%b-%Y"),
                ymax=as.Date("30-Apr-2014", format="%d-%b-%Y"),
                xmin="node002",xmax="node098"),
                fill="red", alpha=0.25) +
  coord_flip()

The resulting graph has a rectangle across all the factor levels:

Resulting Graph

However, I would like to have individual rectangle for specific levels, such a only for "node004" and "node057" in a given date interval.

So the question is whether is is possible to use the index of a level as a coordinate to define the vertical extent of the rectangle and, if so, how?

loris
  • 450
  • 8
  • 20
  • 3
    Please provide a [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) with sample input data. Also, if possible, include a sketch of the desired output. It's a bit unclear to me at least exactly what you're after. Are you tying to treat the date as a continuous or discrete value? – MrFlick Sep 16 '14 at 15:23
  • Date-classed objects are fundamentally integer, so you could try to coerce you factor variables to 'numeric'. No guarantees that the result will be meaningful, but in this case the default ordering for levels suggests it might. – IRTFM Sep 16 '14 at 15:46

1 Answers1

1

I got some help after asking the same question on the comp.lang.r.general mailing list (http://permalink.gmane.org/gmane.comp.lang.r.general/313656). I ended up adding the following:

nodelist <- sort(levels(flatdata$value))

and then using

geom_rect(aes(ymin=as.Date("8-Apr-2014", format="%d-%b-%Y"),
            ymax=as.Date("30-Apr-2014", format="%d-%b-%Y"),
            xmin=which(nodelist=="node004")-0.5,
            xmax=which(nodelist=="node004")+0.5,
            fill="red", alpha=0.25))
loris
  • 450
  • 8
  • 20