昨天我问过一个类似的问题,关于如何避免跳跃等问题。使用atan2d
时的数据。该功能的运行范围为-180到180,如下所示:
当数字超过180时,它直接转到-180,使得线条图very ugly and not intuitive可以读取。我使用unwrap
来解决这个问题suggested,我认为这样做了。但是,今天我遇到了一个如下图:
跳转是固定的,但在它的位置,一条线被转换为顶部。如果你绘制这三条线,它们非常接近,就像它们应该一样(-180和180仍然是相同的位置,就像atan2d
图一样)。我希望我的图表能够反映角度的真实方式 - 非常接近。
根据David K的要求,这里是我用来计算其中一条线的角度的代码。 rec,ret
是一组有序的坐标,recx
和recy
分别是它们的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
之外的其他内容来使图表看起来不错?
答案 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,'.')