首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从两个数据帧中的数据生成多个序列图/散点图

从两个数据帧中的数据生成多个序列图/散点图
EN

Stack Overflow用户
提问于 2011-11-09 04:57:10
回答 3查看 910关注 0票数 3

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

代码语言:javascript
运行
复制
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,依此类推):

希望这是有意义的。我期待着你的帮助,因为我不想一个接一个地制作这些图表……谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-09 05:26:32

下面是一个开始的例子(https://gist.github.com/1349300上的数据)。有关进一步的调整,请查看web上到处都是的优秀的ggplot2文档。

代码语言:javascript
运行
复制
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

突出显示行与行之间的区域

首先,将数据插值到更精细的网格上。这样,ribbon将遵循线条的实际包络,而不仅仅是原始数据点所在的位置。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
ribbon.data = ddply(data, c('variable', 'x'), summarize, ymin=min(value), ymax=max(value))

现在是时候进行规划了。注意我们是如何添加一个新的ribbon层的,我们用新的ribbon.data框架替换了它。

代码语言:javascript
运行
复制
dev.new(width=5, height=4)
p + geom_ribbon(aes(ymin=ymin, ymax=ymax),  alpha=0.3, data=ribbon.data)

行之间的动态着色

最棘手的变化是,如果您希望颜色根据数据而变化。为此,您当前必须创建一个新的分组变量来标识不同的段。例如,在这里,我们可以使用一个函数来指示"Tg“组何时在顶部:

代码语言:javascript
运行
复制
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)
}

现在我们应用它并将结果与原始ribbon数据合并回去。

代码语言:javascript
运行
复制
groups = ddply(data, 'variable', GetSegs)
ribbon.data = join(ribbon.data, groups)

对于该图,关键是我们现在为ribbon geom指定了分组美学。

代码语言:javascript
运行
复制
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

票数 4
EN

Stack Overflow用户

发布于 2011-11-09 06:23:47

下面是一个执行相同操作的三行代码:-)。我们首先从base使用reshape将数据转换为长格式。然后,它被熔化以适应ggplot2。最后,我们生成图!

代码语言:javascript
运行
复制
mydf   <- reshape(cbind(Tg, Pf), varying = 1:8, direction = 'long', sep = "")
mydf_m <- melt(mydf, id.var = c(1, 4), variable = 'source') 
qplot(id, value, colour = source, data = mydf_m, geom = 'line') + 
  facet_wrap(~ time, ncol = 2)

请注意。base R中的reshape函数非常强大,尽管使用起来非常混乱。它用于在longwide格式之间转换数据。

票数 2
EN

Stack Overflow用户

发布于 2011-11-09 05:28:06

你以前在Excel中使用R!这就是我如何开始使用R,以及通向R启蒙的通用路径:)

你真正需要的只是一个小小的循环。下面是一个示例,其中大部分是创建表示数据结构的示例数据:

代码语言:javascript
运行
复制
## create some example data

Tg <- data.frame(Tg1 = rnorm(10))
for (i in 2:10) {
  vec <- rep(NA, 8)
  vec <- c(rnorm(sample(5:10,1)), vec)
  Tg[paste("Tg", i, sep="")] <- vec[1:10]

}

Pf <- data.frame(Pf1 = rnorm(10))
for (i in 2:10) {
  vec <- rep(NA, 8)
  vec <- c(rnorm(sample(5:10,1)), vec)
  Pf[paste("Pf", i, sep="")] <- vec[1:10]

}
## ok, sample data created

## now lets loop through all the columns
## if you didn't know how many columns there are you could 
## use ncol(Tg) to figure out

for (i in 1:10) {
  plot(1:10, Tg[,i], type = "l", col="blue", lwd=5, ylim=c(-3,3), 
     xlim=c(1, max(length(na.omit(Tg[,i])), length(na.omit(Pf[,i])))))
  lines(1:10, Pf[,i], type = "l", col="red", lwd=5, ylim=c(-3,3))
  dev.copy(png, paste('rplot', i, '.png', sep=""))
  dev.off()
}

这将在您的工作目录中生成10个图形,如下所示:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8056982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档