ম্যাটপ্ল্লোলিব-এ সংরক্ষিত চিত্রের চারপাশে সাদা স্থান সরিয়ে ফেলা হচ্ছে


172

আমার কোনও চিত্র নেওয়া এবং কিছু প্রক্রিয়া শেষে এটি সংরক্ষণ করা দরকার। চিত্রটি প্রদর্শন করার সময় চিত্রটি ঠিক আছে, তবে চিত্রটি সংরক্ষণ করার পরে, সংরক্ষিত চিত্রের আশেপাশে আমি কিছুটা সাদা জায়গা পেয়েছি। আমি পদ্ধতির 'tight'বিকল্পটি চেষ্টা করেছি savefig, কাজও করি নি। কোড:

  import matplotlib.image as mpimg
  import matplotlib.pyplot as plt

  fig = plt.figure(1)
  img = mpimg.imread(path)
  plt.imshow(img)
  ax=fig.add_subplot(1,1,1)

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

  plt.axis('off') 
  plt.show()

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

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}

fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)

nx.draw(G, pos=pos)

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

plt.axis('off') 
plt.show()


আমার পক্ষে যা কাজ করেছিল তা হ'ল পিডিএফ কে অন্য সরঞ্জাম, যেমন পিডিএফক্রপ ব্যবহার করে ক্রপ করা।
টালিভিরা

উত্তর:


169

আমি দাবি করতে পারি না ঠিক কীভাবে বা আমার "সমাধান" কাজ করে তা আমি জানি তবে আমি পিডিএফ ফাইলে - সাদা মার্জিন ছাড়াই বেশ কয়েকটি এয়ারোফিল বিভাগের রূপরেখার পরিকল্পনা করতে চাইলে আমাকে এই কাজটি করতে হয়েছিল। (নোট করুন যে আমি আইপিথন নোটবুকের ভিতরে -plab পতাকা সহ matplotlib ব্যবহার করেছি))

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

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


6
পরিশেষে এমন কিছু যা কাজ করে, আপনাকে অনেক ধন্যবাদ! যাইহোক, আমার ক্ষেত্রে শুধুমাত্র দুটি লাইন ব্যবহার set_major_locatorকরা প্রয়োজন ছিল।
ফ্লোরিয়ান ব্রুকার

6
আমি শেষ ঘন্টাটি বিভিন্ন জিনিস চেষ্টা করে কাটিয়েছি এবং 1px সাদা সীমানা থেকে মুক্তি পেতে পারি না। এটি কেবলমাত্র কাজ করেছিল যা বিশেষত pad_inches=0অন্যান্য উত্তরগুলির উল্লেখ করে না।
আনানফায় 16:54

1
set_major_locatorআমার জন্য চাবি ছিল।
kmac

16
pad_inchesআমাকে সাহায্য করে ছিল.
মাইলস বেকার

5
matplotlib.ticker.NullLocator ()
Joop

200

আপনি সেট করে সাদা স্থান প্যাডিং অপসারণ করতে পারেন bbox_inches="tight"মধ্যে savefig:

plt.savefig("test.png",bbox_inches='tight')

আপনাকে যুক্তিটি bbox_inchesস্ট্রিং হিসাবে রাখতে হবে, সম্ভবত এ কারণেই এটি আপনার পক্ষে আগে কাজ করে নি।


সম্ভাব্য সদৃশ:

ম্যাটপ্ল্লোব প্লটগুলি: অক্ষ, কিংবদন্তি এবং সাদা স্থানগুলি সরিয়ে ফেলা হচ্ছে

একটি ম্যাটপ্ললিট ফিগারের জন্য মার্জিনটি কীভাবে সেট করবেন?

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


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

30
এটি বেশ সঠিক নয় not আপনি যখন এই bbox_inchesবিকল্পটি ব্যবহার করেন , তখন অন্য একটি ডিফল্ট থাকে যা কিছু জায়গা ছেড়ে দেয়। আপনি যদি সত্যিই সমস্ত কিছু থেকে মুক্তি পেতে চান তবে আপনার এটিও ব্যবহার করা দরকার pad_inches=0.0। অবশ্যই, এই ধরনের টাইট প্যাডিংগুলি প্রায়শই কাটতে থাকে, উদাহরণস্বরূপ, এক্সপেনশনগুলি ...
মাইক

5
পাশাপাশি কালো প্রান্তটিও সরাতে আপনার প্রয়োজন হতে পারেpad_inches=-0.1
lenhhoxung

10
এটি সহজভাবে কাজ করে না, আপনি এখনও চিত্রের চারপাশে সাদা জায়গা পাবেন। স্বচ্ছ বিকল্প সেট করা (কিছু জবাব হিসাবে উল্লিখিত) সত্যিই হয় না কোনও সাহায্য করে না, সাদা স্থান এখনও আছে, এটি কেবল স্বচ্ছ।
BjornW

1
@ পাইপারচেস্টার এটি একটি ভাল প্রশ্ন, তবে সম্ভবত এটি সম্পূর্ণ নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত যাতে মন্তব্যগুলিতে এটি হারিয়ে না যায়। আপনার নতুন প্রশ্নটি যদিও পুরানোটির সাথে যুক্ত করা উচিত!
লাগানো

21

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

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")

গুরুত্বপূর্ণভাবে এটিতে বক্স বা প্যাডিং আর্গুমেন্ট অন্তর্ভুক্ত নয়।


4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অতিরিক্তভাবে, আপনাকে কল করার দরকার নেই set_axis_offsubplots_adjustঅক্ষটি চিত্রের সীমার বাইরে থাকা এবং হেনভে কোনওভাবেই প্লট করা হবে না বলে এটি সংরক্ষিত চিত্রকে প্রভাবিত করে না । জপিটার নোটবুকগুলিতে, তবে আপনাকে অক্ষরটি স্পষ্টভাবে অক্ষম করা দরকার, যেহেতু ইনলাইন ব্যাকএন্ড এই সেটিংসটি ওভাররাইট করে।
ম্যাক্সপাওয়ারগুলি

20

আমি অরবিন্দ পেরেরার কাছ থেকে কিছু পেয়েছি ( http://robotic.usc.edu/~ampereir/wordpress/?p=626 ) এবং আমার পক্ষে কাজ করছে বলে মনে হয়েছে:

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

7
transparent=Trueএটিকে দেখে মনে হবে কোনও সমস্যা নেই তবে এটি কেবল সাদা স্থান লুকিয়ে রাখবে, চিত্রের মাত্রা ঠিক হবে না।
ভ্লাদি ভেসেলিনভ

উল্লেখ করার জন্য ধন্যবাদ pad_inches! আমি যদি এই বিকল্পটি আগে জানতে পারতাম!
ingomueller.net

1
এটি বেশিরভাগ প্লটের জন্য কাজ করে তবে এটি আমার কনফিউশন ম্যাট্রিক্সের জন্য সঠিক সীমানা সরিয়ে দিয়েছে। pad_inches=.25
ওয়াইটিজেড

14

নিম্নলিখিত ফাংশন উপরের জোহানেস এর উত্তর অন্তর্ভুক্ত। আমি এটি একাধিক অক্ষ সহ plt.figureএবং এটি পরীক্ষা করেছি plt.subplots()এবং এটি দুর্দান্তভাবে কাজ করে।

def save(filepath, fig=None):
    '''Save the current image with no whitespace
    Example filepath: "myfig.png" or r"C:\myfig.pdf" 
    '''
    import matplotlib.pyplot as plt
    if not fig:
        fig = plt.gcf()

    plt.subplots_adjust(0,0,1,1,0,0)
    for ax in fig.axes:
        ax.axis('off')
        ax.margins(0,0)
        ax.xaxis.set_major_locator(plt.NullLocator())
        ax.yaxis.set_major_locator(plt.NullLocator())
    fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')

কবজির মতো কাজ করেছেন। পূর্ববর্তী উত্তরটি আমার রফতানিতে কিছু প্রয়োজনীয় আদেশ ছিল।
কেভিন এস

11

আমি নিম্নলিখিত কোডগুলি কাজের জন্য নিখুঁতভাবে কাজ করতে দেখেছি।

fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)

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

7

আমি এই ক্রমটি অনুসরণ করেছি এবং এটি একটি কবজির মতো কাজ করেছে।

plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
    bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)

1
আসলে, আমি এই উত্তরটি ব্যবহার করা সহজ এবং আরও সুবিধাজনক found
সিকিসিস

1
এই আমার জন্য কাজ করে; গৃহীত উত্তর দেয় নি।
জো

3

ইঞ্চি না করে যে কেউ পিক্সেল নিয়ে কাজ করতে চায় তার পক্ষে এটি কাজ করবে।

প্লাস স্বাভাবিক আপনারও প্রয়োজন হবে

from matplotlib.transforms import Bbox

তারপরে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

my_dpi = 100 # Good default - doesn't really matter

# Size of output in pixels
h = 224
w = 224

fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)

ax.set_position([0, 0, 1, 1]) # Critical!

# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")

ax.axis("off")

fig.savefig("saved_img.png",
            bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
            dpi=my_dpi)

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


আপনাকে ডিপিআই নির্দিষ্ট করতে হবে না, আপনি fig.dpiতার পরিবর্তে ডিফল্টটি ব্যবহার করতে পারেন
ইনটস্কো

1

আমি দেখতে পেলাম আরও সহজ পদ্ধিতি হ'ল plt.imsave:

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)

আন্ডাররেটেড উত্তর। এভাবেই সঙ্গে রেজোলিউশন এবং অপসারণ হোয়াইটস্পেস ধরে রাখা জন্য একটি দীর্ঘ অনুসন্ধানের পর আমাকে সাহায্য plt.savefig()
নিহাল 111

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

যথেচ্ছ ইমেজ বলতে কী বোঝ? কোনও চিত্র কি মূল্যবোধের অ্যারে নয়?
পার্থ92

0

আপনি এটি চেষ্টা করতে পারেন। এটি আমার সমস্যা সমাধান করেছে।

import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)

-1

আপনি যদি সংরক্ষণ করতে চান তা প্রদর্শন করতে চান তবে আমি plt.tight_layoutরূপান্তরটি ব্যবহার করার পরামর্শ দিচ্ছি যা বাস্তবে আরও বেশি পছন্দনীয় কারণ এটি ব্যবহার করার সময় অপ্রয়োজনীয় ফসল কাটবে না usingplt.savefig

import matplotlib as plt    
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')

-4

এটি আমার জন্য ফাইলটিতে ইমশো প্লট করা একটি নমপি অ্যারে সংরক্ষণ করার জন্য কাজ করে

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
        hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.