我正在尝试绘制包含x,y,z,t的数千个数据点的图表。数据位于.txt文件中,如下所示:
我正在思考打开文本文件的路线,创建一个可以抓取x,y,z,t并使用scatter3绘制的循环。如果有人能让我开始研究MATLAB代码的样子,那就太棒了。
答案 0 :(得分:1)
I don't really understand how you want to plot in 4D, but I am guessing that you wish to plot in 3D, then dynamically change the plot as the time goes by.
But anyways, about the files:
First, the text reading is really straightforward.
You just need to create a variable, i.e. file_text_rd
, then use this variable to open the file:
file_text_rd = fopen('data.txt','r');
The first parameter is the name of the .txt
file (Note that you need to set the directory to the folder where the .txt
file is located). The second parameter states that you wish to read from the text file.
Then, you can read from the file and put the data in variables with different function (depends on what suits you better). For example,
var=fgetl(file_text_rd);
will put the first line of the file content in your variable.
var=fscanf(file_text_rd,%c);
will put the entire content of the .txt
file in your variable, etc. Other reading functions are fread
and fgets
. So, depending on the function you might wanna use some looping functions to fill your var
with content.
When you are done with your file reading, you need to close the file with:
fclose(file_text_rd), clear file_text_rd;
The next part is maybe a little bit more tricky. It's the part where you convert the characters you've read to integers. I wrote a bit of code for you, to illustrate one way to do this. In this solution, I used the fscanf
function.
%Open file for reading
file_text_rd=fopen('data.txt','r');
%Read the content (%c means you are reading characters)
var=fscanf(file_text_rd,'%c');
%Converse the characters to double. Have in mind the ascii values of the
%chars, so you can get the actual number value of the numbers in the string
%by subtracting the 48 of the original value, since the zero in ascii is
%numbered as 48 (in decimal system).
conv_var=double(var)-48;
%Define the initial value of your variable (all zeros)
final_var=zeros(1,4);
%Row counter
count_r=1;
%Column counter
count_c=1;
%Divider
times=10;
%Dot flag
dot=0;
%Negative sign flag
negative_sign=0;
%This for loop is for testing every single character from the first to the
%last
for i=1:size(conv_var,2)-1
%This if condition is for:
%1. Checking if the character is a number between 0 and 9
%2. Checking if the character is a dot
%3. Checking if the character is a minus sign
%4. Checking if the character is a comma
%All other characters are not of interest.
if (conv_var(i)>=0 && conv_var(i) <=9) || conv_var(i) == -2 || conv_var(i) == -3 || conv_var(i) == -4
%If it's not a comma (that means we are still on the last number we
%were working on) we go in this section
if conv_var(i)~= -4
%If it's not a minus sign we go in this section
if conv_var(i) ~= -3
%If the dot flag hasn't been set to 1 yet (no dot in the
%string has yet been found) we don't enter this section
if dot==1
%If the flag HAS been set, then the number just found
%on the sequence is divided by 10 and then added to the
%old versison, since if we are reading the number
%'50.9160', the 9 has to be divided by 10 and then
%added to 50
final_var(count_r,count_c)=final_var(count_r,count_c)+conv_var(i)/times;
%The divider now rizes because the next found number
%would be 10 times smaller than the one found just now.
%For example, in '50.9160', 1 is 10 times less than 9
times=times*10;
else
%This condition is needed so we don't add the ascii
%number equivalent to the dot to the number we are
%working on.
if conv_var(i)~=-2
%We multiply the old version of the number we are
%working on, since if we are reading the number
%'50.9160', first we will read 5, then we will read 0,
%so we will need to multiply 5 by 10 and then add the 0
%and so on...
final_var(count_r,count_c)=final_var(count_r,count_c)*10+conv_var(i);
else
%If the character found IS the dot, then we just
%set the flag
dot=1;
end
end
else
%If the character found IS the negative_sign, then we set
%the flag for the negative_sign, so we can multiply the
%number we are working on atm with -1.
negative_sign=1;
end
else
%We get in this section if we found a comma character (or the
%ascii equvalent of the comma sign, more accurately)
if negative_sign==1
%This is the part where we multiply the number by -1 if
%we've found a minus sign before we found the comma
final_var(count_r,count_c)=-final_var(count_r,count_c);
end
%Here we add 1 to the column counter, since we are ready to
%work with the next number
count_c=count_c+1;
%We reset all the flags and the divider
dot=0;
times=10;
negative_sign=0;
end
end
%The number -38 in ascii is the equivalent of NL, or the end of the
%line sign (which we can't see), which actually means there was an "Enter" pressed at this point
if conv_var(i)==-38
%We set the column counter to one since, we will work now with the
%first number of the next four parameters
count_c=1;
%We increment the row counter so we can start saving the new values
%in the second row of our matrix
count_r=count_r+1;
%We set the next row initially to be all-zeros
final_var(count_r,:)=zeros(1,4);
%We reset the flags
dot=0;
times=10;
negative_sign=0;
end
end
%We close the file, since our work is done (you can put this line after the
%fscanf if you like)
fclose(file_text_rd), clear file_text_rd;
I believe that you have some idea of how to plot your 4D data, even though I can't really catch that part up.
I hope I helped, Bojan