我经常需要处理来自具有不同x轴大小的多个实验运行的数据。我的数据可能看起来像这样。
[1 2 3 4]
[5 6]
[7 8 9 10 15]
[4]
这意味着大多数语言(例如Matlab)要么在数据中读取困难,要么绘制得非常友好(例如Java)。任何人都可以建议一种能够轻松导入,操作和绘制数据的语言吗?我刚刚用numpy / scipy切换到Python,但我没有发现太有用(我只是喜欢使用Python)。请发布有关此特定功能的信息,而不是关于该语言的一揽子声明。 感谢
答案 0 :(得分:2)
以下是free, open-source statistical programming language 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中的一般流程 - 将其作为列表读取(不需要矩形数据),将其转换为熔融格式数据(固有矩形),曲线图。
答案 1 :(得分:2)
在R中,您可以使用fll = TRUE参数读取常规数据以读取。表:
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"))
答案 2 :(得分:1)
虽然MATLAB中的常规2D矩阵是矩形的,但是单元阵列在每个单元中可以具有不同长度的阵列。从某种意义上说,它们只是将不同的1d阵列打包在一起的便捷方式。
在更基本的级别,您可以使用多个数组调用绘图,例如
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()
具有相同的语法。 x1
等可能是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
分隔符连接所有数据来绘制多行。当有非常多的行时,这似乎有助于(速度明智)。将数据包装在np.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])
答案 3 :(得分:0)
您是否尝试过查看RSI IDL?它可以非常顺利地处理阵列切片,并且内置了大量的绘图方法。这是我最喜欢的实验室原型解决方案分析工具。