我正在尝试使用包含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. >>
任何帮助都将不胜感激。
答案 0 :(得分:3)
您的代码中的一个问题是您永远无法分配变量'data'。你可能的意思是
data = ReadList[filename, Number];
第二个问题是ReadList
。这是相当古老的学校,虽然它可以工作,并且(大约10倍)比Import快。因为您正在将数字读作Number
(...),所以您无需将它们转换为字符串。
第三个问题是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];
应该足够了。
答案 1 :(得分:1)
根据您的评论,data
实际上是String
,而不是数字数量。
data = "702.00000 704.00000 706.00000 708.00000"
通过查看输出Head[data]
的{{1}}可以看出这一点。
要解析它,只需使用
String
而不是ToExpression@StringSplit@data
中的data
:
ListPlot