ম্যাটপ্ল্লিটিবের সাবপ্লটগুলির মধ্যে ফাঁকগুলি কীভাবে দূর করবেন?


116

নীচের কোডটি সাবপ্লটগুলির মধ্যে ফাঁক তৈরি করে। আমি কীভাবে সাবপ্লটগুলির মধ্যে ফাঁকগুলি সরিয়ে ছবিটি একটি শক্ত গ্রিড করব?

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

import matplotlib.pyplot as plt

for i in range(16):
    i = i + 1
    ax1 = plt.subplot(4, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

2
একটি লিঙ্ক পোস্ট করুন এবং এটি সম্পাদনা করা যেতে পারে you আপনি Noneযা ভাবেন তা করছে না, এর অর্থ 'ডিফল্ট ব্যবহার করুন'।
টাকসওয়েল

আমি 'কেউ নয়' এর পরিবর্তে সংখ্যা যুক্ত করার চেষ্টা করেছি কিন্তু এটি প্রলেমটি সমাধান করে নি।
ব্যবহারকারী3006135

4
plt.subplots_adjust(wspace=0, hspace=0)আপনার সমস্যাটি সমাধান করবে, এটি যদি আপনি 'equal'দিকটি ব্যবহার করেন না তবে । বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
এপডনু

উত্তর:


100

অক্ষগুলির মধ্যে ব্যবধানকে নিয়ন্ত্রণ করতে আপনি গ্রিডস্পেক ব্যবহার করতে পারেন । এখানে আরও তথ্য আছে।

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. 

for i in range(16):
   # i = i + 1 # grid spec indexes from 0
    ax1 = plt.subplot(gs1[i])
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')

plt.show()

অক্ষ একসাথে খুব কাছাকাছি


35
এটি সীমাবদ্ধ নয় GridSpec, আপনি যদি সৃষ্টিতে চিত্রটি ধরেন তবে আপনি এটির সাথে দূরত্বও নির্ধারণ করতে পারেন:fig.subplots_adjust(hspace=, wspace=)
রাটার ক্যাসিস

3
forলুপের শেষ লাইনটি কী বোঝায়?
সিপ্রিয়ান টোমাইগা

এটি একটি খুব সুন্দর টিপ, কিন্তু এটি ব্যবহার করে না subplotsএই উত্তরটি ত্যাগ ছাড়াই কাজটি পায় subplots
উইজকালাউন

সেখানে অনুভূমিক ব্যবধান সরানোর জন্য একটি উপায় আছে কি শুধুমাত্র অক্ষ প্রথম ও দ্বিতীয় সারি মধ্যে?
স্টেফানো

136

সমস্যাটি হ'ল ব্যবহার aspect='equal', যা সাবপ্লটগুলিকে একটি স্বেচ্ছাচারিত দিক অনুপাতের দিকে প্রসারিত করা এবং সমস্ত খালি স্থান পূরণ করা থেকে বিরত করে ।

সাধারণত, এটি কাজ করবে:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])

plt.subplots_adjust(wspace=0, hspace=0)

ফলাফল এটি:

তবে aspect='equal'নিম্নলিখিত কোডের মতোই:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)

এটি আমরা পাই:

এই দ্বিতীয় ক্ষেত্রে পার্থক্য হ'ল আপনি x- এবং y- অক্ষকে একই সংখ্যার ইউনিট / পিক্সেল রাখতে বাধ্য করেছেন। যেহেতু অক্ষগুলি ডিফল্টরূপে 0 থেকে 1 এ চলে যায় (অর্থাত্ কোনও কিছুর পরিকল্পনা করার আগে), aspect='equal'প্রতিটি অক্ষকে একটি বর্গ হিসাবে জোর করে। চিত্রটি কোনও বর্গ নয়, তাই পাইপলট অনুভূমিকভাবে অক্ষের মধ্যে অতিরিক্ত ব্যবধান যুক্ত করে।

এই সমস্যাটি পেতে, আপনি সঠিক দিক অনুপাত রাখতে আপনার চিত্রটি সেট করতে পারেন। আমরা এখানে অবজেক্ট-ভিত্তিক পাইপ্লট ইন্টারফেস ব্যবহার করব, যা আমি সাধারণভাবে শ্রেষ্ঠ হিসাবে বিবেচনা করি:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)

ফলাফল এখানে:


3
ধন্যবাদ! আপনার উত্তর সহজ এবং পুরোপুরি কার্যকর। plt.subplots_adjust(wspace=0, hspace=0)
মোহাম্মদজেজ

35

গ্রিডস্পেক সম্পূর্ণরূপে অবলম্বন না করে , নিম্নলিখিতটি wspace এবং hspace শূন্যে সেট করে ফাঁকগুলি সরাতে ব্যবহৃত হতে পারে :

import matplotlib.pyplot as plt

plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})

for i, ax in enumerate(f.axes):
    ax.grid('on', linestyle='--')
    ax.set_xticklabels([])
    ax.set_yticklabels([])

plt.show()
plt.close()

ফলাফল এতে:

।


4

আপনি চেষ্টা করেছেন plt.tight_layout()?

সঙ্গে plt.tight_layout() এখানে চিত্র বর্ণনা লিখুন এটা ছাড়া: এখানে চিত্র বর্ণনা লিখুন

বা: এর মতো কিছু (ব্যবহার add_axes)

left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
   for y in left:
       rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))    
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))     
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

আপনার যদি অক্ষগুলি ভাগ করে নেওয়ার প্রয়োজন না হয় তবে সহজভাবে axLS=map(fig.add_axes, rectLS) এখানে চিত্র বর্ণনা লিখুন


আমি শক্ত লেআউট চেষ্টা করেছি, তবে এটি ফাঁক থেকে মুক্তি পেল না, যা আমি চাই। গ্রিডস্পেক সমাধান কাজ করেছে। পরামের্শর জন্য আপনাকে ধন্যবাদ।
ব্যবহারকারী3006135

অন্যান্য পরামর্শের সাথে এটি দুর্দান্ত কাজ করেছে। টাইট_লআউট () উপরের শ্বেত স্থানটি এবং প্লটের পক্ষগুলিতে কোনও উদ্দেশ্য ছাড়াই কার্যকর করতে সাহায্য করেছিল।
ডিসিপিসি

0

সাম্প্রতিক ম্যাটপ্ল্লোব সংস্করণগুলির সাহায্যে আপনি কনস্ট্রাইনড লেআউট চেষ্টা করতে পারেন । এটি plt.subplot()তবে এর সাথে কাজ করে না , সুতরাং এর plt.subplots()পরিবর্তে আপনার প্রয়োজন :

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