python-密度プロットの平均線のy軸制限を一般化する
Aug 18 2020
私はこの単純なデータフレームを持っています:
df = pd.DataFrame({"X": np.random.randint(50,53,size=100),
"Y": np.random.randint(200,300,size=100),
"Z": np.random.randint(400,800,size=100)})
そして、私は多くの列(それらはすべて数値)を持っているので、特定のプロットを行うためにこのループを実行しました:
for i in df.columns:
data = df[i]
data.plot(kind="kde")
plt.vlines(x=data.mean(),ymin=0, ymax=0.01, linestyles="dotted")
plt.show()
ただし、各プロットの平均vlineを適宜プロットするには、各密度プロットの最大y軸値を取得する必要があるため、のymax
引数を一般化しようとして問題が発生していますplt.vlines()
。で試しましたnp.argmax()
が、うまくいかないようです。
助言がありますか?
回答
3 Ynjxsjmh Aug 18 2020 at 16:05
pandas.DataFrame.plot()matplotlib.axes.Axesオブジェクトを返します。get_ylim()関数を使用して、yminとymaxを取得できます。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"X": np.random.randint(50,53,size=100),
"Y": np.random.randint(200,300,size=100),
"Z": np.random.randint(400,800,size=100)})
for i in df.columns:
data = df[i]
ax = data.plot(kind="kde")
ymin, ymax = ax.get_ylim()
plt.vlines(x=data.mean(),ymin=ymin, ymax=ymax, linestyles="dotted")
plt.show()
2 JohanC Aug 18 2020 at 16:20
平均に対応するkdeの値を取得するには、プロットから曲線を抽出し、平均の位置でそれを補間することができます。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({"X": 20 + np.random.randint(-1, 2, size=100).cumsum(),
"Y": 30 + np.random.randint(-1, 2, size=100).cumsum(),
"Z": 40 + np.random.randint(-1, 2, size=100).cumsum()})
fig, ax = plt.subplots()
for col in df.columns:
data = df[col]
data.plot(kind="kde", ax=ax)
x = data.mean()
kdeline = ax.lines[-1]
ymax = np.interp(x, kdeline.get_xdata(), kdeline.get_ydata())
ax.vlines(x=data.mean(), ymin=0, ymax=ymax, linestyles="dotted")
ax.set_ylim(ymin=0) # ax.vlines() moves the bottom ylim; set it back to 0
plt.show()

1 ALollz Aug 18 2020 at 16:01
を使用しplt.axvlineます。[0,1]の範囲の数値として制限を指定します。0はプロットの下部、1は上部です。
for i in df.columns:
data = df[i]
data.plot(kind="kde")
plt.axvline(data.mean(), 0, 1, linestyle='dotted', color='black')
plt.show()
