मैं पंडों डेटाफ़्रेम को सबप्लॉट के रूप में अलग कैसे कर सकता हूं?


129

मेरे पास कुछ पंडों के डेटाफ्रेम एक ही मूल्य पैमाने पर साझा करने के लिए हैं, लेकिन विभिन्न कॉलम और सूचकांक हैं। आह्वान करते समय df.plot(), मुझे अलग-अलग कथानक चित्र मिलते हैं। मैं वास्तव में चाहता हूं कि उन सभी को एक ही भूखंड में सबप्लॉट के रूप में रखा जाए, लेकिन मैं दुर्भाग्य से एक समाधान के साथ आने में विफल रहा हूं कि कैसे और कुछ मदद की बहुत सराहना करेंगे।

जवाबों:


252

आप मैन्युअल रूप से matplotlib के साथ सबप्लॉट बना सकते हैं, और फिर axकीवर्ड का उपयोग करके एक विशिष्ट सबप्लॉट पर डेटाफ्रेम प्लॉट कर सकते हैं। 4 सबप्लॉट्स (2x2) के लिए उदाहरण के लिए:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)

df1.plot(ax=axes[0,0])
df2.plot(ax=axes[0,1])
...

यहां axesएक सरणी है जो अलग-अलग सबप्लॉट कुल्हाड़ियों को रखती है, और आप केवल अनुक्रमण द्वारा पहुंच सकते हैं axes
आप एक साझा x- अक्ष चाहते हैं, तो आप प्रदान कर सकते हैं sharex=Trueकरने के लिए plt.subplots


33
ध्यान दें कि, .subplots()नाराजगी से, आपके द्वारा बनाए जा रहे सबप्लॉट के सरणी के आयामों के आधार पर विभिन्न समन्वय प्रणालियों को लौटाता है। तो अगर आप subplots जहां, कहते हैं, वापसी nrows=2, ncols=1, आप सूचकांक करने के लिए कुल्हाड़ियों के रूप में की आवश्यकता होगी axes[0]और axes[1]। देखें stackoverflow.com/a/21967899/1569221
canary_in_the_data_mine

3
@canary_in_the_data_mine धन्यवाद, यह वास्तव में कष्टप्रद है ... आपकी टिप्पणी ने मुझे कुछ समय बचाया :) यह पता नहीं चल सका कि मुझे क्यों मिल रहा थाIndexError: too many indices for array
snd

9
@canary_in_the_data_mine यदि डिफ़ॉल्ट तर्क .subplot()का उपयोग किया जाता है तो यह केवल कष्टप्रद है। हमेशा पंक्तियों और बस्तियों के किसी भी मामले में वापस जाने के squeeze=Falseलिए बाध्य करें । .subplot()ndarray
मार्टिन

73

आप उदाहरण देख सकते हैं। में प्रलेखन प्रदर्शन जोरिस जवाब। प्रलेखन से भी, आप भी सेट कर सकते हैं subplots=Trueऔर layout=(,)पांडा plotसमारोह के भीतर :

df.plot(subplots=True, layout=(1,2))

आप यहाँfig.add_subplot() पोस्ट में बताए अनुसार 221, 222, 223, 224 इत्यादि जैसे सबप्लेट ग्रिड पैरामीटर का उपयोग कर सकते हैं । सब-प्लॉट्स सहित पांडा डेटा फ्रेम पर प्लॉट के अच्छे उदाहरण इस आइपियन नोटबुक में देखे जा सकते हैं ।


2
हालांकि joris का उत्तर सामान्य matplotlib उपयोग के लिए बहुत अच्छा है, यह त्वरित डेटा विज़ुअलाइज़ेशन के लिए पांडा का उपयोग करने के इच्छुक किसी भी व्यक्ति के लिए उत्कृष्ट है। यह सवाल को थोड़ा बेहतर बनाने के साथ इनलाइन भी फिट बैठता है।
लिटिल बॉबी टेबल्स

ध्यान रखें कि subplotsऔर layoutkwargs केवल एक डेटाफ़्रेम के लिए कई प्लॉट उत्पन्न करेंगे। यह संबंधित है, लेकिन ओपी के एक ही प्लॉट में कई डेटाफ्रेम प्लॉट करने के सवाल का समाधान नहीं है।
ऑस्टिन ए

1
शुद्ध पंडों के उपयोग के लिए यह बेहतर उत्तर है। इसके लिए सीधे मेटप्लोटलिब को आयात करने की आवश्यकता नहीं है (हालांकि आपको आमतौर पर वैसे भी) और मनमाने आकार के लिए लूपिंग की आवश्यकता नहीं होती है ( layout=(df.shape[1], 1)उदाहरण के लिए उपयोग कर सकते हैं )।
अनातोली मकारिविच

20

आप परिचित matplotlib शैली एक बुला उपयोग कर सकते हैं figureऔर subplotहै, लेकिन आप बस का उपयोग कर मौजूदा अक्ष निर्दिष्ट करने की आवश्यकता plt.gca()। एक उदाहरण:

plt.figure(1)
plt.subplot(2,2,1)
df.A.plot() #no need to specify for first axis
plt.subplot(2,2,2)
df.B.plot(ax=plt.gca())
plt.subplot(2,2,3)
df.C.plot(ax=plt.gca())

आदि...


7

आप सभी डेटा फ़्रेमों की एक सूची बनाने की एक सरल चाल के साथ matplotlib का उपयोग करके कई पांडा डेटा फ़्रेम के कई सबप्लॉट प्लॉट कर सकते हैं। फिर सबप्लॉट्स की साजिश रचने के लिए लूप का उपयोग करना।

काम कोड:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# dataframe sample data
df1 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df2 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df3 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df4 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df5 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df6 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
#define number of rows and columns for subplots
nrow=3
ncol=2
# make a list of all dataframes 
df_list = [df1 ,df2, df3, df4, df5, df6]
fig, axes = plt.subplots(nrow, ncol)
# plot counter
count=0
for r in range(nrow):
    for c in range(ncol):
        df_list[count].plot(ax=axes[r,c])
        count=+1

यहाँ छवि विवरण दर्ज करें

इस कोड का उपयोग करके आप किसी भी कॉन्फ़िगरेशन में सबप्लॉट्स को प्लॉट कर सकते हैं। आपको केवल पंक्तियों की nrowसंख्या और स्तंभों की संख्या को परिभाषित करने की आवश्यकता है ncol। इसके अलावा, आपको उन डेटा फ़्रेमों की सूची बनाने की आवश्यकता है df_listजिन्हें आप प्लॉट करना चाहते थे।


2
पिछली पंक्ति में टाइपो पर ध्यान दें: यह नहीं है count =+1लेकिनcount +=1
PEBKAC

4

आप इसका उपयोग कर सकते हैं:

fig = plt.figure()
ax = fig.add_subplot(221)
plt.plot(x,y)

ax = fig.add_subplot(222)
plt.plot(x,z)
...

plt.show()

3

आपको पंडों का उपयोग करने की आवश्यकता नहीं हो सकती है। यहाँ बिल्ली आवृत्तियों का एक matplotlib साजिश है:

यहाँ छवि विवरण दर्ज करें

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

f, axes = plt.subplots(2, 1)
for c, i in enumerate(axes):
  axes[c].plot(x, y)
  axes[c].set_title('cats')
plt.tight_layout()

1

ऊपर @joris प्रतिक्रिया पर निर्माण, यदि आप पहले से ही सबप्लॉट के लिए एक संदर्भ स्थापित कर चुके हैं, तो आप संदर्भ का भी उपयोग कर सकते हैं। उदाहरण के लिए,

ax1 = plt.subplot2grid((50,100), (0, 0), colspan=20, rowspan=10)
...

df.plot.barh(ax=ax1, stacked=True)

0

लंबे समय (सुव्यवस्थित) डेटा के साथ डेटाफ्रेम के एक शब्दकोश से कई भूखंड कैसे बनाएं

  • मान्यताओं

    • सुव्यवस्थित डेटा के कई डेटाफ्रेम का एक शब्दकोश है
      • फाइलों से पढ़कर बनाया गया
      • एक ही डेटाफ़्रेम को कई डेटाफ़्रेम में अलग करके बनाया गया
    • श्रेणियां, catओवरलैपिंग हो सकती हैं, लेकिन सभी डेटाफ़्रेम में सभी मान शामिल नहीं हो सकते हैंcat
    • hue='cat'
  • क्योंकि डेटाफ्रेम के माध्यम से पुनरावृत्त किया जा रहा है, इसलिए यह गारंटी नहीं है कि प्रत्येक प्लॉट के लिए रंगों को समान रूप से मैप किया जाएगा

    • एक कस्टम रंग मानचित्र को विशिष्ट से बनाया जाना चाहिए 'cat' सभी डेटाफ्रेम के लिए मानों
    • चूंकि रंग समान होंगे, प्रत्येक भूखंड में एक किंवदंती के बजाय भूखंडों के किनारे पर एक किंवदंती रखें

आयात और सिंथेटिक डेटा

import pandas as pd
import numpy as np  # used for random data
import random  # used for random data
import matplotlib.pyplot as plt
from matplotlib.patches import Patch  # for custom legend
import seaborn as sns
import math import ceil  # determine correct number of subplot


# synthetic data
df_dict = dict()
for i in range(1, 7):
    np.random.seed(i)
    random.seed(i)
    data_length = 100
    data = {'cat': [random.choice(['A', 'B', 'C']) for _ in range(data_length)],
            'x': np.random.rand(data_length),
            'y': np.random.rand(data_length)}
    df_dict[i] = pd.DataFrame(data)


# display(df_dict[1].head())

  cat         x         y
0   A  0.417022  0.326645
1   C  0.720324  0.527058
2   A  0.000114  0.885942
3   B  0.302333  0.357270
4   A  0.146756  0.908535

कलर मैपिंग और प्लॉट बनाएं

# create color mapping based on all unique values of cat
unique_cat = {cat for v in df_dict.values() for cat in v.cat.unique()}  # get unique cats
colors = sns.color_palette('husl', n_colors=len(unique_cat))  # get a number of colors
cmap = dict(zip(unique_cat, colors))  # zip values to colors

# iterate through dictionary and plot
col_nums = 3  # how many plots per row
row_nums = math.ceil(len(df_dict) / col_nums)  # how many rows of plots
plt.figure(figsize=(10, 5))  # change the figure size as needed
for i, (k, v) in enumerate(df_dict.items(), 1):
    plt.subplot(row_nums, col_nums, i)  # create subplots
    p = sns.scatterplot(data=v, x='x', y='y', hue='cat', palette=cmap)
    p.legend_.remove()  # remove the individual plot legends
    plt.title(f'DataFrame: {k}')

plt.tight_layout()
# create legend from cmap
patches = [Patch(color=v, label=k) for k, v in cmap.items()]
# place legend outside of plot; change the right bbox value to move the legend up or down
plt.legend(handles=patches, bbox_to_anchor=(1.06, 1.2), loc='center left', borderaxespad=0)
plt.show()

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.