XY图:对x范围使用不同的颜色

时间:2014-12-03 10:24:34

标签: r ggplot2

必须绘制从远足/自行车路线的.gpx轨迹计算的高度计轮廓,我有正常的XY图,其中X是覆盖的渐进距离,Y是高度:
我也知道轨道的每个部分的表面(沥青,地面,鹅卵石......),所以我的data.table TRACKS的形式如下:

PROGDIST  ALTITUDE  SURFACE
      50       110  asphalt
     100       123  asphalt
     150       146  asphalt
     200       124  asphalt
     250       141  asphalt
     300       141  asphalt
     350       148  ground
     400       118  ground
     450       120  ground
      …         …        …

我想用这些信息丰富图表, 获得这样的东西:

我尝试使用gep = c(“area”,“line”)和qplot,geom =“ribbon”来自ggplot2,但我对这些包的实际知识还不够,所以欢迎任何帮助!< / p>

2 个答案:

答案 0 :(得分:1)

使用您的数据,这是您可以这样做的一种方式:

df <- read.table(header=T,text="
PROGDIST  ALTITUDE  SURFACE
50       110  asphalt
100       123  asphalt
150       146  asphalt
200       124  asphalt
250       141  asphalt
300       141  asphalt
350       148  asphalt #you need to add this line in your data so that the colouring goes up to 350 and not stop at 300. #remove this comment to run read.table()
350       148  ground
400       118  ground
450       120  ground")

ggplot(aes(x=PROGDIST,y=ALTITUDE) , data=df ) + geom_line() +
  geom_ribbon(data=subset(df, SURFACE=='asphalt') , aes(ymax=ALTITUDE) ,ymin=0, fill='red', colour=NA, alpha=0.5) +
  geom_ribbon(data=subset(df, SURFACE=='ground') , aes(ymax=ALTITUDE) ,ymin=0, fill='blue', colour=NA, alpha=0.5) 

enter image description here

但是,请注意您的数据中需要添加额外的一行来实现此图表,否则您将在图表中出现间隙。检查上面的评论。

希望它有所帮助。

答案 1 :(得分:1)

您可以使用fill中的ggplot选项轻松完成此操作。但您首先必须更改数据以使变更点具有唯一性:

# original data
df <- read.table(text = 'PROGDIST  ALTITUDE  SURFACE
      50       110  asphalt
     100       123  asphalt
     150       146  asphalt
     200       124  asphalt
     250       141  asphalt
     300       141  asphalt
     350       148  ground
     400       118  ground
     450       120  ground', header=TRUE)
# find points where SURFACE changes
df.change <- df[diff(as.numeric(df$SURFACE)) > 0, ] 
df.change$SURFACE <- df[c(0, diff(as.numeric(df$SURFACE))) > 0, "SURFACE"] 
# add points with new surface to plot
df.new <- rbind(df, df.change)
df.new <- df.new[order(df.new$PROGDIST), ]
# plot
ggplot(df.new, aes(PROGDIST, ALTITUDE)) + 
  geom_line() + 
  geom_ribbon(aes(ymin=0, ymax=ALTITUDE, fill=SURFACE)) +
  theme_bw()