尝试旋转坐标时出现错误的图形

Wrong graph when trying to rotate coordinates

考虑以下玩具数据:

clear
input double x1 float y1
                   0         0
.0013440860215053765 .02503477
.0013440860215053765 .05006954
 .005376344086021506  .0751043
 .009408602150537635 .10013908
  .01747311827956989 .12482615
  .03225806451612903  .1498609
 .056451612903225805  .1748957
  .07661290322580645 .19993046
  .09946236559139784 .22496523
  .15725806451612903       .25
   .2110215053763441  .2750348
  .32661290322580644  .3000695
   .3803763440860215  .3251043
   .4986559139784946  .3497914
    .603494623655914  .3748261
    .706989247311828  .3998609
   .7661290322580645  .4248957
   .8064516129032258  .4499305
    .885752688172043  .4749652
   .9099462365591398        .5
                   1  .5250348
   .9811827956989247  .5500696
   .8870967741935484  .5751043
   .7661290322580645  .5997913
   .6599462365591398  .6248261
   .5873655913978495  .6498609
   .5282258064516129  .6748957
  .40053763440860213  .6999304
   .3279569892473118  .7249652
   .2163978494623656       .75
  .15053763440860216  .7750348
  .09408602150537634  .8000696
  .06586021505376344  .8247566
  .04973118279569892  .8497913
 .024193548387096774  .8748261
 .025537634408602152  .8998609
 .006720430107526882  .9248957
 .002688172043010753  .9499304
 .004032258064516129  .9749652
                   0         1
end

twoway scatter y1 x1

当我尝试将整个图形旋转 20counter-clockwise:

local theta = 0.349066

generate x2 = (x1 * cos(`theta') ) - (y1 * sin(`theta') )  
generate y2 = (x1 * sin(`theta') ) - (y1 * cos(`theta') ) 

坐标变换如下:

clear
input float(x2 y2)
          0           0
-.007299372 -.023065284
 -.01586177  -.04659027
-.020635087  -.06873614
-.025408404  -.09088202
-.026273714  -.11132205
 -.02094281  -.12979028
-.006770712  -.14504059
.0036123034     -.16167
 .016521374     -.17738
  .06226916   -.1811377
  .10422786   -.1862745
  .20428585   -.1702649
  .24624455   -.1754017
   .3489475   -.1581459
   .4389013  -.14581393
    .527592  -.13394167
  .57460284  -.13723963
   .6039312   -.1469735
   .6698875   -.1433759
   .6840596   -.1586262
     .76012    -.151351
   .7338752  -.18131188
   .6369009  -.23701614
  .51478493   -.3015878
   .4064434   -.3614295
   .3296775   -.4097785
  .26554185  -.45353055
  .13699183  -.52072746
  .06022594   -.5690765
 -.05316776    -.630757
 -.12361852   -.6768075
  -.1852281   -.7196401
 -.22019514   -.7524921
 -.24391386   -.7815335
  -.2764738   -.8137929
 -.28377315   -.8368582
  -.3100179   -.8668191
  -.3223694   -.8917232
  -.3296688   -.9147884
  -.3420203   -.9396926
end

twoway scatter y2 x2

我错过了什么?

请注意,我还尝试先将值集中在特定点周围。

此外,我还想解决不同轴比例和图形纵横比的问题。

例如:

clear
input float y double x
-2013                 .001
-1941 .0010053763440860215
-1869 .0010053763440860215
-1797 .0010215053763440861
-1725 .0010376344086021505
-1654 .0010698924731182796
-1582 .0011290322580645162
-1510 .0012258064516129032
-1438 .0013064516129032257
-1366 .0013978494623655914
-1294 .0016290322580645162
-1222 .0018440860215053765
-1150 .0023064516129032257
-1078 .0025215053763440864
-1007 .0029946236559139786
 -935  .003413978494623656
 -863  .003827956989247312
 -791  .004064516129032258
 -719  .004225806451612904
 -647  .004543010752688172
 -575  .004639784946236559
 -503                 .005
 -431 .0049247311827956995
 -359  .004548387096774194
 -288  .004064516129032258
 -216 .0036397849462365592
 -144  .003349462365591398
  -72 .0031129032258064514
    0 .0026021505376344085
   72  .002311827956989247
  144 .0018655913978494624
  216 .0016021505376344087
  288 .0013763440860215053
  359 .0012634408602150537
  431 .0011989247311827958
  503 .0010967741935483872
  575 .0011021505376344087
  647 .0010268817204301076
  719  .001010752688172043
  791 .0010161290322580644
  863                 .001
end

twoway scatter y x

此图的 y-xis4 英寸,而 x-axis5.5 英寸(纵横比为 1.375)。

我查阅了很多帖子,包括以下内容:

我希望我想做的是清楚的,但我很乐意进一步澄清。

旋转公式如下:

 generate x2 = (x1 * cos(`theta') ) - (y1 * sin(`theta') )  
 generate y2 = (x1 * sin(`theta') ) + (y1 * cos(`theta') ) 

它们围绕点 (0,0) 执行旋转。

要围绕特定中心点 (cx, cy) 进行旋转,可以应用下一种方法:

 generate x2 = cx + ((x1 - cx) * cos(`theta') ) - ((y1 - cy) * sin(`theta') )  
 generate y2 = cy + ((x1 - cx) * sin(`theta') ) + ((y1 - cy) * cos(`theta') ) 

以上公式表示仿射变换矩阵。要考虑轴比例,您必须将结果矩阵乘以比例矩阵 - 这非常简单,只需根据 axis/axis 比率将 xy 乘以系数即可。

但您似乎想要旋转已经拉伸的视觉表示。假设您的情节沿 OX 拉伸了 5 次。在这种情况下,首先将内部数据 x 坐标乘以 5,进行旋转(注意 - 也缩放旋转中心),然后除以 5.

对于您的第一个示例,x-axis 长了 ~1.5 倍。所以我们可以将 x 列乘以 1.5,旋转 20 度,然后除以 1.5。如果轴保留其长度,我们应该看到相同的图旋转 20 度。但是,数据范围发生了变化,绘图的大小也发生了变化!角度不完全是 20 度。这种效果在第二个轴比例差异很大的例子中会更加明显。

如果旋转后范围保持不变,我希望所描述的方法应该给出正确的角度。它可能会通过简单的像素绘图进行检查,但恐怕这种模拟不会重现您的绘图系统的行为。使用自动轴范围,无法获得精确的角度。