在python中如何围绕中心点旋转图形

2024-04-24 22:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个矩形图(图)变成这样的圆形图:

radial line graph

现在,我并不是真的想转换一个实际的图形图表,我只是在尝试转换底层数据:(x,y)坐标。在

我的数据集的时间间隔是相等的,所以它只是一个y坐标的列表,如下所示(其中x表示以偶数速率递增):

[11,16,12,14,13,12,13,10...]

我想像图中那样把它绕在中心,这样它就会变异成这样:(在这里估计一下):

[(0,11)、(3,14)、(8,8)、(13,4)…]

我不知道,我想这更像是一个椭圆形的东西,不管怎样,重点是我只想把矩形图的末端绕起来,这样它就回到x = 0然后有一个新的坐标作为(x,y)对,其中(0,0)是圆的中心。在

我不知道这种转换叫做什么,也不知道是否有python包已经这样做了。再说一次,我并不是在寻找像这样的绘图软件:https://matplotlib.org/examples/pylab_examples/polar_demo.html我只想要一个函数,它接受点,然后计算,然后返回新的坐标。在

有人知道有这样的包裹吗?在

或者,如果一个不存在,有人知道我需要做什么样的数学,或者用什么公式来计算?在

更新:对答案的响应。在

感谢你们的回答和指导,莱布隆·马斯克和加塞姆·纳达夫,你们都建议把它绕在极地区域。我试着执行你的建议,但没能得到我想要的。为了简化操作,我更改了演示数据集。在

^{pr2}$

此结果打印出以下new_data

{'x': [0.0, 0.7853981633974483, 1.5707963267948966, 2.356194490192345, 3.141592653589793, 3.9269908169872414, 4.71238898038469, 5.497787143782138], 'y': [6.25, 6.875, 7.5, 8.125, 10.0, 8.125, 7.5, 6.875]}

它打印的图像是:

original chart

polar

注意极坐标表示法不是我要找的。数据上升到峰值然后回落。如果我用手画一个圆形的图形,它看起来像这样:

estimation

看离中心的点怎么变成Y距离了吗?但是X从range(0,8)变成了一组围绕中心旋转的正数和负数。我需要用np.sin()来得到这个结果吗?看来极坐标图是不够的。在


Tags: 数据列表间隔速率时间圆形中心examples
2条回答

我想你想要的和这篇文章有关:

https://math.stackexchange.com/questions/260096/find-the-coordinates-of-a-point-on-a-circle

x = radius * np.sin(θ)
y = radius * np.cos(θ)

radius是你的y变量,你的θ必须来自于一个圆除以数据集中的点数。在

^{pr2}$

为了验证得到的点与中心(y)的距离是否正确,可以遵循公式sqr(x) + sqr(y) = sqr(r),你会看到它是正确角度的正确距离。在

代码如下:

import numpy as np
import matplotlib.pyplot as plt

from math import pi

ydata = [10,11,12,13,16,13,12,11]

#plt.plot(xdata, ydata)
#plt.show()

def wrap_around(radii):
    thetas = [i * (360 / len(radii)) for i in range(0, len(radii))]
    xs = [(radius * np.sin(np.deg2rad(theta))) for radius, theta in zip(radii, thetas)]
    ys = [(radius * np.cos(np.deg2rad(theta))) for radius, theta in zip(radii, thetas)]
    print(thetas, len(thetas))
    print(xs, len(xs))
    print(ys, len(ys))
    return xs,ys

x,y = wrap_around(ydata)
plt.plot(x,y)

plt.grid(True)
plt.show()

enter image description here

from math import pi
ydata = [11,16,12,14,13,12,13,10]
data_len = len(ydata)
max_y = max(ydata)
DESIRED_MAP_RADIUS = 100.0
new_data = {'x': [n * 2 * pi / data_len for n in range(data_len)] ,
            'y': [y/max_y*DESIRED_MAP_RADIUS for y in ydata]
           }
print(new_data)

相关问题 更多 >