Python координаты равномерно разбросаны вокруг фиксированного центра в зависимости от расстояния - PullRequest
1 голос
/ 27 мая 2020

Я хочу разбросать множество точек данных вокруг центральной (2.5,2.5) на основе заданного расстояния для каждой точки данных до центра. Как мне это сделать, а также избежать дубликатов / равномерно распределить их по центру?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 27 мая 2020
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6, 6))

N = 120
angles = np.linspace(0, 2 * np.pi, N)
c_x, c_y = (2.5, 2.5)
x_s, y_s = [], []


distances = list(np.arange(0, 5.5, 0.5))

for distance in distances:
    for angle in angles:
        x_s.append(c_x + distance * np.cos(angle))
        y_s.append(c_y + distance * np.sin(angle))

    plt.scatter(x_s, y_s, c="b", s=4)
plt.show()

enter image description here

1 голос
/ 28 мая 2020

Чтобы прояснить, я хотел по одной точке для каждого расстояния, а затем следующее смещение на 180 или 90 градусов. Но мне удалось завершить его на основе кода, предоставленного Густавом Расмуссеном:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6, 6))

#default
N = 50

angles = np.linspace(0, 2 * np.pi, N)
c_x, c_y = (2.5, 2.5)
x_s, y_s = [], []

distances = list(np.arange(0, 5.5, 0.01))
i = angles.size/4

for distance in distances:
    x_s.append(c_x + distance * np.cos(i))
    y_s.append(c_y + distance * np.sin(i))
    i += i
    plt.scatter(x_s, y_s, c="b", s=4)
plt.show()

Here we can see 550 distances, displayed with the next one being displayed offset by approximately 90 degrees

Здесь мы можем видеть 550 расстояний, отображаемых следующим один отображается со смещением примерно на 90 градусов.

Последнее упоминание: при работе с набором данных с большими отклонениями лучше сделать i = angles.size/2, чтобы выходные данные были несколько обведены

1 голос
/ 28 мая 2020
import cmath
import numpy as np
from matplotlib import pyplot as plt
from itertools import starmap

c = np.array(list(starmap(cmath.rect, [(v//40+1, v*np.pi/20) for v in range(120)])))
x = c.real+2.5
y = c.imag+2.5
plt.scatter(x, y)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...