以相同的方向展开一切

时间:2014-07-17 19:24:30

标签: matlab graph angle atan2

昨天我问过一个类似的问题,关于如何避免跳跃等问题。使用atan2d时的数据。该功能的运行范围为-180到180,如下所示:

Unit circle with atan2d

当数字超过180时,它直接转到-180,使得线条图very ugly and not intuitive可以读取。我使用unwrap来解决这个问题suggested,我认为这样做了。但是,今天我遇到了一个如下图:

Graph with weird translation

跳转是固定的,但在它的位置,一条线被转换为顶部。如果你绘制这三条线,它们非常接近,就像它们应该一样(-180和180仍然是相同的位置,就像atan2d图一样)。我希望我的图表能够反映角度的真实方式 - 非常接近。

根据David K的要求,这里是我用来计算其中一条线的角度的代码。 rec,ret是一组有序的坐标,recxrecy分别是它们的x和y值。然后我将theta_r的结果绘制成一个普通的数字。

for i=1:length(recx)
    dy(i,1)=((recy(i)-rety(i)));
    dx(i,1)=((recx(i)-retx(i)));
    sloperight(i,1)=(dy(i)/dx(i));
    theta_r(i,1)=atan2d(dy(i),dx(i));

end
theta_r = 180/pi * unwrap(theta_r * pi/180);

我的问题

如何使展开功能仅在一个方向上展开(在圆周或逆时针方向上相对于顺时针方向制作所有角度)而不是在最近方向展开?或者我应该使用unwrap之外的其他内容来使图表看起来不错?

2 个答案:

答案 0 :(得分:4)

这是一个想法:选择一组数据中的一个值,例如,第一个"行"中的第一个值。数据的。将angle0设置为该值,并为每个数据数组A设置一个"已调整的" A的副本如下:wrapTo180(A - angle0) + angle0,并绘制新数据。

请确保对您在一张图表上绘制的所有数据使用相同的angle0值。

这种方法在某些数据集中可能会有自己的问题(例如,如果角度在足够宽的范围内逐渐增加,这种方法将产生"跳跃"不会出现在原始数据),但既然你知道数据都是围绕一个角度值(模数为360度)聚集的,那么你的图表应该没问题。

答案 1 :(得分:1)

我离开计算机时打开了这个问题,今天早上nerdsniped我自己。

以下是将David K的答案付诸实践的一些代码。使用提供的随机种子来保证一个体面的例子。注释每次都会看到不同的例子。

%Seed maintenance
%    This seed seems to demonstrate the desired behavior. Comment this out
%    to see multiple examples
rng(523205203)

%Parameters
N = 500;
commonRate = 10;
independentRate = 2;
nSeries = 4;

%Some random data
common = randn(N*2,1)*commonRate;
independent = randn(N*2,nSeries)*independentRate;

%Build up some interesting data series
data = cumsum(bsxfun(@plus,common, independent), 1);
data = data((N+1):end, :);

%Setup observed data, observing modulated data
observedData = mod(data, 360)-180;

%Utility functions
%    Basic unwrapping, in deg
unwrap_deg            = @(x) unwrap(x/180*pi)*180/pi;           
%    Unwrapping, using an arbitrary offset, in deg
unwrapToValue_deg     = @(x, value) unwrap_deg(x-value)+value;  
%    Basic unwrapping, in dim 1, after adjusting columns based on row 1
equalizeAndUnwrap_deg = @(x) unwrap_deg(...
    bsxfun(@plus, ...
    unwrapToValue_deg(x(1,:),x(1,1)) - x(1,:), ...   %Per column, add the difference ebtween row 1 and the unwrapped row 1
    observedData)...    
    );

%Use functions to correct observred data
unwrappedObservedData = unwrap_deg(observedData);
equalizedUnwrappedObservedData = equalizeAndUnwrap_deg(observedData);

%Plot
figure(2932323)
subplot(311)
plot(observedData,'.')
subplot(312)
plot(unwrappedObservedData,'.')
subplot(313)
plot(equalizedUnwrappedObservedData,'.')