哪种语言允许导入非矩形数据进行绘图

时间:2013-08-19 20:20:57

标签: python r matlab plot

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

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

这意味着大多数语言(例如Matlab)要么在数据中读取困难,要么绘制得非常友好(例如Java)。任何人都可以建议一种能够轻松导入,操作和绘制数据的语言吗?我刚刚用numpy / scipy切换到Python,但我没有发现太有用(我只是喜欢使用Python)。请发布有关此特定功能的信息,而不是关于该语言的一揽子声明。 感谢

4 个答案:

答案 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"))

enter image description here

答案 2 :(得分:1)

虽然MATLAB中的常规2D矩阵是矩形的,但是单元阵列在每个单元中可以具有不同长度的阵列。从某种意义上说,它们只是将不同的1d阵列打包在一起的便捷方式。

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

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

其中x1y2的大小匹配,但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?它可以非常顺利地处理阵列切片,并且内置了大量的绘图方法。这是我最喜欢的实验室原型解决方案分析工具。

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