কীভাবে ম্যাটপ্ল্লোলিব থেকে ফ্রেম সরিয়ে ফেলা যায় (মায়াপ্লটলিব.ফিগুরে বনাম pyplot.figure)


160

চিত্রে ফ্রেম সরাতে, আমি লিখি

frameon=False

এর সাথে নিখুঁতভাবে কাজ করে pyplot.figureতবে matplotlib.Figureএটি কেবল ধূসর পটভূমিকে সরিয়ে দেয়, ফ্রেমটি স্থির থাকে। এছাড়াও, আমি কেবল লাইনগুলি প্রদর্শন করতে চাই এবং বাকী সমস্ত চিত্র স্বচ্ছ হোক।

পাইপলট দিয়ে আমি যা করতে চাই তা করতে পারি, আমি দীর্ঘসময় ধরে ম্যাটপ্ল্লোলিব দিয়ে এটি করতে চাই, বরং আমি আমার প্রশ্নটি বাড়িয়ে বলার অপেক্ষা রাখে না।


আপনি কি করছেন তা পরিষ্কার করে বলতে পারেন? (যেমন একটি উদাহরণ দেখান) আপনি ব্যবহার করছেন savefig? (যদি তা হয় তবে চিত্রটি সংরক্ষণ করার সময় আপনি যা সেট করেছেন তা এটি ওভাররাইড করে)) ম্যানুয়ালি কী সেটিংস fig.patch.set_visible(False)কাজ করে?
জো কিংটন

আমি ক্যানভাস.প্রিন্ট_পিএনজি (প্রতিক্রিয়া) ব্যবহার করি, সেভফিগ নয়।
এমমেট বি

উত্তর:


178

প্রথমে আপনি যদি ব্যবহার করছেন savefigতবে সচেতন হন যে সংরক্ষণের সময় এটি চিত্রের পটভূমির রঙকে ওভাররাইড করে দেবে যদি আপনি অন্যথায় নির্দিষ্ট না করে (যেমন fig.savefig('blah.png', transparent=True))।

যাইহোক, অক্ষ এবং 'চিত্রের পটভূমি অন স্ক্রিনটি সরাতে আপনাকে উভয় সেট করতে হবে ax.patchএবং fig.patchঅদৃশ্য হতে হবে।

যেমন

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

for item in [fig, ax]:
    item.patch.set_visible(False)

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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

(অবশ্যই, আপনি এসও এর সাদা পটভূমিতে পার্থক্যটি বলতে পারবেন না, তবে সবকিছু স্বচ্ছ ...)

আপনি যদি লাইন ছাড়া অন্য কিছু দেখাতে না চান তবে অক্ষটি বন্ধ করেও ব্যবহার করুন ax.axis('off'):

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

fig.patch.set_visible(False)
ax.axis('off')

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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

সেক্ষেত্রে, আপনি অক্ষগুলি সম্পূর্ণ চিত্র গ্রহণ করতে চাইতে পারেন। আপনি যদি অক্ষের অবস্থানটি ম্যানুয়ালি নির্দিষ্ট করে থাকেন তবে আপনি এটি পুরো চিত্রটি তুলতে বলতে পারেন (পর্যায়ক্রমে, আপনি ব্যবহার করতে পারেন subplots_adjust, তবে এটি একক অক্ষের ক্ষেত্রে সহজ)।

import matplotlib.pyplot as plt

fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')

ax.plot(range(10))

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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


সুতরাং এটি অর্ধেক সমস্যা সমাধান করে। তবে আমি এই কালো ফ্রেমের আয়তক্ষেত্রটিও অদৃশ্য হোক। সুতরাং কেবল নীল রেখাটি দৃশ্যমান হওয়া উচিত।
এমমেট বি

5
ওহ, ভাল, এক্ষেত্রে এটি আরও সহজ। কেবল ব্যবহার করুন ax.axis('off')(আপনার এখনও চিত্রের ফ্রেমটি বন্ধ করতে হবে)।
জো কিংটন

ধন্যবাদ, টিক্লেবেল রাখার উপায় আছে যেমন: আমি কেবল লেবেল চাই ax.set_yticklabels(('G1', 'G2', 'G3'))
এমমেট বি

এই মহান, আমি এখানে অন্য অ্যাপ্লিকেশন জন্য এটি ব্যবহৃত: stackoverflow.com/questions/4092927/...
cxrodgers

1
print_png()একটি ছোঁড়ার TypeError: write() argument must be str, not bytesপাইথন 3. লেখার বাইনারি হিসাবে ফাইল (খোলা উপর আমার জন্য ব্যতিক্রম 'wb') কাজ তার জন্য প্রয়োজন হয়।
গ্যাব্রিয়েল জাবলোনস্কি

243

ax.axis('off'), জো কিংটন যেমন বলেছিলেন, প্লট করা রেখা বাদে সবকিছু মুছে ফেলবে।

যারা কেবল ফ্রেম (সীমান্ত) সরাতে এবং লেবেল, টিকারগুলি ইত্যাদি রাখতে চান, spinesতাদের অক্ষের মধ্যে থাকা অবজেক্টটি অ্যাক্সেস করে এটি করতে পারেন । একটি অক্ষ অবয়ব দেওয়া ax, নিম্নলিখিত চারটি পক্ষের সীমানা সরানো উচিত:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

এবং, প্লট থেকে সরানোর xএবং yটিক্সের ক্ষেত্রে :

 ax.get_xaxis().set_ticks([])
 ax.get_yaxis().set_ticks([])

1
শীর্ষ এবং ডান মেরুদণ্ড থেকে মুক্তি পাওয়ার জন্য আমি এটি পছন্দ করি
অ্যাড্রিয়ান ট্যারি

5
কেবল যোগ করতে: আপনি যখন ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
টিকগুলিও

4
এছাড়াও, অক্ষর অবজেক্ট তৈরি করতে অক্ষ = জিসিএ () ব্যবহার করুন যদি আপনার কাছে ইতিমধ্যে একটি না থাকে।
ক্যামেরনরোয়েটায়লর

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। "ax.axis (" অফ ")" প্লট থেকে x: y এবং লেবেল, x এবং y টিক্স এবং সমস্ত (4) সীমানার মতো সমস্ত কিছু সরিয়ে দেয়। আরও ভাল কাস্টমাইজেশনের জন্য, প্রতিটি উপাদান আলাদাভাবে পরিচালনা করা উচিত।
সংচিত

66

ম্যাটপ্লটলিবের নতুন সংস্করণগুলিতে কুরুচিপূর্ণ ফ্রেম থেকে মুক্তি পাওয়ার সহজ উপায়:

import matplotlib.pyplot as plt
plt.box(False)

আপনি কি সত্যিই সবসময় অবজেক্ট ওরিয়েন্টেড পদ্ধতির ব্যবহার করা আবশ্যক, তাহলে একটি করুন: ax.set_frame_on(False)


2
ধন্যবাদ! এটি সম্ভবত সবচেয়ে পরিষ্কার সমাধান!
কাটিয়া

2
অবজেক্ট ওরিয়েন্টেড পদ্ধতির ব্যবহার করার সময় আমার সাফল্য ছিল ax.set_frame_on(False)যা একই কাজ করে। উপরের উত্তরে অন্তর্ভুক্ত থাকতে পারে।
ফ্লয়েড 4 কে

58

@ পিলের দুর্দান্ত উত্তরের উপর ভিত্তি করে আপনি ফ্রেমটিও মুছে ফেলতে পারেন

for spine in plt.gca().spines.values():
    spine.set_visible(False)

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

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

আপনি উপরের কমান্ড দিয়ে ফ্রেম অপসারণ করতে পারেন এবং তারপর পারেন রাখা x-এবং ytickলেবেল (চক্রান্ত দেখানো হয়নি) অথবা তাদের ভাল করছেন থেকে সরাতে

plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

এক্ষেত্রে কেউ সরাসরি বারগুলি লেবেল করতে পারে; চূড়ান্ত প্লটটি এর মতো দেখতে পেল (কোডটি নীচে পাওয়া যাবে):

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

প্লট উত্পন্ন করতে প্রয়োজনীয় কোডটি এখানে রয়েছে:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()

xvals = list('ABCDE')
yvals = np.array(range(1, 6))

position = np.arange(len(xvals))

mybars = plt.bar(position, yvals, align='center', linewidth=0)
plt.xticks(position, xvals)

plt.title('My great data')
# plt.show()

# get rid of the frame
for spine in plt.gca().spines.values():
    spine.set_visible(False)

# plt.show()
# remove all the ticks and directly label each bar with respective value
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

# plt.show()

# direct label each bar with Y axis values
for bari in mybars:
    height = bari.get_height()
    plt.gca().text(bari.get_x() + bari.get_width()/2, bari.get_height()-0.2, str(int(height)),
                 ha='center', color='white', fontsize=15)
plt.show()

1
এটি আমার সমস্যা সমাধান করেছে।
এমাদ অহায়ী

6

আমি এখানে উত্তর হিসাবে , আপনি স্টাইল সেটিংস (স্টাইল শীট বা rcParams) এর মাধ্যমে আপনার সমস্ত প্লট থেকে স্পাইনগুলি সরাতে পারেন:

import matplotlib as mpl

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False

6

সমস্যা

অক্ষ ব্যবহারের ক্ষেত্রে আমারও একই সমস্যা ছিল। ক্লাস প্যারামিটার frameonকিন্তু কোয়ার্গ হয় frame_onaxes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

সমাধান

frame_on

উদাহরণ

data = range(100)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(data)
#ax.set(frameon=False)  # Old
ax.set(frame_on=False)  # New
plt.show()

5

আমি এটি করতে ব্যবহার করি:

from pylab import *
axes(frameon = 0)
...
show()

2

চার্টের ফ্রেমটি সরিয়ে ফেলতে

for spine in plt.gca().spines.values():
  spine.set_visible(False)

আমি আশা করি এটি কাজ করতে পারে


1
df = pd.DataFrame({
'client_scripting_ms' : client_scripting_ms,
 'apimlayer' : apimlayer, 'server' : server
}, index = index)

ax = df.plot(kind = 'barh', 
     stacked = True,
     title = "Chart",
     width = 0.20, 
     align='center', 
     figsize=(7,5))

plt.legend(loc='upper right', frameon=True)

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('right')

0
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

কৌতুক করা উচিত।


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