Вот пример, с которого можно начать (данные на 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