Разделение точечной диаграммы на участки с интервалами 360/7 градусов - PullRequest
0 голосов
/ 01 марта 2020

Я нанёс набор точек из набора данных на график рассеяния. Эти точки представляют «попадания» на детектор (с размерами 2000 мм х 2000 мм), так что каждое попадание представляет собой заданные координаты c x и y на детекторе, соответствующие тому, где приземлилась частица. Центр графика равен (0,0), тогда как движение влево ведет к отрицательным значениям x, а движение вправо - к положительным значениям x. Вверх также положительные значения у, а вниз отрицательные значения у. Я пытаюсь разделить этот график на 7 секций, каждая линия начинается от центра графика (0,0) и продолжается до края графика (так что R = 2000). Каждая линия должна быть отделена 2pi / 7 радами (или 360/7 градусами), чтобы все точки могли быть организованы в эти секции.

Я понятия не имею, как начать, так как я относительно новичок с python , Я приложил изображение того, как выглядит сам график, а также код, который я написал для этого графика. Все помогает, спасибо всем.

c1 = np.logical_and(np.logical_and((hitpz1 > 0), (hitdet1 == (Detector))), (hitpid1 == 11))
plt.plot(hitx1[c1].flatten(), hity1[c1].flatten(), '.', color = 'g')
plt.ylabel("Particle Y Position (mm)")
plt.xlabel("Particle X Position (mm)")
plt.title("Particle by Radial Position, (Detector 28, Elastic)")
plt.xlim(-2000,2000)
plt.ylim(-2000,2000)
plt.show()

resulting plot

1 Ответ

0 голосов
/ 01 марта 2020

Линии могут быть представлены и нарисованы через коллекцию линий. Поскольку график, по-видимому, имеет некоторую вращательную симметрию, может быть полезно установить соотношение сторон 1.

Альтернативой рисованию линий может быть цвет точек в зависимости от их зоны.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

# first, create some dummy test data
N = 500
theta = np.random.normal(0, 0.15, N) + np.random.randint(0, 7, N) * 2 * np.pi / 7 + np.pi
r = np.random.normal(1, 0.2, N) ** 2 * 1000
x = r * np.cos(theta)
y = r * np.sin(theta)

fig, axes = plt.subplots(ncols=2, figsize=(9, 4))

for ax in axes:
    if ax == axes[0]:
        ax.scatter(x, y, color='limegreen', s=5)
        # create and draw seven line segments
        segs = np.zeros((14, 2))
        for i in range(0, 14, 2):
            segs[i, 0] = 5000 * np.cos(2 / 7 * i * np.pi)
            segs[i, 1] = 5000 * np.sin(2 / 7 * i * np.pi)
        line_segments = LineCollection([segs], linewidths=1, colors='crimson', linestyle='solid')
        ax.add_collection(line_segments)
    else:
        # color each dot depending on its zone
        z = np.floor((theta) / (2 * np.pi) * 7)
        cmap = plt.cm.get_cmap('Set1', 7)
        ax.scatter(x, y, c=z, cmap=cmap, s=5)
    ax.set_ylabel("Particle Y Position (mm)")
    ax.set_xlabel("Particle X Position (mm)")
    ax.set_title("Particle by Radial Position")
    ax.set_xlim(-2000, 2000)
    ax.set_ylim(-2000, 2000)
    ax.set_aspect(1)
plt.tight_layout()
plt.show()

resulting plot

...