अजगर - घनत्व भूखंडों में औसत रेखा के लिए y- अक्ष सीमा को सामान्य करना
मेरे पास यह सरल डेटाफ़्रेम है:
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()
हालाँकि, मुझे ymax
तर्क को सामान्य बनाने की कोशिश करने में परेशानी हो रही है plt.vlines()
, क्योंकि मुझे प्रत्येक प्लॉट के अधिकतम y- अक्ष का मूल्य प्राप्त करने की आवश्यकता है ताकि उसके अनुसार प्रत्येक प्लॉट के माध्य vline को प्लॉट किया जा सके। मैंने कोशिश की है np.argmax()
, लेकिन यह काम नहीं करता है।
कोई सुझाव?
जवाब
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()
माध्य के अनुरूप 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()
का उपयोग करें 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()