这是一个让您入门的示例(数据位于https://gist.github.com/1349300)。如需进一步调整,请查看网络上出色的 ggplot2 文档。
library(ggplot2)
# Load data
Tg = read.table('Tg.txt', header=T, fill=T, sep=' ')
Pf = read.table('Pf.txt', header=T, fill=T, sep=' ')
# Format data
Tg$x = as.numeric(rownames(Tg))
Tg = melt(Tg, id.vars='x')
Tg$source = 'Tg'
Tg$variable = factor(as.numeric(gsub('Tg(.+)', '\\1', Tg$variable)))
Pf$x = as.numeric(rownames(Pf))
Pf = melt(Pf, id.vars='x')
Pf$source = 'Pf'
Pf$variable = factor(as.numeric(gsub('Pf(.+)', '\\1', Pf$variable)))
# Stack data
data = rbind(Tg, Pf)
# Plot
dev.new(width=5, height=4)
p = ggplot(data=data, aes(x=x)) + geom_line(aes(y=value, group=source, color=source)) + facet_wrap(~variable)
p
突出显示线条之间的区域
首先,将数据插入到更精细的网格中。这样,功能区将跟随线条的实际包络线,而不仅仅是原始数据点所在的位置。
data = ddply(data, c('variable', 'source'), function(x) data.frame(approx(x$x, x$value, xout=seq(min(x$x), max(x$x), length.out=100))))
names(data)[4] = 'value'
接下来,计算geom_ribbon 所需的数据——即ymax 和ymin。
ribbon.data = ddply(data, c('variable', 'x'), summarize, ymin=min(value), ymax=max(value))
现在是时候进行绘图了。请注意我们如何添加了一个新的功能区层,我们用新的ribbon.data 框架代替了它。
dev.new(width=5, height=4)
p + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3, data=ribbon.data)
线条之间的动态着色
最棘手的变化是如果您希望颜色根据数据而变化。为此,您当前必须创建一个新的分组变量来识别不同的段。例如,在这里,我们可能会使用一个函数来指示“Tg”组何时位于顶部:
GetSegs <- function(x) {
segs = x[x$source=='Tg', ]$value > x[x$source=='Pf', ]$value
segs.rle = rle(segs)
on.top = ifelse(segs, 'Tg', 'Pf')
on.top[is.na(on.top)] = 'Tg'
group = rep.int(1:length(segs.rle$lengths), times=segs.rle$lengths)
group[is.na(segs)] = NA
data.frame(x=unique(x$x), group, on.top)
}
现在我们应用它并将结果与我们的原始功能区数据合并。
groups = ddply(data, 'variable', GetSegs)
ribbon.data = join(ribbon.data, groups)
对于情节,关键是我们现在为带状几何体指定分组美学。
dev.new(width=5, height=4)
p + geom_ribbon(aes(ymin=ymin, ymax=ymax, group=group, fill=on.top), alpha=0.3, data=ribbon.data)
代码一起在:https://gist.github.com/1349300