Python, matplotlib, разбрасывать объекты по точкам, установленным в качестве атрибутов - PullRequest
1 голос
/ 09 апреля 2020

У меня есть объекты, которые включают в себя координату x, координату y и некоторую другую информацию, такую ​​как цвет:

import numpy as np
import matplotlib.pyplot as plt

N = 10


class Point:
    def __init__(self, x_axis, y_axis, color, add_info):
        self.x_axis = x_axis
        self.y_axis = y_axis
        self.color = color
        self.add_info = add_info


points = np.empty([N], dtype=Point)

for i in range(N):
    points[i] = Point(np.random.uniform(0, 1), np.random.uniform(0, 1), 'red', 1) # only exemplary 'red' and 1 here

Как мне разбросать эти объекты, т.е. точки, и, например, установить цвет точки до красного, если color == 'red'?

Я новичок в работе с matplot и до сих пор все, что я пробовал, приводило к синтаксическим ошибкам ... Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2020

plt.scatter нужен массив (или список) x-координат и массив y-координат. При желании может быть установлен массив цветов. С учетом Class код может выглядеть следующим образом:

import numpy as np
import matplotlib.pyplot as plt

class Point:
    def __init__(self, x_axis, y_axis, color, add_info):
        self.x_axis = x_axis
        self.y_axis = y_axis
        self.color = color
        self.add_info = add_info

N = 10
points = np.empty([N], dtype=Point)

for i in range(N):
    points[i] = Point(np.random.uniform(0, 1), np.random.uniform(0, 1),
                      np.random.choice(['red', 'green', 'blue', 'magenta']), 1)

plt.scatter([p.x_axis for p in points], [p.y_axis for p in points], c=[p.color for p in points])
plt.show()

sample plot

Хотя это интересный пример изучения работы классов, этот Способ хранения отдельных точек довольно неэффективен в использовании памяти и времени. Не рекомендуется, когда есть много точек или когда требуются сложные вычисления.

При желании класс также может получить функцию рисования. Это становится очень медленным, когда есть тысячи точек, но может показать концепцию с несколькими точками. Также обратите внимание, что в Python списки редко пересекаются с индексами, но, скорее, путем прямой итерации значений:

import numpy as np
import matplotlib.pyplot as plt

class Point:
    def __init__(self, x_axis, y_axis, color, add_info):
        self.x_axis = x_axis
        self.y_axis = y_axis
        self.color = color
        self.add_info = add_info

    def draw(self):
        plt.scatter(self.x_axis, self.y_axis, c=self.color)

N = 10
points = [Point(np.random.uniform(0, 1), np.random.uniform(0, 1),
                      np.random.choice(['red', 'green', 'blue', 'magenta']), 1) for _ in range(N)]
for p in points:
    p.draw()
plt.show()
...