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 関数は、期待どおりのようです。これにより、データ行ごとに 1 つの棒グラフが得られます。

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

それらすべてを 1 つの図にまとめたい場合は、おそらく次のようにします。

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 の通常の 2D 行列は四角形ですが、セル配列は各セルに異なる長さの配列を持つことができます。ある意味では、それらは異なる 1 次元配列を一緒にパッケージ化するための便利な方法にすぎません。

より基本的なレベルでは、複数の配列でプロットを呼び出すことができます。

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

x1、 とy2サイズは一致しますが、 とは異なる場合がありx2ますx1。また、セル配列を構築し、それを 1 つの簡単なコマンドでプロットすることもできます。

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

ではnumpypyplot.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区切り記号を使用してすべてのデータを連結することにより、複数の線をプロットすることもできます。これは、非常に多数の行がある場合に(速度に関して)役立つようです。データを でラップすること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])
于 2013-08-19T22:21:45.223 に答える
0

RSI IDL を調べてみましたか? 配列のスライスを非常にスムーズに処理し、大量のプロット メソッドが組み込まれています。研究室でソリューションのプロトタイプを作成するための私のお気に入りの分析ツールです。

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

于 2013-08-19T20:24:38.543 に答える