স্কিপি: ফ্রেম, অক্ষ, কেবলমাত্র সামগ্রী ছাড়া সেফফিগ f


92

নম্পী / স্কিপিতে আমার একটি অ্যারেতে একটি চিত্র সঞ্চয় রয়েছে। আমি এটি প্রদর্শন করতে পারি, আমি কোনও সীমানা, অক্ষ, লেবেল, শিরোনাম, ... ছাড়া খাঁটি চিত্র, অন্য কিছু না করে savefig এটি সংরক্ষণ করতে চাই ।

আমি প্যাকেজগুলি এড়াতে চাই PyPNGবা যেমন scipy.misc.imsaveএগুলি কখনও কখনও সমস্যাযুক্ত হয় (তারা সর্বদা ভাল ইনস্টল করে না, কেবল savefig()আমার জন্য প্রাথমিক

উত্তর:


115

সম্পাদনা

পরিবর্তিত aspect='normalকরার aspect='auto'পর থেকে যে আরো সাম্প্রতিক (@ Luke19 ধন্যবাদ) matplotlib এর সংস্করণে পরিবর্তন করেছেন।


ধরে নেওয়া:

import matplotlib.pyplot as plt

ফ্রেম ছাড়াই একটি চিত্র তৈরি করতে:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

সামগ্রীতে পুরো চিত্রটি পূরণ করুন

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

তারপরে আপনার চিত্রটি আঁকুন:

ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)

aspectপরামিতি পিক্সেল আকার পরিবর্তন তারা চিত্রে আকার নির্দিষ্ট পূরণ করতে fig.set_size_inches(…)। এই ধরণের জিনিসগুলির সাথে কীভাবে খেলবেন তার অনুভূতি পেতে ম্যাটপ্ল্লোলিবের ডকুমেন্টেশনগুলি পড়ুন , বিশেষত অক্ষ, অক্ষ এবং শিল্পী বিষয়ে।


4
না, আমার এখনও কিছুটা স্বচ্ছ সীমানা রয়েছে এবং আমি যা চাই তা কোনও সীমানা নয় , খাঁটি চিত্র
জাকুব এম

4
আপনি নিজে সেট করেন তাহলে wএবং hএর মধ্যে পরামিতি fig.set_size_inches(w,h)এবং dpiমাপদণ্ড fig.savefig(fname, dpi)যাতে এটি 24px দ্বারা 24px ফলে, এটা ঠিক সূক্ষ্ম কাজ করা উচিত। উদাহরণস্বরূপ, w = h = 1এবংdpi = 24
মেটেহাট

4
আমাকে এই উত্তরটি এবং নীচে উত্তরটি মোস্তফা পাকপারভার একত্রিত করতে হয়েছিল। কেবল অক্ষগুলি বন্ধ করার দরকার নেই, তবে আপনার সাদা স্থানটি অদৃশ্য হয়ে গেছে তা নিশ্চিত করার জন্য আপনার সেট_ভিজিবলকে মিথ্যাতে সেট করতে হবে। (
ডাব্লুটিএফ

6
এটি matplotlib v2.2.2 ব্যবহার করে এটি পুরোপুরি কার্যকরভাবে ব্যবহার করে দেখেছেন (কেবলমাত্র imshowএর বাক্য গঠনটি aspect='auto'পরিবর্তে পরিবর্তিত হয়েছে 'normal')।
লুক

4
এটি সঠিক পন্থা। ax = plt.Axes(fig, [0., 0., 1., 1.])এটি কাজ করে তোলে।
গ্রেটভোয়ান

73

একটি সহজ সমাধান বলে মনে হচ্ছে:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

4
এটি আমার জন্য দুর্দান্ত কাজ করেছে। এছাড়াও, প্যাড_ইঞ্চগুলি সহজেই পছন্দসই আকারে পরিবর্তন করা যায়। ধন্যবাদ!
কৌতূহলী 2

27
আমি এর সাথে এখনও সাদা মার্জিন পেয়েছি।
ফেবিও পেরেজ

4
আমি এটি কেবল স্বচ্ছ = সত্যfig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
mdoc-2011

4
এখনও এর সাথে অক্ষ এবং টিকমার্কস এবং সবকিছু পেয়েছে :(
BjornW

4
এটি মোটেও কিছু করে না। এটি আপনাকে সমস্ত অক্ষ এবং লেবেল সহ চিত্রটি দেবে।
1313e

27

আপনি অক্ষের অভ্যন্তরে চিত্রটির বক্সটি (ব্যবহার করে get_window_extent) খুঁজে পেতে পারেন এবং চিত্রটির bbox_inchesকেবলমাত্র সেই অংশটি সংরক্ষণ করতে প্যারামিটারটি ব্যবহার করতে পারেন :

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('/tmp/test.png', bbox_inches=extent)

আমি এখানে জো কিংটনের কাছ থেকে এই কৌশলটি শিখেছি ।


6
সবেমাত্র plt.axis('off')সাহায্য করেছে অন্যান্য উত্তরগুলি খুব বেশি সাহায্য করে না।
imsrgadich

4
এটি বেশ ভাল কাজ করেছে। তবে আমার ক্ষেত্রে এখনও একটি ছোট সাদা সীমান্ত রয়েছে। এই সীমানাটি কীভাবে সরিয়ে নেওয়া যায় তার কোনও ধারণা?
ব্যবহারকারী3731622

@ ইউজার 3731622, দয়া করে plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)পরিবর্তে চেষ্টা করুনplt.savefig('/tmp/test.png', bbox_inches=extent)
ক্লাউড চ

17

আমি আমার ক্ষেত্রে বেশ কয়েকটি বিকল্প ব্যবহার করে দেখেছি এবং এর সর্বোত্তম সমাধানটি হ'ল:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

তারপরে আপনার চিত্রটি সংরক্ষণ করুন savefig


4
এই সমস্ত সমাধানগুলির মধ্যে, এই একমাত্র আমার পক্ষে কাজ করেছিল।
পাফ

8

আমি বোনকে টাইট মোডে সেট করার পরে বাম প্যাডিং অপসারণ করার জন্য এখান থেকে ধার করা কিছুটা সংযোজন সহ Heron13 জবাবটি প্রস্তাব করব , অতএব:

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

Get_xaxis () এবং get_yaxis () এর অস্তিত্ব নেই বলে আমি একটি ত্রুটি পাচ্ছি। কোন ধারণা কেন এমন হবে?
জ্যাকব মালাচোস্কি

একটি অক্ষ () অবজেক্ট তৈরি করুন, তারপরে ax.xaxis এবং ax.yaxis ব্যবহার করুন
পেরিগন

'তালিকা' অবজেক্টটির 'get_xaxis' এর কোনও বৈশিষ্ট্য নেই বলে একটি ত্রুটি পেয়েছি
হাওজে Xie


3

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

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()

এটি আমাকে সঠিক পথে পৌঁছেছে, তবে আমার দুটি সমস্যা ছিল: 1) আমার জ্যুপির নোটবুকের ফন্টের ত্রুটি এড়াতে আমাকে ডিপিআই 1 এর চেয়ে বেশি সংখ্যায় সেট করতে হয়েছিল; এবং 2) এখনও একটি ছোট সীমানা ছিল তাই আমাকে নিজেই বাক্সের ব্যাপ্তিটি পরিবর্তন করতে হবে extent.get_points()*np.array([[1.1],[.9]])
বব

উত্তরটি পূরণের জন্য ধন্যবাদ যা অন্য কারও পক্ষে সহায়তা করতে পারে।
GPrathap

3

যে কেউ জুপিটারে এটি করার চেষ্টা করছে For

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)

2

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

ধরে নেওয়া হচ্ছে যে আপনি চারটি চিত্রের মধ্যে থাকা সাবপ্লটসের একটি 2x2 গ্রিড চান images:

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')

1

আমি এখানে টিপস ব্যবহার করেও সীমান্ত থেকে মুক্তি পাওয়ার চেষ্টা করেছি তবে কিছুই সত্যই কার্যকর হয়নি। কিছু বিড়বিড় করে এবং আমি দেখতে পেলাম যে ফেসোলার পরিবর্তন করা আমাকে জ্যোপিটার ল্যাবগুলিতে কোনও সীমানা দেয়নি (কোনও বর্ণের ফলে সাদা বর্ডার থেকে মুক্তি পাওয়া যায়)। আশাকরি এটা সাহায্য করবে.

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

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


1

আসলে আমি সম্প্রতি চেষ্টা করেছি এবং এই সমস্ত লাইনের পরিবর্তে, আপনি ব্যবহার করতে পারেন

plt.imsave(image_path, image)

একটি যাদুমন্ত্র মত কাজ করে. কেবল একটি লাইন এবং সমস্যা সমাধান হয়েছে।

imsave()

ডকুমেন্টেশন ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )


0

আমার জন্য, এই কোডটি ফ্রেম এবং মাতাহাট , আনটবু এবং ডাব্লুএইচজেডাব্লু কোডের অক্ষগুলি ছাড়াই ইনপুট চিত্রের আকারটি তৈরি করেছে :

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.axis('off')
viridis = cm.get_cmap('gist_gray', 256)
plt.imshow(data, aspect='auto', cmap=viridis)
plt.tight_layout()
plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)

রানটাইম পরিবেশ:
পাইথন 3.6.10
ম্যাটপ্ল্লোব 3.2.1
ওএস উইন্ডোজ 10

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