আমি কীভাবে সাবপ্লট হিসাবে পৃথক পান্ডাস ডেটা ফ্রেম প্লট করতে পারি?


129

আমার কাছে কয়েকটি পান্ডাস ডেটা ফ্রেম একই মান স্কেল ভাগ করে নিচ্ছে তবে বিভিন্ন কলাম এবং সূচক রয়েছে। যখন অনুরোধ করা হয় df.plot(), তখন আমি পৃথক প্লটের চিত্র পাই। আমি সত্যিই যা চাই তা হ'ল তাদের সকলকে সাবপ্লোটের মতো একই প্লটটিতে রাখুন, তবে আমি দুর্ভাগ্যক্রমে কোনও সমাধান কীভাবে করতে এবং কিছুটা সাহায্যের প্রশংসা করব তা নিয়ে ব্যর্থ হচ্ছি।

উত্তর:


250

আপনি ম্যাটপ্লটলিব দিয়ে ম্যানুয়ালি সাবপ্লটগুলি তৈরি করতে পারেন এবং তারপরে 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
আপনি যদি একটি ভাগ করা এক্স-অক্ষ চান, তবে আপনি এটি সরবরাহ করতে sharex=Trueপারেন plt.subplots


33
নোট করুন, বিরক্তিকরভাবে, .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
@ ক্যানারি_ইন_টি_ডাটা_মিনাই কেবল বিরক্তিকর যদি এর জন্য ডিফল্ট যুক্তি ব্যবহার .subplot()করা হয়। সারি এবং কোলসের যে কোনও ক্ষেত্রে সর্বদা একটি ফেরত squeeze=Falseদিতে বল প্রয়োগ করুন । .subplot()ndarray
মার্টিন

73

আপনি egs দেখতে পারেন মধ্যে ডকুমেন্টেশন প্রদর্শক Joris উত্তর। এছাড়াও ডকুমেন্টেশন থেকে, আপনি পান্ডাস ফাংশনটি সেট subplots=Trueএবং এর মধ্যেও করতে পারেন : layout=(,)plot

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

আপনি এখানেfig.add_subplot() পোস্টে বর্ণিত যেমন 221, 222, 223, 224 ইত্যাদির মতো সাবপ্লট গ্রিড প্যারামিটারগুলি গ্রহণ করতে পারেন তাও ব্যবহার করতে পারেন । সাবপ্লটস সহ পান্ডাস ডেটা ফ্রেমে প্লটের দুর্দান্ত উদাহরণগুলি এই আইপথন নোটবুকটিতে দেখা যাবে ।


2
যদিও জরিসের উত্তরটি সাধারণ ম্যাটপ্ল্লোব ব্যবহারের জন্য দুর্দান্ত তবে যে কেউ দ্রুত ডেটা ভিজ্যুয়ালাইজেশনের জন্য পান্ডা ব্যবহার করতে চান তাদের পক্ষে এটি দুর্দান্ত is এটি প্রশ্নের সাথে আরও কিছুটা ভালভাবে ইনলাইন ফিট করে।
লিটল ববি টেবিল

মনে রাখবেন যে subplotslayoutকাওয়ারগণ একক ডেটাফ্রেমের জন্য একাধিক প্লট তৈরি করবে। এটি সম্পর্কিত, তবে একক প্লটে একাধিক ডেটা ফ্রেম প্লট করার ওপির প্রশ্নের সমাধান নয়।
অস্টিন এ 13

1
খাঁটি পান্ডাস ব্যবহারের জন্য এটি আরও ভাল উত্তর। এর জন্য সরাসরি ম্যাটপ্লটলিব আমদানি করার প্রয়োজন নেই (যদিও আপনার সাধারণতভাবে হওয়া উচিত) এবং স্বেচ্ছাসেবী আকারগুলির জন্য লুপিং প্রয়োজন হয় না ( layout=(df.shape[1], 1)উদাহরণস্বরূপ, ব্যবহার করতে পারেন )।
আনাতোলি মাকারেভিচ

20

আপনি পরিচিত ম্যাটপ্লটলিব স্টাইলটি একটি 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())

ইত্যাদি ...


6

আপনি সমস্ত ডেটা ফ্রেমের একটি তালিকা তৈরির সাধারণ কৌশল দ্বারা ম্যাটপ্ল্লোব ব্যবহার করে একাধিক প্যান্ডাস ডেটা ফ্রেমের একাধিক সাবপ্লট প্লট করতে পারেন। তারপরে সাবপ্লট প্লট করার জন্য লুপটি ব্যবহার করুন।

কাজের কোড:

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 =+1count +=1
টাইপগুলিতে

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

আপনার পান্ডাস ব্যবহার করার প্রয়োজন নেই। এখানে বিড়ালের ফ্রিকোয়েন্সিগুলির একটি ম্যাটপ্ল্লিটিব প্লট রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

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

উপরের @জোরিস প্রতিক্রিয়াটির উপর ভিত্তি করে আপনি যদি ইতিমধ্যে সাবপ্লটটির জন্য একটি রেফারেন্স স্থাপন করে থাকেন তবে আপনি রেফারেন্সটিও ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,

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()

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.