Изменение цвета скрипки скрипки matplotlib

Есть ли способ изменить цвет violin графиков в matplotlib?

Цвет по умолчанию - это "коричневатый" цвет, что не так уж плохо, но я хотел бы покрасить, например, первые три скрипок по-разному, чтобы выделить их. Я не вижу никаких параметров в документации. Любые идеи или хаки, чтобы покрасить скрипки по-разному?

enter image description here

Ответ 1

matplotlib.pyplot.violinplot() говорит, что он возвращает:

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

  • bodies: Перечень matplotlib.collections.PolyCollection экземпляров, содержащих заполненную площадь каждой скрипки.
  • [... среди других...]

Методы PolyCollection s включают:

  • set_color(c) который устанавливает как facecolor, так и edgecolor,
  • set_facecolor(c) и
  • set_edgecolor(c) все из которых принимают "matplotlib color arg или последовательность кортежей rgba",

Таким образом, похоже, что вы можете просто прокрутить список результатов результата и изменить цвет лица каждого из них:

violin_parts = plt.violinplot(...)

for pc in violin_parts['bodies']:
    pc.set_facecolor('red')
    pc.set_edgecolor('black')

Это немного странно, хотя вы не можете установить это, создавая его, как обычные типы сюжетов. Я предполагаю, что это возможно потому, что операция создает так много бит (вышеупомянутый PolyCollection вместе с 5 другими LineCollections), что дополнительные аргументы будут неоднозначными.

Ответ 2

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

rrred = '#ff2222'
bluuu = '#2222ff'
x = np.arange(2, 25)
y = np.array([xi * np.random.uniform(0, 1, 10**3) for xi in x]).T

# Create violin plot objects:
fig, ax = plt.subplots(1, 1, figsize = (8,8))
violin_parts = ax.violinplot(y, x, widths = 0.9, showmeans = True, showextrema = True, showmedians = True)

# Make all the violin statistics marks red:
for partname in ('cbars','cmins','cmaxes','cmeans','cmedians'):
    vp = violin_parts[partname]
    vp.set_edgecolor(rrred)
    vp.set_linewidth(1)

# Make the violin body blue with a red border:
for vp in violin_parts['bodies']:
    vp.set_facecolor(bluuu)
    vp.set_edgecolor(rrred)
    vp.set_linewidth(1)
    vp.set_alpha(0.5)

enter image description here