我在R中用两个系列构建了一个图表,但我想在图表的底部添加一个彩色条:
要绘制的数据是
2013-01-01 12:35:00 0
2013-01-01 12:45:00 1
2013-01-01 13:00:00 1
....
2013-01-01 13:00:00 2
其中0为绿色,1为橙色,2为红色。日期时间与原始图表中的数据X对齐。
这是图表的代码(没有彩色条):
datos_tem <- dbGetQuery(connection, paste("SELECT temp_int,hum_int,datetime FROM datalog_v2 WHERE host_id=41 and datetime>='2014-02-01 00:00:00' and datetime<='2014-02-01 23:59:00';", sep=""))
dbDisconnect(connection)
datos_tem$datetime <- as.POSIXct(datos_tem$datetime)
datos_tem$temp_int <- as.numeric(datos_tem$temp_int)
datos_tem$hum_int <- as.numeric(datos_tem$hum_int)
#gg <- qplot(datos_tem$datetime, datos_tem$temp_int) + geom_line() # first line
#gg <- gg + geom_line(aes( x=datos_tem$datetime, y=datos_tem$hum_int )) # add the second line!
png(file.path("/tmp/", paste("comp",".png",sep="_")))
Molten <- melt(datos_tem, id.vars = "datetime")
ggplot(Molten, aes(x = datetime, y = value, colour = variable)) + geom_line() +
scale_y_continuous(limits=c(0, 100)) +
xlab("Tiempo") +
ylab("Temperatura --- (ºC) y Humedad (%)")+
geom_line(size=1.9)+
scale_color_manual(values=c("#FF0000", "#0000FF"),
name="Medidas",
labels=c("Temperature", "Humidity"))
所以,我想在我的代码中添加类似我的示例。 有可能吗?
行数据为:
temp_int hum_int datetime
11.6 76.8 2014-02-01 00:00:00
11.4 77.8 2014-02-01 00:15:00
11.3 79.4 2014-02-01 00:30:00
.....
底部栏的数据是:
datetime DPV
2013-01-01 12:35:00 0
2013-01-01 12:45:00 1
2013-01-01 13:00:00 1
....
2013-01-01 13:00:00 2
更好!!我已经改变了我的数据,现在我已经:
datetime,temp_int,hum_int,dpv
"2014-02-15 00:00:00",67.2,13.6,"red"
"2014-02-15 00:15:00",63.4,13.8,"yellow"
"2014-02-15 00:30:00",61.2,14.2,"green"
"2014-02-15 00:45:00",60.4,14.5,"green"
....
答案 0 :(得分:3)
如果没有实际数据,很难回答,但这里有一些想法。
制作了一些样本数据,其中包含x
个值,行temp
值和用于着色条的id
值。
set.seed(1)
df<-data.frame(x=1:100,temp=runif(100,10,50),id=sample(1:3,100,replace=TRUE))
一种解决方案是使用geom_tile()
并将y
值设置为0,并使用fill=
的ID。此解决方案的问题在于条的高度取决于数据的范围。您可以通过调用具有不同y值的多个geom_tile()
来电来增加高度。
ggplot(df,aes(x))+geom_line(aes(y=temp))+
geom_tile(aes(y=0,fill=factor(id)))
另一种可能性是将geom_bar()
与stat="identity"
一起使用,并设置所需条形的y
值高度。使用参数width=
,您可以更改条的宽度,以确保条之间没有空格。
ggplot(df,aes(x))+geom_line(aes(y=temp))+
geom_bar(aes(y=4,fill=factor(id)),stat="identity",width=1)
有问题的数据。
df<-read.table(text="datetime,temp_int,hum_int,dpv
2014-02-15 00:00:00,67.2,13.6,red
2014-02-15 00:15:00,63.4,13.8,yellow
2014-02-15 00:30:00,61.2,14.2,green
2014-02-15 00:45:00,60.4,14.5,green",header=T,sep=",")
将datetime列转换为POSIXct。
df$datetime <- as.POSIXct(df$datetime)
将数据框格融合为长格式。
library(reshape2)
df.melt<-melt(df,id.vars=c("datetime","dpv"))
现在用于绘制使用融化的数据框。参数colour=
应放在aes()
的{{1}}内,因为如果将geom_line()
调用放在ggplot()
调用内,则会更改条形边框。对于geom_bar()
,使用dpv
作为fill=
并使用scale_fill_identity()
,因为dpv
包含实际的颜色名称。如果您需要使用彼此靠近的条形,请使用width=900
。我设置900是因为你有15分钟的时间间隔,相当于900秒(在这种情况下,1秒是单位)。
ggplot(df.melt, aes(x = datetime, y = value)) +
geom_line(aes(colour = variable),size=1.9) +
geom_bar(aes(y=4,fill=dpv),stat="identity",width=900)+
scale_fill_identity()