अजगर - घनत्व भूखंडों में औसत रेखा के लिए 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()

हालाँकि, मुझे ymaxतर्क को सामान्य बनाने की कोशिश करने में परेशानी हो रही है plt.vlines(), क्योंकि मुझे प्रत्येक प्लॉट के अधिकतम y- अक्ष का मूल्य प्राप्त करने की आवश्यकता है ताकि उसके अनुसार प्रत्येक प्लॉट के माध्य vline को प्लॉट किया जा सके। मैंने कोशिश की है 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()