2016-05-18 5 views
2

Я хотел бы установить отдельные свойства (например, zorder и label) для определенного элемента matplotlib.collections.PathCollection. Я не мог найти способ в документации.Задайте свойства для конкретного патча в matplotlib.collections.PathCollection

Здесь я записываю случай пользователя.
Пусть у нас есть следующий фрагмент кода, и мы хотели бы, чтобы изменить zorder на красный мяч, доводя его до вершины, используя balls ручку, которая является matplotlib.collections.PathCollection.

balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4) 
plt.axis([-5, 5, -5, 5]) 

Overlapped balls

Кто-нибудь есть какие-либо идеи о том, как настроить индивидуальные пути в PathCollection?

Альтернативный вариант будет использовать plt.plot('o'), который фактически возвращает list ручек. К сожалению, решение plt.plot('o') не позволит мне установить другой цвет за мяч, так как все они будут принадлежать одному и тому же графику. Таким образом, потребуется цикл for.

Резкое решение, которое я держал пари, я пойду, так как мой срок, собирается из Inkscape:/

ответ

1

Не уверен, что это лучшее решение, но это может помочь вам.

Из того, что я вижу, paths в PathCollection всегда отображается в том порядке, в котором они созданы. Поэтому в вашем случае сначала создается path с x-позицией -1, затем с 1.

Вы можете переключить этот порядок после первоначально замышляет их, изменяя offsets, в вашем случае использования balls.set_offsets():

In [4]: balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4) 
In [5]: plt.axis([-5, 5, -5, 5]) 

Это создает следующую фигуру: enter image description here

In [42]: print balls.get_offsets() 
[[-1. 0.] 
[ 1. 0.]] 

On [43]: balls.set_offsets([[1,0],[-1,0]]) 

Теперь это имеет нанесенный левым шаром сверху правого шара:

enter image description here

Но, как вы можете видеть, это также переключило facecolors вокруг (поскольку мы установили его порядок в plt.scatter как ['r','b']. Там в решение этой проблемы, которое также переключить facecolors вокруг:

In [46]: balls.set_facecolors(['b','r']) 

enter image description here


Великий, так положить, что все вместе, мы можем определить функцию для переключения смещения и facecolors из любые два произвольных paths в PathCollection.

import matplotlib.pyplot as plt 

fig,ax = plt.subplots() 
balls = ax.scatter([-3, -1, 1, 3], [0, 0, 0, 0], c = ['r', 'b', 'g', 'm'], s = 4e4) 
ax.set_xlim(-6,6) 
ax.set_ylim(-6,6) 

plt.savefig('balls_01.png') 

def switch_scatter(pathcoll,a,b): 

    # Switch offsets 
    offsets = pathcoll.get_offsets()[:] 
    offsets[[a,b]] = offsets[[b,a]] 

    # Switch facecolors 
    facecolors = pathcoll.get_facecolors() 
    facecolors[[a,b]] = facecolors[[b,a]] 

    # Switch sizes 
    sizes = pathcoll.get_sizes() 
    sizes[[a,b]] = sizes[[b,a]] 

    # Set the new offsets, facecolors and sizes on the PathCollection 
    pathcoll.set_offsets(offsets) 
    pathcoll.set_facecolors(facecolors) 
    pathcoll.set_sizes(sizes) 

switch_scatter(balls,2,1) 

plt.savefig('balls_02.png') 

Heres balls_01.png:

enter image description here

А вот balls_02.png (где мы переключаемся мяч 1 и мяч 2 (синие и зеленые шары)

enter image description here


A fina l примечание: если у вас есть другие свойства, различающиеся по вашему разбросу (например, linecolor), вам также необходимо будет переключить их в функции, определенную выше.

+0

OMG! Удивительно! Случилось так, что маленький шарик скрывался под более крупным, и я хотел избежать изменения порядка моих данных и цветов, поскольку они используются в другом месте. В линейном графике я использовал 'zorder', но здесь я не мог справиться с ситуацией таким же образом. Я буду использовать ваше решение, но я попытаюсь понять вашу функцию после крайнего срока, хотя объяснение на английском языке имеет смысл. Большое спасибо за то, что я наблюдал за моей спиной! – Atcold

+0

Вопрос: как вы узнали о 'offsets'? Просто чтобы понять ваш modus operandi. – Atcold

+0

Для полноты: '# Размеры переключателей'' size = pathcoll.get_sizes() '' размеры [[a, b]] = размеры [[b, a]] ', а затем' pathcoll.set_sizes (размеры) '. – Atcold