在图形数量不是绘图数量的因素的图形上绘图
Plotting on figures where the number of figures isn't a factor of the number of plots
我正在寻找一种方法来平均绘制矩阵中的 30 列数据,例如,U 个数字,到目前为止,我有办法以 30 的因数来执行此操作,但是我现在正在努力让代码为 U = 7 工作。
代码需要在指定数量的数字 U 上尽可能均匀地绘制数据列,每一列数据代表一个不同的传感器,因此每个都是不同的图。
我到目前为止(感谢 Benoit_11)是:
ColPerFig = size(Data,2)/NumFigures; %// Number of columns to plot per figure
ColStart = 1:ColPerFig:size(Data,2) %// Indices of the starting columns to plot
%// Plot
for k = 1:NumFigures;
hFig(k) = figure;
plot(Data(:,ColStart(k):ColStart(k)+ColPerFig-1));
end
其中"data"是4000x30的矩阵,"NumFigures"是数字U的个数
如果有人有任何修改此代码的想法,以便它也适用于非 30 的因数,我将不胜感激。
谢谢
GibGib
如果您的列数不是数字的精确倍数,您必须决定如何处理剩余的列。
这个提议的解决方案首先定义了每个图中可以绘制的列数。然后计算遗漏了多少列,然后将这些剩余的列一一分布在每个图中。
所以在这个 nFigure=7 的例子中,每个图我们可以有 4 列。我们仍然需要绘制 2 个额外的列,因此图 1 和图 2 实际上将绘制 5 列(而图 3 到 7 将只有 4 列)。
您可以轻松更改额外列的绘制位置(在第一个数字和最后一个数字上)
%% // setup test data
Data = randi([9 11],100,30) ;
for ii=1:30
Data(:,ii) = Data(:,ii)+(10*(ii-1));
end
NumFigures = 7 ; %// this is the total number of figure
%% // calculate how many columns to plot per figure
nCol = size(Data,2) ;
nColPerFig = fix( nCol/NumFigures ) ; %// Number of columns to plot per figure
nColRemain = mod(nCol,nColPerFig) ; %// Number of columns remaining to distribute on existing figures
ncol2plot = ones( NumFigures , 1 ) * nColPerFig ; %// define how many columns will be plotted in each figure
ncol2plot(1:nColRemain) = ncol2plot(1:nColRemain)+1 ; %// add a column per figure as many time as necessary to make sure we plot ALL columns
ColStart = cumsum([1;ncol2plot]) ; %// Indices of the starting columns to plot
ColStart = ColStart(1:NumFigures) ; %// truncate the vector in case it went too far
%% // Plot
for k = 1:NumFigures
hFig(k) = figure ;
plot( Data(:,ColStart(k):ColStart(k)+ncol2plot(k)-1) ) ;
legend('show') %// this is just for a quick visualisation of how many columns we have in each figure
end
我正在寻找一种方法来平均绘制矩阵中的 30 列数据,例如,U 个数字,到目前为止,我有办法以 30 的因数来执行此操作,但是我现在正在努力让代码为 U = 7 工作。
代码需要在指定数量的数字 U 上尽可能均匀地绘制数据列,每一列数据代表一个不同的传感器,因此每个都是不同的图。
我到目前为止(感谢 Benoit_11)是:
ColPerFig = size(Data,2)/NumFigures; %// Number of columns to plot per figure
ColStart = 1:ColPerFig:size(Data,2) %// Indices of the starting columns to plot
%// Plot
for k = 1:NumFigures;
hFig(k) = figure;
plot(Data(:,ColStart(k):ColStart(k)+ColPerFig-1));
end
其中"data"是4000x30的矩阵,"NumFigures"是数字U的个数
如果有人有任何修改此代码的想法,以便它也适用于非 30 的因数,我将不胜感激。
谢谢
GibGib
如果您的列数不是数字的精确倍数,您必须决定如何处理剩余的列。
这个提议的解决方案首先定义了每个图中可以绘制的列数。然后计算遗漏了多少列,然后将这些剩余的列一一分布在每个图中。
所以在这个 nFigure=7 的例子中,每个图我们可以有 4 列。我们仍然需要绘制 2 个额外的列,因此图 1 和图 2 实际上将绘制 5 列(而图 3 到 7 将只有 4 列)。
您可以轻松更改额外列的绘制位置(在第一个数字和最后一个数字上)
%% // setup test data
Data = randi([9 11],100,30) ;
for ii=1:30
Data(:,ii) = Data(:,ii)+(10*(ii-1));
end
NumFigures = 7 ; %// this is the total number of figure
%% // calculate how many columns to plot per figure
nCol = size(Data,2) ;
nColPerFig = fix( nCol/NumFigures ) ; %// Number of columns to plot per figure
nColRemain = mod(nCol,nColPerFig) ; %// Number of columns remaining to distribute on existing figures
ncol2plot = ones( NumFigures , 1 ) * nColPerFig ; %// define how many columns will be plotted in each figure
ncol2plot(1:nColRemain) = ncol2plot(1:nColRemain)+1 ; %// add a column per figure as many time as necessary to make sure we plot ALL columns
ColStart = cumsum([1;ncol2plot]) ; %// Indices of the starting columns to plot
ColStart = ColStart(1:NumFigures) ; %// truncate the vector in case it went too far
%% // Plot
for k = 1:NumFigures
hFig(k) = figure ;
plot( Data(:,ColStart(k):ColStart(k)+ncol2plot(k)-1) ) ;
legend('show') %// this is just for a quick visualisation of how many columns we have in each figure
end