0

我经常需要处理来自具有不同 x 轴大小的多个实验运行的数据。例如,我的数据可能看起来像这样。

[1 2 3 4]  
[5 6]  
[7 8 9 10 15]  
[4] 

这意味着大多数语言(例如 Matlab)要么很难读取数据,要么对绘图不太友好(例如 Java)。谁能推荐一种使导入、操作和绘制数据变得容易的语言?我刚刚使用 numpy/scipy 切换到 Python,但我没有发现这很有帮助(我只是喜欢使用 Python)。请仅发布有关此特定功能的信息,而不是关于语言的笼统陈述。谢谢

4

4 回答 4

2

在 R 中,您可以使用 fll=TRUE 参数将常规数据读入 read.table:

 txt <-"[1 2 3 4]  
 [5 6]  
 [7 8 9 10 15]  
 [4] "

“[...]”可能是 XML 或 Matlabe 形式主义?R 约定是使用行尾,我们需要删除方括号,使用 regex-gsub 函数:

read.table(text=gsub("\\[|\\]", "", readLines(textConnection(txt)) ), 
           fill=TRUE, header=FALSE)
  V1 V2 V3 V4 V5
1  1  2  3  4 NA
2  5  6 NA NA NA
3  7  8  9 10 15
4  4 NA NA NA NA

barplot 函数似乎是您所期望的。这为每行数据提供一个条形图:

apply(dl, 1, function(x) barplot(x[!is.na(x)] )  )

如果您希望将它们全部放在一个数字上,那么也许:

matplot(x=1:4, dl, type="b", ylim=c(0,20),  
        col=c("red", "orange", "blue", "green", "purple"))

在此处输入图像描述

于 2013-08-20T00:09:16.727 回答
2

这是免费的开源统计编程语言 R的尝试——当我获得有关您的数据的更多细节时,我会尝试更新。

作为示例数据文件,我正在使用带有以下几行的 .txt:

1, 2, 3, 4
5, 6
7, 8, 9, 10, 15
4

要读入数据,我会写:

# Always set this option - trust me
options(stringsAsFactors = FALSE)

# This read each line of the file into a vector of strings
x <- readLines(con = file("blah.txt"))

# Split by whatever your delimiter is
xlist <-strsplit(x, ", ")

# Now, each experiment's data is an element in xlist
# It'll be easiest to plot if you get the whole thing into a data.frame
# I'm certain there's a more elegant way to do this, but...
# Name the elements of xlist (kludge)
names(xlist) <- c("Experiment 1", "Experiment 2", 
                  "Experiment 3", "Experiment 4")

# Convert each experiment's data into a data.frame, then stack
# I like using the package plyr for this
library(plyr)

dat <- ldply(names(xlist), .fun = function(expname) {

      data.frame(exp = expname,
                 result = xlist[[expname]])

})


# Check out the data.frame to make sure everything came through okay
str(dat)

# Might need to convert a string to a numeric...
dat$result <- as.numeric(dat$result)


# Then plot (for which I'd use ggplot2)
library(ggplot2)

# All results together
ggplot(dat, aes(x = result)) + geom_histogram()

# By experiment
ggplot(dat, aes(x = result)) + geom_histogram() + facet_wrap( ~ expname)

# Overlaid densities - doesn't work if an experiment has very few results
ggplot(dat, aes(x = result, color = expname)) + geom_density()

毫无疑问,有一种更优雅的方法可以做到这一点,但这是 R 中的一般流程 - 将其作为列表读取(不需要矩形数据),将其转换为熔融格式数据(固有矩形),绘图。

于 2013-08-19T21:10:50.710 回答
1

虽然 MATLAB 中的常规二维矩阵是矩形的,但元胞数组在每个元胞中可以有不同长度的数组。从某种意义上说,它们只是将不同的一维数组打包在一起的一种便捷方式。

在更基本的级别上,您可以调用具有多个数组的绘图,例如

plot(x1,y1,'+',x2,y2,'*',...)

其中x1, 和y2大小匹配,但x2可以不同于x1。您还可以构建一个元胞数组,并使用一个简单的命令绘制它:

C = cell(2,3);
C{1,1} = x1; C{2,1} = y2;
C{1,2} = x2; etc
plot(C{:})

numpy,pyplot.plot()具有相同的语法。 x1etc 可以是 Python 列表中的项目。或者数组可以是 numpy 对象数组中的元素:

array([[[1 2 3 4 5], [2 3 4], [0 2 4 6]],
       [[4 5 6 7 8], [-2 -3 -4], [-3 -1  1  3]]], dtype=object)

for i in range(3):
    pyplot.plot(*C[:,i])
    pyplot.hold('on')

您还可以通过使用None分隔符连接所有数据来绘制多条线。当有大量行时,这似乎有帮助(速度方面)。将数据包装在 annp.array中是可选的(尽管pyplot在内部这样做)。

pyplot.plot(*np.array([[1,2,3,4,5,None,1,2.5,4,5], [1,3,2,5,1,None,2,4,5,6]]))
pyplot.plot([1,2,3,4,5,None,1,2.5,4,5], [1,3,2,5,1,None,2,4,5,6])
于 2013-08-19T22:21:45.223 回答
0

您是否尝试过查看 RSI IDL?它可以非常流畅地处理阵列切片,并内置大量绘图方法。它是我最喜欢的用于实验室原型解决方案的分析工具。

http://www.exelisvis.com/ProductsServices/IDL.aspx

于 2013-08-19T20:24:38.543 回答