我想像这样将矩形图(图表)变成圆形图:
现在,我并不是真正要转换实际的图形图表,而是要转换基础数据:(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我只想要一个函数,该函数获取点,然后进行数学运算并返回新坐标。
有人知道这样做的软件包吗?
或者如果不存在,有人会知道我必须做什么样的数学,或者要做什么的公式是什么?
更新:回答答案。
感谢Reblochon Masque和Ghasem Naddaf的回答和指导,你们都建议将其包裹在极地图上。我已尝试执行您的建议,但无法获得我想要的。为简化起见,我更改了演示数据集。
import numpy as np
import matplotlib.pyplot as plt
from math import pi
ydata = [10,11,12,13,16,13,12,11]
xdata = [0, 1, 2, 3, 4, 5, 6, 7]
plt.plot(xdata, ydata)
plt.show()
data_len = len(ydata)
max_y = max(ydata)
DESIRED_MAP_RADIUS = 10.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)
ax = plt.subplot(111, projection='polar')
ax.plot(new_data['y'], new_data['x'])
ax.set_rmax(DESIRED_MAP_RADIUS)
ax.set_rticks([2, 4, 6, 8]) # less radial ticks
ax.set_rlabel_position(-22.5) # get radial labels away from plotted line
ax.grid(True)
plt.show()
此结果将打印出以下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]}
及其打印的图像是这些:
请注意,极坐标表示法不是我想要的。数据上升到峰值然后又下降。如果我要手工绘制此圆形图,它将看起来像这样:
看看远离中心的点如何成为Y距离?但是X从range(0,8)
到围绕中心旋转的一组正数和负数。我是否需要以某种方式使用np.sin()
才能获得此结果?极坐标图似乎还不够。
答案 0 :(得分:1)
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)
答案 1 :(得分:0)
我认为您想要的与这篇文章有关:
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
变量,而您的θ
必须是用圆除以数据集中的点数来获得的。
theta = 360 / len(ydata)
要验证结果点确实是距中心(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()