1

Mathematica で y 座標のセットを含む .raw ファイルを使用してグラフをプロットしようとしています。ファイル内のデータを実際に直接参照するには、何を入力すればよいかわかりません。現在「データ」を使用していますが、これが正しいかどうかはわかりません。

これは私が持っているコードです:

    SetDirectory[$HomeDirectory <> "/Documents/Project/Work/Output"]
    alldirs = FileNames["deBB-*"]
    alllocdata = {};
    Do[
       SetDirectory["./" <> alldirs[[idir]]];
       Print["--- working on " <> (dirname = alldirs[[idir]])];
       allfiles = FileNames["T-*.raw"];
       Do[
          Print["   --- working on " <> (filename = allfiles[[ifile]])];
          ReadList[filename, Number];
          AppendTo[alllocdata, data];
          Print[ListPlot[data, Frame -> True, PlotRange -> {0, 2000}, 
          DataRange -> {0, 10000},
          AxesOrigin -> {0, 0}]], {ifile, Length[allfiles]}
       ];
       SetDirectory[ParentDirectory[]],
       {idir, Length[alldirs]}
    ]

私はこのエラーを受けています:

    ListPlot::lpn: data is not a list of numbers or pairs of numbers. >>

どんな助けでも大歓迎です。

4

2 に答える 2

3

あなたのコードの問題の 1 つは、変数「データ」を割り当てることができなかったことです。あなたがおそらく意味していたのは

data = ReadList[filename, Number];

2 つ目の問題は、ReadList. これはかなり古風ですが、機能し、インポートよりも (約 10 倍) 高速です。数値を (...) として読み取っているため、Numberフォーム文字列に変換する必要はありません。

3 つ目の問題はAppendTo. このコマンドは非常に遅いことで知られています。インデックス化されたアプローチをお勧めします。何かのようなもの

basdir = "~/parentdir";
SetDirectory[basdir];
alldir = FileNames["deBB-*"];
alldir = Select[alldir, DirectoryQ[#] &] (* directories only *);
alldat = Range[Length@alldir];
(
    SetDirectory[cdir = StringJoin[basdir, "/", alldir[[#]]]];
    Print["Working in ", cdir];
    allfil = FileNames["T-*.raw"];
    alldat[[#]] = Range[Length@allfil];
    tmpdat = Import[allfil[[#]], "Table"] & /@ Range[Length@allfil];
    alldat[[#]] = tmpdat;
    Print@ListPlot[tmpdat[[#]], PlotLabel -> allfil[[#]]] & /@ 
     Range[Length@allfil];
    ) & /@ Range[Length@alldir];

十分なはずです。

于 2012-07-24T23:39:54.673 に答える
1

あなたのコメントによると、dataは実際にはString数値ではなく です。

data = "702.00000 704.00000 706.00000 708.00000"

Head[data]これは、 which の出力を見るとわかりますString

それを解析するには、単に使用します

ToExpression@StringSplit@data

dataあなたの代わりにListPlot

ListPlot[ToExpression@StringSplit@data, Frame -> True, PlotRange -> {0, 2000}, 
 DataRange -> {0, 10000}, AxesOrigin -> {0, 0}]

Mathematica グラフィックス

于 2012-07-24T15:29:45.300 に答える