Python - построить прямоугольники известного размера в точках разброса - PullRequest
0 голосов
/ 28 августа 2018

У меня есть набор очков:

a = ([126, 237, 116, 15, 136, 348, 227, 247, 106, 5, -96, 25, 146], [117, 127, 228, 107, 6, 137, 238, 16, 339, 218, 97, -4, -105])

И я делаю их рассеянный график примерно так:

    fig = plt.figure(figsize = (15,6))
    ax = fig.add_subplot(111)
    ax.scatter(a[0], a[1], color = 'red', s=binradius)

Что делает этот участок:

enter image description here

-

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

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

enter image description here

Могу ли я сделать это с scatter? Или есть другой способ, которым я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Хотя ответ @ ralf-htp приятный и чистый и использует scatter, насколько я знаю, шкала маркеров выражена в points (см., Например, здесь ). Более того, при увеличении пользовательские маркеры не изменят размер.

Может быть, это именно то, что вы ищете. Если нет, то использование отдельных Rectangle объектов также отлично работает. Это позволяет вам указывать ширину и высоту в единицах данных, а не в точках, и вы можете увеличивать масштаб. При необходимости также легко применить вращение, установив атрибут angle:

from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle

# Your data
a = ([126, 237, 116, 15, 136, 348, 227, 247, 106, 5, -96, 25, 146],
     [117, 127, 228, 107, 6, 137, 238, 16, 339, 218, 97, -4, -105])

# Your scatter plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(a[0], a[1], color = 'red', s=10)

# Add rectangles
width = 30
height = 20
a_zipped = zip(*a)
for a_x, a_y in a_zipped:
    ax.add_patch(Rectangle(xy=(a_x-width/2, a_y-height/2) ,width=width, height=height, linewidth=1, color='blue', fill=False))
ax.axis('equal')
plt.show()

Результат: scatter plot with blue rectangles

Примечание. При необходимости вы можете получить экземпляры Rectangle через ax.get_children().

0 голосов
/ 28 августа 2018

вы можете определить маркеры в опции verts, равной matplotlib.pyplot.scatter, как в Понимание вершин матплотлиба и https://matplotlib.org/gallery/lines_bars_and_markers/scatter_custom_symbol.html

verts: последовательность (x, y), необязательно

Если маркер None [это не совсем работает, ср Понимание вершин matplotlib ], эти вершины будут использованы для построения маркера. Центр маркер расположен в (0, 0) в нормализованных единицах. Общий маркер изменен на s.

источник: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html

Однако я не уверен, как точно определить маркеры, которые вы нарисовали, вам нужно создать list, который содержит нужный маркер пиксель за пикселем

прямоугольник с verts:

verts = list(zip([-10.,10.,10.,-10],[-5.,-5.,5.,5]))
ax.scatter([0.5,1.0],[1.0,2.0], marker=(verts,0))

источник: Понимание вершин matplotlib

...