matlab 基于单列变量创建图

s8vozzvw  于 2022-12-19  发布在  Matlab
关注(0)|答案(1)|浏览(106)

我是Matlab社区的新手,在一个特定的绘图任务中需要帮助!
我的任务是创建一个自动化流程,该流程使用基于我们在现场收集的测量数据的X(高程)和Y(桩号)数据生成大量二维线图。此XY数据需要根据"Profile_ID"列中的变量拆分为不同的图形。数据示例如下所示:
| 东距|北向|高程|测链|足球俱乐部|姓名|配置文件_ID|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 小行星219578.603|小行星101400.293|六点六七五|一三三三九三|行政长官|不适用|7b01346|
| 小行星219577.925|小行星101400.621|六点零八八|一三四一四六|十|不适用|7b01346|
| 小行星219577.833|小行星101400.709|六点零三七分|一三四二六七|十|不适用|7b01346|
| 小行星219577|小行星101400.789|小行星5.904|一三四七一四|十|不适用|7b01346|
| 小行星219577.319|小行星101400.987|五千八百八十七|一三四八五零|十|不适用|7b01346|

  • PROFILE_ID在整个. txt文件中更改。该文件先基于profile_id排序,然后基于桩号排序 *

然而,我还需要将以前的调查数据覆盖到相同的对应"Profile_ID"图表上。因此,本质上我有2个数据集,它们具有相同的列布局,只是使用不同的X和Y数据。一个来自上一个调查,一个来自最新的调查。我希望找到一种方法,允许我运行 * for * 循环,为"profile_id"的每次迭代创建一个图形然后还覆盖具有相同"profile_id"的先前调查数据。
我希望这一切都是有意义的,我在这里链接了一个例子:Example of desired graph produced by the script, for one iteration of 'Profile_ID'
干杯!

clc
clear
close all

%Import inputs

point_file_old = readtable('7b7B3-2_20170627tp.csv'); %Input older file name here
matrix_profile_old = table2array(point_file_old(:,3:4)); %Extracting elevation & chainage column
id_old = point_file_old(:,7);
L_old = length(matrix_profile_old(:,1));

point_file_new = readtable('20220430_7b7B3-2tp.csv'); %Input newer file name here
matrix_profile_new = table2array(point_file_new(:,3:4)); %Extracting elevation & chainage column
id_new = point_file_new(:,7);
L_new = length(matrix_profile_new(:,1));
%Settings

chainage_old = matrix_profile_old(:,2); %Identifying old chainage column 
elevation_old = matrix_profile_old(:,1); %Identifying old elevation column 
chain_old_num = length(chainage_old); %Amount of rows in chainage 
elev_old_num = length(elevation_old) %Amount of rows in elevation  

chainage_new = matrix_profile_new(:,2); %Identifying old chainage column 
elevation_new = matrix_profile_new(:,1); %Identifying old elevation column 
chain_new_num = length(chainage_new); %Amount of rows in chainage 
elev_new_num = length(elevation_new); %Amount of rows in elevation 

t_old = table(chainage_old(:,1), elevation_old(:,1), table2array(id_old(:,1)));
t_new = table(chainage_new(:,1), elevation_new(:,1), table2array(id_new(:,1)));

G = findgroups(t_new(:,3));
temp = splitapply(@(varargin) {sortrows(table(varargin{:}),3)}, t_new, G); %order separated groups in terms of chainage

因此,我目前已经将数据分类到组中,现在需要绘制每个单独的组,然后最终将以前的数据覆盖到相应的组数据上。

rbl8hiat

rbl8hiat1#

一种方法是将所有数据(旧的和新的)合并到一个表中,然后找到唯一的ID并循环遍历它们,对于每个ID,您可以标识相关的行并绘制它们。
请注意,当前代码中table2array的使用使您的工作更加困难,表很好,因为您可以直接使用列名来索引列,因此:

table2array(point_file_new(:,3));

变成了这个

point_file_new.Elevation;

注解代码如下:

data_old = readtable('7b7B3-2_20170627tp.csv'); %Input older file name here
data_old.Source(:) = {'Old'}; % Add this column so we can track the source later
data_new = readtable('20220430_7b7B3-2tp.csv'); %Input newer file name here
data_new.Source(:) = {'New'}; % Add this column so we can track the source later

data_all = [data_old; data_new]; % combine data into single table

IDs = unique( data_all.Profile_ID ); % Get unique Profile_ID values
NID = numel(IDs);                    % Number of unique IDs
for ii = 1:NID
    ID = IDs{ii};  % Current ID
    idxID = ismember( data_all.Profile_ID, ID ); % Rows with this ID
    idxOld = strcmp(data_all.Source, 'Old');     % Rows from old data
    idxOld = idxOld & idxID; % Rows from old data and this ID
    idxNew = strcmp(data_all.Source, 'New');     % Rows from new data
    idxNew = idxNew & idxID; % Rows from new data and this ID
    
    figure(); % Make a new figure for this ID
    hold on;  % hold so we can plot multiple lines
    plot( data_all.Elevation(idxOld), data_all.Chainage(idxOld), 'displayname', 'Old data' ); % plot old
    plot( data_all.Elevation(idxNew), data_all.Chainage(idxNew), 'displayname', 'New data' ); % plot new
    % Add labels/title
    xlabel( 'Chainage (m)' );
    ylabel( 'Elevation (m)' );
    title( ID );
    grid on;
    hold off; % done plotting
    legend('show','location','best');
end

相关问题