Matplotlib:透明なヒストグラムと透明でないエッジのプロット
ヒストグラムをプロットしていますが、一緒にプロットしたい3つのデータセットがあり、それぞれが異なる色と線種(破線、点線など)を持っています。また、オーバーラップするバーを見るために、ある程度の透明度を与えています。
ポイントは、内側の部分のように各バーのエッジが透明にならないようにすることです。以下に例を示します。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(20)
y =np.random.random(20)
z= np.random.random(20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', alpha = 0.5, lw=3, color= 'b')
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', alpha = 0.5, lw=3, color= 'r')
ax.hist(z, bins=np.arange(0, 1, 0.1), alpha = 0.5, lw=3, color= 'k')
ax.set_xlim(-0.5, 1.5)
ax.set_ylim(0, 7)
plt.show()
plt.hist
は、 matplotlib.patches.Patch
のコンストラクターに渡される追加のキーワード引数を受け入れます。特に、ヒストグラムを作成するときにfc=
タプルを使用してパッチのフェースカラーを設定できる(R, G, B, A)
引数を渡すことができます。フェースカラーのアルファ値を変更しても、エッジの透明度には影響しません。
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, fc=(0, 0, 1, 0.5))
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, fc=(1, 0, 0, 0.5))
ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, fc=(0, 0, 0, 0.5))
おそらく最も愚かな解決策が最も簡単で最高だと思いますか?内側の色とアルファなしでヒストグラムを再プロットするだけです。ヒストグラムの線だけを再プロットする必要があります。
さらに、最初のヒストグラムプロットから完全に削除することにより、線/破線/ドットが重ならないようにすることができます。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(20)
y = np.random.random(20)
z = np.random.random(20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(x, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'b')
ax.hist(y, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'r')
ax.hist(z, bins=np.arange(0, 1, 0.1), edgecolor="None", alpha = 0.5, color= 'k')
ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, facecolor="None")
ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, facecolor="None")
ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, facecolor="None")
plt.show()
2番目の順序がなければ、グラフは境界線のない図のように見えるはずです。下の3つのヒストグラムコマンドを使用すると、画像が表示されるように境界線が追加されます。 Python3.4 Win7で動作します
[写真を投稿するのに十分な担当者がいないようだからカット]
色を明示的に設定する必要のないソリューションが必要でした。つまり、デフォルトの色サイクルを引き続き使用したかったのです。次のソリューションは、@ ALi_mのアイデアを使用してヒストグラムを2回描画し、カラーサイクルの状態を抽出するという@ljetiboのアイデアに基づいています。
# increment and get the "props" cycle (and extract the color)
color = next(ax._get_lines.prop_cycler)["color"]
# 1. draw: inner area with alpha
ax.hist(data, color=color, alpha=0.3)
# 2. draw: only edges with full color
ax.hist(data, color=color, edgecolor=color, fc="None", lw=1)
edgecolor
に加えてcolor=color
を指定する必要があることに注意してください。そうでない場合、hist
呼び出し自体がカラーサイクルを再度インクリメントします。