Как я могу сделать циклический сдвиг для axy сюжета в Matlab? - PullRequest
1 голос
/ 13 мая 2019

У меня есть несколько файлов CSV, каждый из которых имеет два столбца, например:

 X  Y
-93 4.3249598727193514e-5
-92 0.0017247823556143683
-91 0.009753849011964329
-90 0.03288075738113382
.....
96  0.004679186277368824
97  0.0003355482914528248
98  3.1077568577666192e-6    

Я отображаю все файлы CSV в каталоге, используя следующий код:

function myplot(x,y, marker)
    plot(x(:,1),x(:,2)); hold on;
end
dd = '.';
dx = 0;
all_in_one = 1;
files = getAllFiles(dd,'*.csv',1); % dir(strcat(dd,'*.csv_'))
Legend = cell([size(files),1]);
k =1;
set(0,'DefaultFigureWindowStyle','docked')

s = pwd;
h = figure('Name',s(20:end));

domag = 0;
for file = files'  
    data = load(file{1});
    if all_in_one == 0
        figure('Name',file{1});
    end
    if dx == 1
        [C, ~, ic]=  unique(data(:,3));
        A = [C  accumarray(ic,data(:,4),[],@mean)];
        myplot(A); hold on;
    else 
        myplot(data); hold on;
    end
    avg = num2str(round(avg,1));
    Legend{k}= strcat(file{1}, '::', avg);
    k = k+1;
end
if all_in_one == 1
    legend(Legend);
f2 = strrep(s(20:end),'\','_');
f2 =strcat(f2,'.fig');
saveas(h,f2,'fig');
    %saveas(h,f2,'png');
end

И у меня есть следующий рисунок: enter image description here

Как вы можете видеть, он строит некоторые кривые между -100 и 100. Теперь я хочу сместить графики примерно с 50 доправо.Однако, когда я сдвигаю его, числа, которые выходят за границы, должны появиться сзади слева от изображения, так что текущие пересечения 0 и 90 должны быть на 50 и -50.

Я могу сдвинуть xось, используя следующую команду в цикле.Тем не менее, я не очень понимаю, как перевести все данные!

shift = -50;
data(:,1) = data(:,1)+shift;

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Одно решение с использованием circshift:

%dummy data
x     = -90:10:90;
y     = normpdf(x,0,100);
bnd   = [-100,100];
shift = 50;

%shift x
xs      = x+shift;
%which value are below/above boundary
ts      = xs <= bnd(1) | xs >= bnd(2)
%shift direction
ss      = sign(shift);
%x value correction
xs(ts)  = xs(ts)-ss*sum(abs(bnd))
%create new vector
[x,ind] = sort(circshift(xs,ss*(sum(ts))))
y       = y(ind);
%avoid to get a line between the first and last value by using a NaN
seiz    = find(diff(ind)<0);
if ~isempty(seiz)
    x       = [x(1:seiz),NaN,x(seiz+1:end)];
    y       = [y(1:seiz),NaN,y(seiz+1:end)];
end
% plot the result:
plot(x,y)

Исходные данные :

enter image description here

Сдвинутые данные :

enter image description here

1 голос
/ 13 мая 2019

Этот код циклически перемещается, значения превышают нижнюю и верхнюю границы

lb = -100; % Lower bound
ub = 100; % Upper bound

% Indices less than lower bound
less_than_lb = find(data(:,1) < lb);

% Indices greater than upper bound
greater_than_ub = find(data(:,1) > ub); 

% Cyclic shift values exceeding lower bound 
data(less_than_lb,1) = ub - (lb - data(less_than_lb,1)); 

% Cyclic shift values exceeding upper bound 
data(greater_than_ub,1) = lb - (ub - data(greater_than_ub,1));

% Sort shifted data
[data(:,1), ind] = sort(data(:,1));
data(:,2) = data(ind,2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...