web-dev-qa-db-ja.com

matplotlibのバイオリン図の色を変更する

Matplotlibのviolinプロットの色を変更する方法はありますか?

デフォルトの色はこの「茶色」の色で、それほど悪くはありませんが、たとえば最初の3つのバイオリンを異なる色で強調して強調したいと思います。 documentation にパラメータが見つかりません。バイオリンの色を変えるためのアイデアやハックはありますか?

enter image description here

18
user2489252

matplotlib.pyplot.violinplot() はそれが返すと言います:

バイオリン図の各コンポーネントを、作成された対応するコレクションインスタンスのリストにマッピングする辞書。辞書には次のキーがあります。

  • bodies:各バイオリンの塗りつぶされた領域を含む_matplotlib.collections.PolyCollection_インスタンスのリスト。
  • [...とりわけ...]

PolyCollections のメソッドは次のとおりです。

  • set_color(c) これはfacecolorとedgecolorの両方を設定します。
  • set_facecolor(c) および
  • set_edgecolor(c) これらはすべて「matplotlibカラー引数またはrgbaタプルのシーケンス」を取ります

したがって、結果の本文リストをループして、それぞれの顔の色を変更できるように見えます。

_violin_parts = plt.violinplot(...)

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

一般的なプロットタイプのように作成するときにこれを設定できないのは少し奇妙です。おそらく、操作によって非常に多くのビットが作成されるため(前述のPolyCollectionと他の5つのLineCollections)、追加の引数があいまいになるためだと思います。

29
Nick T
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

7
JoelBondurant