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

Math 尝试旋转坐标时出现错误的图形,math,graph,rotation,coordinates,stata,Math,Graph,Rotation,Coordinates,Stata,考虑以下玩具数据: clear input double x1 float y1 0 0 .0013440860215053765 .02503477 .0013440860215053765 .05006954 .005376344086021506 .0751043 .009408602150537635 .10013908 .01747311827956989 .12482615 .03225806451612903 .

考虑以下玩具数据:

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
当我尝试将整个图形逆时针旋转20度时:

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
我错过了什么

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

此外,我还希望解决方案考虑不同的轴比例和图形纵横比

例如:

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轴为4英寸,而x轴为5.5英寸,纵横比为1.375

我曾咨询过多个职位,包括:

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

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

旋转公式如下:

 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') ) 
上述公式表示仿射变换矩阵。要考虑轴的比例,你必须将结果矩阵乘以比例矩阵——这很简单,只需根据轴/轴比率将x或y乘以系数即可

但似乎要旋转已拉伸的视觉表示。假设你的地块沿着牛的方向延伸了5倍。在这种情况下,首先将内部数据x坐标乘以5,将“旋转注释-缩放旋转中心”,然后除以5

对于第一个示例,x轴约长1.5倍。所以我们可以将x柱乘以1.5,旋转20度,再除以1.5。如果轴保持其长度,我们将看到相同的绘图旋转20度。但是,数据范围已更改,绘图的大小已调整!角度不完全是20度。在第二个具有巨大轴比例差异的示例中,这种影响将更加明显


如果旋转后范围保持不变,我希望所描述的方法应该给出正确的角度。它可能会被简单的像素打印检查,但我担心这个模拟不会再现您的打印系统的行为。对于自动轴范围,精确的角度是不可能的。

@PearlySpiner:占位符5是我在你的链接问题中定义的“斜率系数”。请注意,由于物理打印区域是矩形的,因此很有可能会将数据旋转出帧。如果你以不对称的方式扩展绘图区域,你当然会扭曲旋转后的形状。如果旋转后的范围保持不变,我希望所描述的方法会给出正确的角度。它可能会被简单的像素打印检查,但我担心这个模拟不会再现您的打印系统的行为。我会尝试它,如果必要的话会再次给您带来错误。谢谢。@DavisHerring如果你有时间的话,请随意回答这个问题。@PearlySpencer:除了在旋转之前你应该用我的v来放大y,在旋转之后用v来调整中心时,我匆忙地认为它是x,我认为这个答案和评论中没有遗漏任何东西。我确实注意到比这个答案更明确的是,您可以将所有三个矩阵相乘,得到一个有效应用的转换。