ম্যাটপ্ল্লিটিব সাবপ্লটগুলির জন্য সাধারণ xlabel / ইলাবেল


143

আমার নিম্নলিখিত প্লট রয়েছে:

fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)

এবং এখন আমি এই প্লটটি সাধারণ এক্স-অক্ষ লেবেল এবং y- অক্ষ লেবেলগুলি দিতে চাই। "কমন" দিয়ে আমি বোঝাতে চাইছি সাবপ্লটসের পুরো গ্রিডের নীচে একটি বড় এক্স-অক্ষের লেবেল এবং ডানদিকে একটি বড় ওয়াই-অক্ষের লেবেল থাকা উচিত। এর জন্য ডকুমেন্টেশনে আমি এ সম্পর্কে কিছুই খুঁজে পাচ্ছি না plt.subplots, এবং আমার গুগলিংস সূচিত করে যে plt.subplot(111)শুরু করার জন্য আমাকে আরও বড় করা দরকার - তবে আমি কীভাবে আমার 5 * 2 সাব-প্লটগুলিকে সেই ব্যবহারের মধ্যে রাখব plt.subplots?


2
প্রশ্নের আপডেটের সাথে, এবং এর নীচে উত্তরগুলিতে থাকা মন্তব্যগুলি স্ট্যাকওভারফ্লো
হুকড

আসলেই নয়, যেহেতু আমার প্রশ্নটি plt.subplots (), এবং যে প্রশ্নটি আপনি add_subplot ব্যবহারের সাথে সংযুক্ত করছেন - আমি অ্যাড_সবল্প্লট পরিবর্তন না করে আমি সেই পদ্ধতিটি ব্যবহার করতে পারি না, যা আমি এড়াতে চাই। আমি পারে plt.text সমাধান যা আপনার লিঙ্ক একটি বিকল্প সমাধান হিসেবে দেওয়া হয় ব্যবহার করেন, কিন্তু এটা সবচেয়ে মার্জিত সমাধান নয়।
jolindbe

বিস্তারিতভাবে বোঝার জন্য, যতদূর আমি বুঝতে পেরেছি, plt.subplots একটি বিদ্যমান অক্ষ পরিবেশের মধ্যে সাবপ্লটগুলির একটি সেট তৈরি করতে পারে না, তবে সর্বদা একটি নতুন চিত্র তৈরি করে। রাইট?
jolindbe

একটি সবচেয়ে মার্জিত সমাধান এখানে পাওয়া যাবে: stackoverflow.com/questions/6963035/...
Mr.H

আপনার লিঙ্কটি 4 বছরেরও বেশি আগে ব্যবহারকারী হুকড দ্বারা সরবরাহ করা হয়েছিল (আপনার উপরের কয়েকটি মন্তব্য)। যেমনটি আমি আগেই বলেছি, সেই সমাধানটি add_subplot সম্পর্কিত, এবং plt.subplots () নয়।
jolindbe

উত্তর:


206

এগুলি দেখতে আপনি আসলে যা চান তা দেখে মনে হচ্ছে। এটি আপনার নির্দিষ্ট ক্ষেত্রে এই উত্তরের একই পদ্ধতির প্রয়োগ করে :

import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=3, ncols=3, sharex=True, sharey=True, figsize=(6, 6))

fig.text(0.5, 0.04, 'common X', ha='center')
fig.text(0.04, 0.5, 'common Y', va='center', rotation='vertical')

সাধারণ অক্ষ লেবেল সহ একাধিক প্লট


4
নোট করুন যে এক্স-লেবেলের এক্স-স্থানাঙ্কের জন্য 0.5 লেবেলটিকে কেন্দ্রের সাবপ্লোটের কেন্দ্রে রাখে না। yticklabels অ্যাকাউন্টে আপনাকে তার চেয়ে কিছুটা বড় যেতে হবে।
dbliss

2
ব্যবহার না করে এমন কোনও পদ্ধতির জন্য এই উত্তরটি একবার দেখুন plt.text। আপনি আপনার সাবপ্লটগুলি তৈরি করেন, তবে তারপরে একটি বিট প্লট যুক্ত করুন, এটি অদৃশ্য করে তুলুন এবং এর x এবং y লেবেল করুন।
জেমস ওনার্স

ধন্যবাদ, সাধারণভাবে কাজ করেছেন। ব্যবহারের সময় ভাঙ্গার কোনও সমাধান tight_layout?
সার্ভ-ইনক

3
সঙ্গে @ serv-Inc tight_layoutপ্রতিস্থাপন 0.04সঙ্গে 0কাজ মনে হয়।
ডাইভেক্স

3
ব্যবহার fig.textকরা ভাল ধারণা নয়। এটি এর মতো বিষয়গুলিকে গণ্ডগোল করেplt.tight_layout()
শান্তিময়

55

যেহেতু আমি এটিকে প্রাসঙ্গিক এবং যথেষ্ট মার্জিত হিসাবে বিবেচনা করি (পাঠ্য স্থাপনের জন্য স্থানাঙ্ক নির্দিষ্ট করার প্রয়োজন নেই), তাই আমি অন্য সম্পর্কিত প্রশ্নের একটি উত্তর অনুলিপি করি (সামান্য অভিযোজন সহ) ।

import matplotlib.pyplot as plt
fig, axes = plt.subplots(5, 2, sharex=True, sharey=True, figsize=(6,15))
# add a big axis, hide frame
fig.add_subplot(111, frameon=False)
# hide tick and tick label of the big axis
plt.tick_params(labelcolor='none', top=False, bottom=False, left=False, right=False)
plt.xlabel("common X")
plt.ylabel("common Y")

নিম্নলিখিতগুলির ফলাফল (ম্যাটপ্ল্লোলিব সংস্করণ ২.২.০ সহ):

5 টি সারি এবং 2 টি কলাম সাধারণ এক্স এবং y অক্ষ লেবেল সহ সাবপ্লট


4
সরলতার কারণে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। খুব সোজা। Matplotlib v3.x এর জন্য এখনও প্রাসঙ্গিক
কাইল সোয়ানসন

আমি এটি একাধিক ফিগার অবজেক্টের সাথে কীভাবে ব্যবহার করতে পারি তা জানতে চাই? fig.xlabel ("foo") কাজ করে না।
হরর ভাকুই

এফওয়াইআই: এখন লোকেরা স্ট্যাকওভারফ্লোতে গা themes় থিম ব্যবহার করে, লেবেলগুলি সবেমাত্র পড়া যায় তাই সাদা পটভূমিতে আপনার
পিএনজি

@xyzzyqed আমি জানি না স্ট্যাকওভারফ্লোতে "থিম" এর মতো জিনিস আছে এবং আমি কীভাবে চিত্রটি রপ্তানি করেছি তাও মনে নেই। রফতানির সময় আমি কীভাবে পটভূমি নিয়ন্ত্রণ করতে পারি?
বিলি

2
এই সমাধানের একমাত্র সমস্যাটি হ'ল এটি ব্যবহার করার সময় কাজ করে না constrained_layout=Trueকারণ এটি ওভারল্যাপিং লেবেল তৈরি করে। এই ক্ষেত্রে আপনাকে সাবপ্লটগুলির সীমানা ম্যানুয়ালি সমন্বয় করতে হবে।
বেক্যান্ডার

35

ছাড়া sharex=True, sharey=Trueআপনি পান:

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

এটির সাথে আপনার এটি আরও ভাল হওয়া উচিত:

fig, axes2d = plt.subplots(nrows=3, ncols=3,
                           sharex=True, sharey=True,
                           figsize=(6,6))

for i, row in enumerate(axes2d):
    for j, cell in enumerate(row):
        cell.imshow(np.random.rand(32,32))

plt.tight_layout()

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

তবে আপনি যদি অতিরিক্ত লেবেল যুক্ত করতে চান তবে আপনার এগুলি কেবল প্রান্তের প্লটে যুক্ত করা উচিত:

fig, axes2d = plt.subplots(nrows=3, ncols=3,
                           sharex=True, sharey=True,
                           figsize=(6,6))

for i, row in enumerate(axes2d):
    for j, cell in enumerate(row):
        cell.imshow(np.random.rand(32,32))
        if i == len(axes2d) - 1:
            cell.set_xlabel("noise column: {0:d}".format(j + 1))
        if j == 0:
            cell.set_ylabel("noise row: {0:d}".format(i + 1))

plt.tight_layout()

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

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


উদাহরণস্বরূপ, প্লটের সংখ্যা অজানা (উদাহরণস্বরূপ, আপনি একটি সাধারণ প্লট ফাংশন পেয়ে গেছেন যা যে কোনও সংখ্যক সাবপ্লোটের জন্য কাজ করে) এটি অনেক বেশি শক্ত।
nnot101

15

যেহেতু আদেশ:

fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)

আপনি যদি একটি tuple চিত্রে এবং অক্ষ দৃষ্টান্ত একটি তালিকা গঠিত আয় ব্যবহৃত, এটি আগে থেকেই (মন যে আমি পরিবর্তন করেছি ভালো কিছু করতে যথেষ্ট fig,axকরার fig,axes):

fig,axes = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)

for ax in axes:
    ax.set_xlabel('Common x-label')
    ax.set_ylabel('Common y-label')

আপনি যদি কোনও নির্দিষ্ট সাবপ্লট-এর কিছু বিশদ পরিবর্তন করতে চান তবে আপনি axes[i]যেখান থেকে এটি অ্যাক্সেস করতে পারেনi আপনার সাবপ্লটগুলি দিয়ে পুনরাবৃত্তি ।

এটি অন্তর্ভুক্ত করা খুব সহায়ক হতে পারে

fig.tight_layout()

plt.show()ওভারল্যাপিং লেবেলগুলি এড়ানোর জন্য ফাইলটির শেষে, এর আগে


5
আমি দুঃখিত আমি উপরে কিছুটা অস্পষ্ট ছিলাম। "কমন" দিয়ে আমি সমস্ত প্লটের নীচে একটি একক এক্স লেবেল এবং প্লটগুলির বামে একটি একক y লেবেল দিয়ে বোঝাতে প্রশ্নটি আপডেট করেছি।
jolindbe

2
@ জোহানলাইন্ডবার্গ: আপনার মন্তব্যগুলি এখানে এবং উপরে সম্পর্কিত: প্রকৃতপক্ষে plt.subplots()একটি নতুন চিত্রের উদাহরণ তৈরি করবে। আপনি যদি এই কমান্ডটি আটকে রাখতে চান তবে আপনি সহজেই একটি যুক্ত করতে পারেন big_ax = fig.add_subplot(111), কারণ আপনার ইতিমধ্যে একটি চিত্র রয়েছে এবং অন্য অক্ষটি যুক্ত করতে পারেন। এর পরে, আপনি big_axহুকডের লিঙ্কে এটি যেভাবে দেখানো হয়েছে তা হেরফের করতে পারেন।
মারিয়াস

আপনার পরামর্শের জন্য ধন্যবাদ, তবে আমি যদি এটি করি তবে plt.subplots () এর পরে আমাকে বিগ_এক্স যুক্ত করতে হবে এবং আমি সেই সাবপ্লটটি অন্য কিছুর উপরে পেয়েছি - আমি কি এটিকে স্বচ্ছ করতে পারি বা কোনওভাবে পিছনে প্রেরণ করতে পারি? এমনকি যদি আমি হুকডের লিঙ্কের মতো সমস্ত রঙ কোনওটিতে না সেট করি, তবুও এটি আমার সমস্ত সাবপ্লটগুলি coveringাকা একটি সাদা বাক্স।
jolindbe

2
@ জোহান লিন্ডবার্গ, আপনি ঠিক বলেছেন, আমি এটি পরীক্ষা করে দেখিনি। তবে আপনি সহজেই বড় অক্ষের পটভূমি রঙটি এতে করে সেট করতে পারেন none: big_ax.set_axis_bgcolor('none')আপনার এছাড়াও লেবেল রঙটি করা উচিত none( হুকডের সাথে যুক্ত উদাহরণটির বিপরীতে):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
মারিয়াস

2
আমি একটি ত্রুটি পেয়েছি: AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'বিবৃতিতে ax.set_xlabel('Common x-label')। আপনি কি এটা ধরতে পেরেছেন?
হেনগ্সিন

5

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

fig_size = [8, 6]
fig, ax = plt.subplots(5, 2, sharex=True, sharey=True, figsize=fig_size)
# Reserve space for axis labels
ax[-1, 0].set_xlabel('.', color=(0, 0, 0, 0))
ax[-1, 0].set_ylabel('.', color=(0, 0, 0, 0))
# Make common axis labels
fig.text(0.5, 0.04, 'common X', va='center', ha='center', fontsize=rcParams['axes.labelsize'])
fig.text(0.04, 0.5, 'common Y', va='center', ha='center', rotation='vertical', fontsize=rcParams['axes.labelsize'])

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


1
অদৃশ্য লেবেলের দুর্দান্ত ব্যবহার! আপনাকে ধন্যবাদ
colelemonz

3

গ্রাফের গ্রিডের পরিকল্পনা করার সময় আমি একই ধরণের সমস্যায় পড়েছি। গ্রাফ দুটি অংশ (উপরে এবং নীচে) নিয়ে গঠিত। Y- লেবেল উভয় অংশের কেন্দ্রিক হওয়ার কথা ছিল।

আমি কোনও সমাধান ব্যবহার করতে চাইনি যা বাইরের চিত্রের অবস্থান (যেমন ডুমুর.পাঠ () এর মতো) জানার উপর নির্ভর করে, তাই আমি সেট_ইলাবেল () ফাংশনের y- অবস্থানটি চালিত করেছিলাম। এটি সাধারণত 0.5 হয়, প্লটের সাথে এটি যুক্ত হয়। যেহেতু আমার কোডে অংশ (hspace) এর মধ্যে প্যাডিং শূন্য ছিল, আমি উপরের অংশের সাথে তুলনামূলকভাবে দুটি অংশের মধ্যবর্তী গণনা করতে পারি।

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

# Create outer and inner grid
outerGrid = gridspec.GridSpec(2, 3, width_ratios=[1,1,1], height_ratios=[1,1])
somePlot = gridspec.GridSpecFromSubplotSpec(2, 1,
               subplot_spec=outerGrid[3], height_ratios=[1,3], hspace = 0)

# Add two partial plots
partA = plt.subplot(somePlot[0])
partB = plt.subplot(somePlot[1])

# No x-ticks for the upper plot
plt.setp(partA.get_xticklabels(), visible=False)

# The center is (height(top)-height(bottom))/(2*height(top))
# Simplified to 0.5 - height(bottom)/(2*height(top))
mid = 0.5-somePlot.get_height_ratios()[1]/(2.*somePlot.get_height_ratios()[0])
# Place the y-label
partA.set_ylabel('shared label', y = mid)

plt.show()

ছবি

downsides:

  • প্লটের আনুভূমিক দূরত্ব উপরের অংশের উপর ভিত্তি করে নীচের টিকগুলি লেবেলে প্রসারিত হতে পারে।

  • সূত্রটি অংশগুলির মধ্যে স্থান বিবেচনা করে না।

  • শীর্ষ অংশের উচ্চতা 0 হলে একটি ব্যতিক্রম ছুঁড়ে দেয়।

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


আরে, আমি আপনার উত্তরের শিরাতে এটি করার অনেক উপায় খুঁজে পেয়েছি তবে এর মধ্যে কিছু সমস্যা সমাধান হতে পারে; দেখতে stackoverflow.com/a/44020303/4970632 (নীচে)
লুক ডেভিস

2

হালনাগাদ:

এই বৈশিষ্ট্যটি এখন আমি পাইপিতে প্রকাশিত প্রোপ্লট ম্যাটপ্ল্লিটিব প্যাকেজের অংশ । ডিফল্টরূপে, আপনি পরিসংখ্যান তৈরি করার সময়, লেবেলগুলি অক্ষগুলির মধ্যে "ভাগ" করা হয়।


আসল উত্তর:

আমি আরও শক্তিশালী পদ্ধতি আবিষ্কার করেছি:

আপনি যদি bottomtopকোয়ার্গসগুলি জানেন যা সূচনাতে গিয়েছিল GridSpecবা আপনি অন্যথায় Figureস্থানাঙ্কগুলিতে আপনার অক্ষগুলির প্রান্তগুলি জানেন তবে আপনি Figureকিছু অভিনব "ট্রান্সফর্ম" যাদুতে স্থানাঙ্কগুলিতে ইয়েলবেল অবস্থানটিও নির্দিষ্ট করতে পারেন । উদাহরণ স্বরূপ:

import matplotlib.transforms as mtransforms
bottom, top = .1, .9
f, a = plt.subplots(nrows=2, ncols=1, bottom=bottom, top=top)
avepos = (bottom+top)/2
a[0].yaxis.label.set_transform(mtransforms.blended_transform_factory(
       mtransforms.IdentityTransform(), f.transFigure # specify x, y transform
       )) # changed from default blend (IdentityTransform(), a[0].transAxes)
a[0].yaxis.label.set_position((0, avepos))
a[0].set_ylabel('Hello, world!')

... এবং আপনার দেখতে হবে যে লেবেলটি এখনও স্বাভাবিকের মতো টিক্লেবেলগুলি দিয়ে ওভারল্যাপিং করা থেকে বাম-ডানদিকে যথাযথভাবে সামঞ্জস্য করে - তবে এখন এটি সর্বদা ঠিক ঠিক মাঝখানে স্থায়ী হবে পছন্দসই subplots।

তদুপরি, আপনি এমনকি ব্যবহার না করা set_positionহলে ইলাবেলটি চিত্রের ঠিক অর্ধেকটা ডিফল্টরূপে প্রদর্শিত হবে । আমি অনুমান করছি এটি কারণ কারণ যখন শেষ পর্যন্ত লেবেলটি টানা হবে তখন অন্তর্নিহিত স্থানাঙ্কের রূপান্তরটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা না করেই-সমবায়নের matplotlibজন্য 0.5 ব্যবহার করে y

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