翻转散点图的矩阵
Flip a matrix for scatter plot
我想将 "arc" 翻转到右侧。我试过 imrotate 但它让我 "arc" 面朝下而不是右侧,如下图所示。请看一下我正在使用的code。提前谢谢你。
R = 8; x_c = 5; y_c = 8;
thetas = 0:pi/499:pi;
xs = x_c + R*cos(thetas);
ys = y_c + R*sin(thetas);
% Now add some random noise to make the problem a bit more challenging:
mult = 0.5;
xs = xs+mult*randn(size(xs));
ys = ys+mult*randn(size(ys));
c = linspace(1,50,500);
D = [xs' ys'];
Dx = imrotate(D, 180, 'crop');
Dy=Dx;
Dy = imrotate(Dy, 180, 'crop') ;
subplot(211)
scatter(Dx(:,1), Dx(:,2), 140, c, 'filled', 'LineWidth',1.5)
subplot(212)
scatter(Dy(:,1), Dy(:,2),[],c, 'd','LineWidth',1.5)
fliplr
可以工作,但不适用于您的 Dx
数组,因为它是。 fliplr
对数据而不是图像进行操作,因此对于大小为 500 x 2 的数组,该函数将 x 值翻转为 y 值,反之亦然,这就是为什么您得到旋转而不是反射的原因.
使 fliplr
起作用的一种方法是在绘制图像数据后捕获图像数据,然后翻转它:
scatter(Dx(:,1), Dx(:,2), 140, c, 'filled', 'LineWidth',1.5)
f = getframe;
flipped = fliplr(f.cdata);
imshow(flipped)
您想反映 Dx
的分布。反射的操作意味着取x
并使其成为-x
.
这里Dx
的x轴是Dx(:,1)
,所以一开始我们需要写成Dx(:,1) = - Dx(:,1)
.
当您这样做并绘图时,您会看到 x 轴的值已变为负值。也许这足以满足您的目的,仅此而已。
如果我没有理解错的话,这还不够。现在,为了使这个分布恢复到正 x 轴值,需要 translated。
这意味着:
Dx(:,1) = - Dx(:,1) + some number that translated x-axis to positive values
。
您可以通过首先取分布的平均值(或质心)来选择该数字,即 mean(Dx(:,1))
,这是您的值分布的值。如果您只从分布中减去均值,您最终会得到大约为零的值,要使其在正侧达到相同的距离,您需要再减去那个均值。
Dx(:,1) = - Dx(:,1) + 2 * mean(Dx(:,1))
阅读此行意味着 mean(Dx)
是在反射之前计算的,因此它具有正值...
另一种解决方案是将轴的 'XDir' 属性 设置为 'reverse':
set(gca,'XDir','reverse')
这会翻转坐标轴,因此它会向左而不是向右增加。绘制的数据仍然相同,只是显示方式不同。这可能是也可能不是您想要的。
我想将 "arc" 翻转到右侧。我试过 imrotate 但它让我 "arc" 面朝下而不是右侧,如下图所示。请看一下我正在使用的code。提前谢谢你。
R = 8; x_c = 5; y_c = 8;
thetas = 0:pi/499:pi;
xs = x_c + R*cos(thetas);
ys = y_c + R*sin(thetas);
% Now add some random noise to make the problem a bit more challenging:
mult = 0.5;
xs = xs+mult*randn(size(xs));
ys = ys+mult*randn(size(ys));
c = linspace(1,50,500);
D = [xs' ys'];
Dx = imrotate(D, 180, 'crop');
Dy=Dx;
Dy = imrotate(Dy, 180, 'crop') ;
subplot(211)
scatter(Dx(:,1), Dx(:,2), 140, c, 'filled', 'LineWidth',1.5)
subplot(212)
scatter(Dy(:,1), Dy(:,2),[],c, 'd','LineWidth',1.5)
fliplr
可以工作,但不适用于您的 Dx
数组,因为它是。 fliplr
对数据而不是图像进行操作,因此对于大小为 500 x 2 的数组,该函数将 x 值翻转为 y 值,反之亦然,这就是为什么您得到旋转而不是反射的原因.
使 fliplr
起作用的一种方法是在绘制图像数据后捕获图像数据,然后翻转它:
scatter(Dx(:,1), Dx(:,2), 140, c, 'filled', 'LineWidth',1.5)
f = getframe;
flipped = fliplr(f.cdata);
imshow(flipped)
您想反映 Dx
的分布。反射的操作意味着取x
并使其成为-x
.
这里Dx
的x轴是Dx(:,1)
,所以一开始我们需要写成Dx(:,1) = - Dx(:,1)
.
当您这样做并绘图时,您会看到 x 轴的值已变为负值。也许这足以满足您的目的,仅此而已。
如果我没有理解错的话,这还不够。现在,为了使这个分布恢复到正 x 轴值,需要 translated。 这意味着:
Dx(:,1) = - Dx(:,1) + some number that translated x-axis to positive values
。
您可以通过首先取分布的平均值(或质心)来选择该数字,即 mean(Dx(:,1))
,这是您的值分布的值。如果您只从分布中减去均值,您最终会得到大约为零的值,要使其在正侧达到相同的距离,您需要再减去那个均值。
Dx(:,1) = - Dx(:,1) + 2 * mean(Dx(:,1))
阅读此行意味着 mean(Dx)
是在反射之前计算的,因此它具有正值...
另一种解决方案是将轴的 'XDir' 属性 设置为 'reverse':
set(gca,'XDir','reverse')
这会翻转坐标轴,因此它会向左而不是向右增加。绘制的数据仍然相同,只是显示方式不同。这可能是也可能不是您想要的。