Изменить определенный патч в коллекции Matplotlib PatchCollection - PullRequest
0 голосов
/ 27 января 2019

Предположим, что я использую стороннюю функцию magic_plot(data, ax), которая добавляет коллекцию патчей к осям на основе предоставленных данных. Далее предположим, что я хочу изменить цвет определенного патча, который был добавлен. Как я могу это сделать?

from numpy.random import rand

from matplotlib.collections import PatchCollection
from matplotlib.patches import Circle
import matplotlib.pyplot as plt

def magic_plot(data, ax):
    """
    A third-party plotting function, not modifiable by end-users. 
    """
    lst = []
    for i in range(10):
        patch = Circle((rand(), rand()), rand())
        lst.append(patch)
    collection = PatchCollection(lst)
    ax.add_collection(collection)

ax = plt.gca()
data = rand(100)

# create the plot:
magic_plot(data, ax)

# obtain the PatchCollection created by magic_plot():
collection = ax.collections[0]

Как показано выше, я могу извлечь коллекцию из осей из ax.collections, но как мне продолжить отсюда?

Я предполагаю, что мне нужен доступ к списку патчей, которые хранятся в этом PatchCollection объекте. Однако в ответе на аналогичный вопрос "matplotlib change a Patch in PatchCollection" было предложено использовать подкласс PatchCollection, который отслеживает патчи, добавленные к нему в атрибуте открытого списка , но с учетом того, что коллекция создается в сторонней функции, это решение не подходит в моем случае.

1 Ответ

0 голосов
/ 27 января 2019

Обновление формы патчей вряд ли возможно, как показано в связанном вопросе.Тем не менее, здесь вы хотите изменить цвет патча.Это должно быть намного проще.

В конкретном примере из этого вопроса это будет достигнуто просто путем установки facecolor коллекции.

import numpy as np
np.random.seed(50)

from matplotlib.collections import PatchCollection
from matplotlib.patches import Circle
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

def magic_plot(data, ax):
    """
    A third-party plotting function, not modifiable by end-users. 
    """
    lst = []
    for i in range(10):
        patch = Circle((np.random.rand(), np.random.rand()), np.random.rand()/9)
        lst.append(patch)
    collection = PatchCollection(lst)
    ax.add_collection(collection)

ax = plt.gca()
data = np.random.rand(100)

# create the plot:
magic_plot(data, ax)
ax.autoscale()

# obtain the PatchCollection created by magic_plot():
collection = ax.collections[0]

n = len(collection.get_paths())
facecolors = collection.get_facecolors()
if len(facecolors) == 1 and n != 1:
    facecolors = np.array([facecolors[0]] * n)

# change the facecolor of the fourth patch (index=3)
facecolors[3] = mcolors.to_rgba("crimson")
collection.set_facecolor(facecolors)

plt.show()

enter image description here

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