I am trying to replicate Hadley Wickham's example on page 86 of the ggplot2 book, where he overlays geom_rects showing the party in power over the trend in unemployment. Here is my core code, with some sample data:
我试图复制哈德利·韦翰(Hadley Wickham)在ggplot2书第86页上的例子,他在书中叠加了geom_rects,展示了该党在失业趋势上的影响力。这是我的核心代码,包含一些示例数据:
library("ggplot2")
library("reshape2")
library("lubridate")
con <- textConnection("Date,Var1,Var2
8-Jan-12,100.8,116
15-Jan-12,99.4,115.5
22-Jan-12,98.4,115
28-Jan-12,97.1,114
4-Feb-12,95.9,112
11-Feb-12,95.3,113
18-Feb-12,93.9,111.5
25-Feb-12,93.5,111.5
3-Mar-12,92.6,110
10-Mar-12,91.4,108
17-Mar-12,90.2,106.8
24-Mar-12,90,107.5
31-Mar-12,89.9,106
5-Apr-12,90.4,106.5
12-Apr-12,89.8,106")
track <- read.csv(con, header=TRUE)
track$Date <- as.Date( dmy(track$Date) )
track <- melt(track,
id.vars = c("Date"))
con <- textConnection("City,From,To
Auckland,5-Apr-12,10-Apr-12
Brussels,1-Apr-12,3-Apr-12
Cleveland,24-Jan-12,26-Jan-12
Darjeeling,18-Jan-12,19-Jan-12
Erehwon,8-Feb-12,10-Feb-12
Florence,5-Mar-12,7-Mar-12
Gandalf,25-Mar-12,27-Mar-12")
trips <- read.csv(con, header=TRUE)
trips$From <- as.Date( dmy(trips$From) )
trips$To <- as.Date( dmy(trips$To) )
# draw the Time Series data
p <- ggplot(track,
aes(x = Date,
y = value,
colour=variable,
group = variable))
p <- p + geom_smooth()
p <- p + geom_point(size=3)
p <- p + geom_vline(data=trips,
aes(xintercept=From),
colour='steelblue') # departure dates
p <- p + geom_vline(data=trips,
aes(xintercept=To),
colour='grey80') # return dates
yrng <- c(80,120)
p <- p + scale_y_continuous(limits=yrng)
p # this works up to here, using vlines (ugly, but makes the point)
# ----------- THIS geom_rect() STOPS THIS PLOT BEING RENDERED
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To),
ymin=yrng[1], ymax=yrng[2],
data=trips)
p2 # this gives an error message
# Error in eval(expr, envir, enclos) : object 'variable' not found
# ----------- THIS NOW WORKS, THANKS TO @smu, SEE BELOW
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To,
colour=NULL, group=NULL),
ymin=yrng[1], ymax=yrng[2],
fill='orange',
alpha=0.4,
data=trips)
p2 # and I have added fill and alpha to prettify it a bit
As suggested by @tyler-rinker, I have edited the code to include the original error and the solution pointed out by @smu. Thanks.
正如@tyler-rinker所建议的,我编辑了代码,以包含最初的错误和@smu指出的解决方案。谢谢。
2 个解决方案
#1
7
In the first ggplot
call you map the colour
to 'variable'. This mapping is still present in the geom_rect
call, but no variable named 'variable' exists in 'trips'. I would suggest to unmap colour using:
在第一个ggplot调用中,将颜色映射到“variable”。在geom_rect调用中仍然存在这种映射,但是在“trips”中不存在名为“variable”的变量。我建议取消地图颜色使用:
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To, colour=NULL),
ymin=yrng[1], ymax=yrng[2],
data=trips)
(Haven't tried it, but I guess it should work).
(我还没试过,但我想应该能行。)
#2
10
Just adding inherit.aes=FALSE
in your geom_rect
actually works better as it won't change any of the settings you had made to your previous graph (legend etc.)
只是添加继承。在geom_rect中,aes=FALSE实际上效果更好,因为它不会改变您对以前的图形(图例等)所做的任何设置。
#1
7
In the first ggplot
call you map the colour
to 'variable'. This mapping is still present in the geom_rect
call, but no variable named 'variable' exists in 'trips'. I would suggest to unmap colour using:
在第一个ggplot调用中,将颜色映射到“variable”。在geom_rect调用中仍然存在这种映射,但是在“trips”中不存在名为“variable”的变量。我建议取消地图颜色使用:
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To, colour=NULL),
ymin=yrng[1], ymax=yrng[2],
data=trips)
(Haven't tried it, but I guess it should work).
(我还没试过,但我想应该能行。)
#2
10
Just adding inherit.aes=FALSE
in your geom_rect
actually works better as it won't change any of the settings you had made to your previous graph (legend etc.)
只是添加继承。在geom_rect中,aes=FALSE实际上效果更好,因为它不会改变您对以前的图形(图例等)所做的任何设置。