ম্যাটপ্ল্লিটিব প্লটে বাম এবং ডান মার্জিন হ্রাস করুন


178

আমি ম্যাটপ্ল্লিটিবের সাথে আমার প্লটের মার্জিনগুলি মোকাবেলায় লড়াই করছি ling আমি আমার চার্টটি তৈরি করতে নীচের কোডটি ব্যবহার করেছি:

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")

তবে আমি প্লটের দুপাশে প্রচুর সাদা জায়গা সহ একটি আউটপুট চিত্র পাই figure আমি গুগল অনুসন্ধান করেছি এবং ম্যাটপ্ল্লোব ডকুমেন্টেশন পড়েছি, তবে কীভাবে এটি হ্রাস করতে হবে তা খুঁজে পাচ্ছি না।


সমস্যা হোয়াইটস্পেস পরিমাণ extentএর imshowব্যক্তিত্ব, অথবা পরিসমাপ্তি PNG সীমান্তের হোয়াইটস্পেস পরিমাণ, ফিগার চারপাশে, দ্বারা উত্পন্ন savefig?
unutbu

আমার মনে হয় উভয়ই - উভয় দেখার উইন্ডো এবং পিএনজিতে অনেক জায়গা রয়েছে। যাইহোক, গুরুত্বপূর্ণ আউটপুট হ'ল পিএনজি ফাইলটি উত্পাদিত savefig- সুতরাং এটিই আমি বাছাই করতে চাই।
রবিন্টউ

আমি তাদের পরে জিম্পে ক্রপ করছি। : /
এন্ডোলিথ

উত্তর:


251

এটি করার একটি উপায় হ'ল bbox_inches='tight'কুয়ার্গ থেকে plt.savefig

যেমন

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

অন্য উপায় ব্যবহার করা হয় fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')

5
এটিকে ডিফল্ট করার কোনও উপায় আছে কি?
এন্ডোলিথ

1
আপনার যদি একাধিক সাবপ্লট থাকে এবং সেগুলির প্রতিটি সংরক্ষণ করতে চান তবে আপনি এটির সাহায্যে fig.savefig()এটিও ব্যবহার করতে পারেন । ( plt.savefig()
সেক্ষেত্রে

1
এই সমস্ত কাজটি চিত্রটি রেন্ডার হওয়ার পরে ক্রপ হয়; আপনি যদি কোনও নির্দিষ্ট রেজোলিউশন কার্যকর করার চেষ্টা করছেন তবে চিত্রটি আরও ছোট হবে
স্পষ্টভাবে 11

5
@ দিন - হ্যাঁ এটি হ'ল এটি (যদিও এটি "আউট" কেটে দিতে এবং চিত্রটিকে আরও বড় করে তুলতে পারে)। আপনি যা চাইছেন তার জন্য একবার দেখুন fig.tight_layout()। এই উত্তরটি মূলত যখন লেখা হয়েছিল তখন সেই ফাংশনটির অস্তিত্ব ছিল না, অন্যথায় আমি এটি আরও বিশদভাবে উল্লেখ করব।
জো কিংটন

2
কারও সমস্যা হলে, ব্যবহার করুনfig = plt.gcf()
কিউংহুন কিম

148

সাবপ্লট_এডজাস্ট () ফাংশনটি ব্যবহার করে আপনি ম্যাটপ্ল্লোলিব চিত্রগুলির চারপাশের ব্যবধানটি সামঞ্জস্য করতে পারেন:

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

এটি স্ক্রিনে চিত্রের জন্য এবং কোনও ফাইলে সংরক্ষণ করা উভয়ের পক্ষে কাজ করবে এবং আপনার যদি এক চিত্রে একাধিক প্লট না থাকে তবে কল করা সঠিক ফাংশন।

সংখ্যাগুলি চিত্রের মাত্রার ভগ্নাংশ, এবং চিত্র লেবেলের জন্য অনুমতি দেওয়ার জন্য সামঞ্জস্য করা দরকার।


8
প্যারামিটারগুলিতে নির্ধারিত মানগুলি এবং এটির দ্বারা কতটা পরিবর্তন করা যায় তা নয়, তারা যেখানে প্রান্তিকতা সেট করবে। অন্য কথায়, যদি আপনি 10% সঠিক প্রান্ত মার্জিন আনতে চান, আপনি সঠিক = 0.9, না ডান = 0.1 সেট করা উচিত matplotlib.sourceforge.net/api/...
drootang

1
এটি নির্দিষ্ট করে বোঝা যায় যে স্পষ্টতই আপনি plt.subplots_adjust () এ নেতিবাচক মানগুলি নির্দিষ্ট করতে পারেন। এমনকি এটি আপনাকে চিত্রের ক্ষেত্রের বাইরেও আঁকতে এবং বিরক্তিকর মার্জিনগুলি মোকাবেলা করার অনুমতি দেয়।
surchs

এটি পদ্ধতিতে GridSpecকল করে অবজেক্টগুলিতেও কাজ করে update(দেখুন স্ট্যাকওভারফ্লো . com/a/20058199/1030876 )।
অ্যারন ভোলেকার

57

তোমার যা দরকার তা হল

plt.tight_layout()

আপনার আউটপুট আগে।

মার্জিনগুলি কেটে দেওয়ার পাশাপাশি এটি যে কোনও সাব-প্লটগুলির মধ্যে স্থানকে শক্তভাবে বিভক্ত করে:

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()

7
আমি মনে করি এটি সত্যই সেরা পদ্ধতি। এটির জন্য `bbox = 'আঁট' এর মতো চিত্র সংরক্ষণ করার দরকার নেই এবং জটিল আকারে অন্যান্য লেআউটের সমস্যাগুলি সংশোধন করে।
শেফার্ড

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

আশ্চর্যজনকভাবে যথেষ্ট, এটি সত্যিকারের প্লটের প্রস্থও পরিবর্তিত করে (অর্থাত্ শিখরগুলি একসাথে কাছাকাছি রয়েছে) bbox_inches='tight', যা কেবল প্রান্তগুলির চারপাশে সাদা স্থানটি ক্লিপ করে তবে প্লটটি একা ফেলে দেয়। আমি সঙ্গে ফিগার তৈরি plt.figure(figsize=(10,3))
ফ্রেটজ

9

ax = fig.add_axes([left, bottom, width, height]) আপনি যদি চিত্রের বিন্যাসের সঠিক নিয়ন্ত্রণ চান তবে কেবলমাত্র ব্যবহার করুন । যেমন।

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])

6

যদি কেউ আশ্চর্য হয়ে যায় যে কীভাবে প্রয়োগ করার পরে কীভাবে বাকী সাদা মার্জিন থেকে মুক্তি পাবেন plt.tight_layout()বা fig.tight_layout(): প্যারামিটারের সাহায্যে pad(যা 1.08পূর্বনির্ধারিত হয়), আপনি এটি আরও কঠোর করতে সক্ষম হবেন: "চিত্রের প্রান্ত এবং প্রান্তগুলির মধ্যে প্যাডিং সাব-প্লটগুলি, হরফ আকারের ভগ্নাংশ হিসাবে। উদাহরণস্বরূপ

plt.tight_layout(pad=0.05)

এটি খুব অল্প ব্যবধানে হ্রাস করবে। পুটিং 0আমার পক্ষে কাজ করে না, কারণ এটি সাবপ্লটটির বাক্সটিও কিছুটা কেটে দেয়।


4
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)

1
"প্যাড_ইঞ্চস = -1" আমার সেফফিগকে কেবল চিত্রের অংশ তৈরি করে produce
ইউ শেন

savefigফাংশনে একটি প্যারামিটার ব্যবহার মার্জিত, তবে এর জন্য নেতিবাচক মান pad_inchesপ্রতিটি ক্ষেত্রে প্রয়োজন হয় না।
মাইকেলহিউলসান

এটি 0 তে সেট করুন, সহায়তা করুন
জোপ করুন

4

ম্যাটপ্ল্লোটিবস সাবপ্লট_এডজাস্টের সমস্যাটি হ'ল আপনি যে মানগুলি প্রবেশ করান তা চিত্রের x এবং y অঙ্কুরের সাথে সম্পর্কিত। এই উদাহরণটি পিডিএফ প্রিন্ট করার জন্য সঠিক চিত্রের জন্য:

তার জন্য, আমি এর মতো নিখুঁত মানগুলির সাথে আপেক্ষিক ব্যবধানের পুনরায় গণনা করি:

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

এক্স-ডাইমেনশনে 'ফিগার.এক্সাইজ' ইঞ্চি এবং ওয়াই-ডাইমেনশনে 'ফিগার.সাইজ' ইঞ্চি চিত্রের জন্য। সুতরাং পুরো চিত্রটি 5 মিমি বাম মার্জিন, নীচের মার্জিন 4 মিমি, 1 মিমি এর ডান এবং 3 মিমি শীর্ষে লেবেল মধ্যে স্থাপন করা হয়। (X / 25.4) রূপান্তরটি সম্পন্ন হয়েছে কারণ আমার মিমিটি ইঞ্চি রূপান্তর করতে হবে।

নোট করুন যে এক্সের খাঁটি চার্টের আকার হবে "ফিগার.এক্সজি সাইজ - বাম মার্জিন - ডান মার্জিন" এবং y এর খাঁটি চার্টের আকার হবে "ফিগার.সাইজ - নীচের মার্জিন - শীর্ষ মার্জিন" ইঞ্চিতে

অন্যান্য স্নিপলেট (এগুলি সম্পর্কে নিশ্চিত নয়, আমি কেবল অন্যান্য প্যারামিটারগুলি সরবরাহ করতে চেয়েছিলাম)

pyplot.figure(figsize = figureSize, dpi = None)

এবং

pyplot.savefig("outputname.eps", dpi = 100)

3
আপনি কোথায় xsizeএবং ysizeপেয়েছেন। আমি সেই বৈশিষ্ট্যগুলি ব্যবহার করি এবং আমি পাইAttributeError: 'Figure' object has no attribute 'xsize'
সিজে 5

4

উপরে স্যামিস উত্তর দ্বারা অনুপ্রাণিত:

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

যেখানে ডুমুরচিহ্নটি হ'ল আপনি ব্যবহৃত টিউপল fig = pyplot.figure(figsize=...)


2

আমার জন্য, উপরের উত্তরগুলি matplotlib.__version__ = 1.4.3উইন 7-তে কার্যকর হয়নি । সুতরাং, আমরা যদি কেবল চিত্রটিতে নিজেরাই আগ্রহী (যেমন, আমাদের যদি টীকাগুলি, অক্ষ, টিক্স, শিরোনাম, ইয়েলবেল ইত্যাদির প্রয়োজন না হয়), তবে কেবল চিত্রের পরিবর্তে অসাধারণ অ্যারে সংরক্ষণ করা ভাল savefig

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

এছাড়াও, ওপেনসিভি অঙ্কন ফাংশনগুলি (cv2.line, cv2.polylines) ব্যবহার করে, আমরা সরাসরি অঙ্ক্প অ্যারেতে কিছু অঙ্কন করতে পারি। http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html


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