Я хочу превратить прямоугольный график (диаграмму) в круговую диаграмму, подобную этой:

На самом деле я не собираюсь преобразовывать настоящую графическую диаграмму, я просто пытаюсь преобразовать базовые данные: координаты (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(), чтобы получить такой результат? Кажется, полярной карты недостаточно.
@ReblochonMasque Извините, я действительно плохо разбираюсь в математике, вы можете немного уточнить? Я думаю, что понимаю использование y как расстояние от начала координат, но x -> [0,2 * pi] я не понимаю. x - это одно число, как я могу сопоставить его со списком [0, 2 * pi], а 2pi не даст ли мне просто увеличивающийся x? можешь немного уточнить? кроме того, мне нужны базовые данные, и я не знаю, как получить их из pyplot, я знаю только, как визуализировать график.






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)
Я думаю, что то, что вы хотите, связано с этим сообщением:
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()
Оператор по модулю.