gpt4 book ai didi

r - 从两个数据框中的数据生成多个序列图/散点图

转载 作者:行者123 更新时间:2023-12-01 10:08:35 24 4
gpt4 key购买 nike

我有 2 个数据框,Tg 和 Pf,每个都有 127 列。所有列至少有一行,最多可以有几千行。所有值都在 0 和 1 之间,并且有一些缺失值(空单元格)。这是一个小子集:

Tg
Tg1 Tg2 Tg3 ... Tg127
0.9 0.5 0.4 0
0.9 0.3 0.6 0
0.4 0.6 0.6 0.3
0.1 0.7 0.6 0.4
0.1 0.8
0.3 0.9
0.9
0.6
0.1

Pf
Pf1 Pf2 Pf3 ...Pf127
0.9 0.5 0.4 1
0.9 0.3 0.6 0.8
0.6 0.6 0.6 0.7
0.4 0.7 0.6 0.5
0.1 0.6 0.5
0.3
0.3
0.3

请注意,某些单元格为空,并且同一子集(即 1 到 127)的向量长度可能非常不同,并且很少完全相同。我想为 127 个向量生成 127 个图(即图是针对每个数据帧的第 1 列,图 2 针对每个数据帧的第 2 列,等等...):

enter image description here

希望这是有道理的。我期待着您的帮助,因为我不想一张一张地制作这些图表...谢谢!

最佳答案

这是一个帮助您入门的示例(数据位于 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

enter image description here


突出显示线条之间的区域

首先,将数据插入到更精细的网格中。这样,色带将沿着线条的实际包络线,而不仅仅是原始数据点所在的位置。

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 所需的数据 - 即 ymaxymin

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)

enter image description here


行间动态着色

最棘手的变体是您是否希望颜色根据数据而变化。为此,您目前必须创建一个新的分组变量来标识不同的分割市场。例如,在这里,我们可能会使用一个函数来指示“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)

enter image description here

代码可在以下网址获得:https://gist.github.com/1349300

关于r - 从两个数据框中的数据生成多个序列图/散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com