কীভাবে কিংবদন্তিটি প্লটের বাইরে রাখবেন


986

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

  1. আমি কিংবদন্তি বাক্সটি প্লটের জায়গার বাইরে রাখতে চাই। (আমি চাই যে কিংবদন্তিটি প্লটের জায়গার ডানদিকে থাকুক)
  2. যাইহোক এমন কি আছে যে আমি কিংবদন্তি বাক্সের অভ্যন্তরে পাঠ্যের ফন্টের আকার হ্রাস করি, যাতে কিংবদন্তির বাক্সটির আকার ছোট হবে।

14
আরও নতুন ম্যাটপ্লোটিলব সংস্করণগুলির জন্য, এই উত্তরটি প্লটগুলির সাথে হস্তক্ষেপ না করে কিংবদন্তিটি কোথায় রাখবেন তা স্বয়ংক্রিয়ভাবে নির্ধারণ করার জন্য ম্যাটপ্ল্লিটিব কীভাবে সেট করবেন তা দেখায় ।
dotancohen

2
একই প্রশ্ন ছিল এবং এই মহান উদাহরণ আমার জন্য কাজ "বাক্সের বাইরে" পাওয়া গেছে: matplotlib.org/1.3.1/users/legend_guide.html
robodasha

1
এই উত্তরের আরও গভীরতা রয়েছে https://stackoverflow.com/a/43439132/52074। এবং কোড দুটি লাইন দিয়ে না! +1200 upvated উত্তরটি খুব ভাল তবে আমি এটি কম জেনেরিক বলে মনে করেছি।
ট্রেভর বয়েড স্মিথ

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

বিটিডব্লিউ, লোকের পছন্দের তালিকার: সেরা; উপরের ডান; উপরের বাম; নিচে বামদিকে; নীচে ডান ডান; বামদিকে; ঠিক কেন্দ্র; নিম্ন কেন্দ্র; উপরের কেন্দ্র; কেন্দ্র;
Z-Y00

উত্তর:


57

আপনি ফন্টের বৈশিষ্ট্য তৈরি করে কিংবদন্তি পাঠ্যকে ছোট করতে পারেন:

from matplotlib.font_manager import FontProperties

fontP = FontProperties()
fontP.set_size('small')
legend([plot1], "title", prop=fontP) 
# or add prop=fontP to whatever legend() call you already have

50
কি plot1এই উত্তরটি কি?
পল এইচ

41
কি legendএই উত্তরটি কি?
রিচার্ড

28
এটি প্রশ্নের দ্বিতীয় অংশের উত্তর দেয়, তবে প্রাথমিক নয় (যার শিরোনামযুক্ত)।
মতিন উলহাক

8
এছাড়াও, এটি করার সঠিক plt.legend(fontsize='small')
উপায়টি

41
এই উত্তরটি ভয়ানক এবং খুব সামান্য প্রসঙ্গ সরবরাহ করে!
টেকিল

1793

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

আপনি ফন্টের আকার হ্রাস করার বিষয়টি বিবেচনা করার আগে (যা জিনিসগুলিকে ভয়ঙ্করভাবে পড়তে অসুবিধায় করতে পারে) বিভিন্ন জায়গায় কিংবদন্তি স্থাপন করে ঘুরে দেখার চেষ্টা করুন:

সুতরাং, আসুন একটি সাধারণ উদাহরণ দিয়ে শুরু করা যাক:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()

plt.show()

বিকল্প পাঠ

যদি আমরা একই জিনিসটি করি তবে bbox_to_anchorকীওয়ার্ড আর্গুমেন্টটি ব্যবহার করুন আমরা অক্ষের সীমানার বাইরে কিংবদন্তিটি কিছুটা স্থানান্তর করতে পারি:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend(bbox_to_anchor=(1.1, 1.05))

plt.show()

বিকল্প পাঠ

একইভাবে, আপনি কিংবদন্তিটিকে আরও অনুভূমিক করে তুলতে পারেন এবং / অথবা এটি চিত্রের শীর্ষে রাখতে পারেন (আমি বৃত্তাকার কোণগুলি এবং একটি সাধারণ ড্রপ শেডোও চালু করছি):

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)

ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),
          ncol=3, fancybox=True, shadow=True)
plt.show()

বিকল্প পাঠ

বিকল্পভাবে, আপনি বর্তমান প্লটের প্রস্থ সঙ্কুচিত করতে পারেন, এবং কিংবদন্তিকে পুরোপুরি চিত্রের অক্ষের বাইরে রেখে দিতে পারেন (দ্রষ্টব্য: আপনি যদি টাইট_এলআউট () ব্যবহার করেন তবে ax.set_position () ছেড়ে দিন:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)

# Shrink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])

# Put a legend to the right of the current axis
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.show()

বিকল্প পাঠ

এবং একইভাবে, আপনি প্লটটি উল্লম্বভাবে সঙ্কুচিত করতে পারেন এবং নীচের দিকে একটি অনুভূমিক কিংবদন্তি স্থাপন করতে পারেন:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)

# Shrink current axis's height by 10% on the bottom
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
                 box.width, box.height * 0.9])

# Put a legend below current axis
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
          fancybox=True, shadow=True, ncol=5)

plt.show()

বিকল্প পাঠ

কটাক্ষপাত আছে matplotlib কিংবদন্তি নির্দেশিকা । আপনিও একবার দেখে নিতে পারেন plt.figlegend()


10
যদি কারও সাথে এটির সমস্যা হয় তবে মনে রাখবেন যে টাইট_লেআউট () সমস্যা সৃষ্টি করবে!
ম্যাথু জি।

4
দুর্দান্ত উত্তর! ডক সঠিক লিঙ্ক matplotlib.org/users/legend_guide.html#legend-location
meduz

4
সম্পূর্ণরূপে, আপনি বলতে পারেন যে সাধারণভাবে (ডক থেকে সংক্ষিপ্ত) " bbox_to_anchor4 টি ফ্লোট (x, y, প্রস্থ, বক্সের উচ্চতা) এর একটি টিপল, বা 2 টি ফ্লোট (x, y) এর সাধারণ কাঠের একটি টিপল স্থানাঙ্ক। "
মেডুজ

5
আমাকে অবশ্যই স্বীকার করতে হবে এটি সম্ভবত আমার সবচেয়ে পরিদর্শন করা SO উত্তর। আমি এটির বার বার ফিরে আসতে সাহায্য করতে পারি না কারণ এখানে যুক্তি না দেখাই কোনও যুক্তিযুক্ত ব্যক্তি এই যুক্তিটি মনে রাখতে পারে না।
কে.টি.

9
নোট করুন আপনি যদি ফাইলটিতে চিত্র সংরক্ষণ করতে চান তবে আপনার legend = ax.legend()fig.savefig(bbox_extra_artists=(legend,))
প্রত্যাশিত

786

কিংবদন্তি স্থাপন করা ( bbox_to_anchor)

একটি কিংবদন্তিটি locআর্গুমেন্টটি ব্যবহার করে অক্ষগুলির সীমানা বাক্সের ভিতরে অবস্থান করে plt.legend
উদাহরণস্বরূপ loc="upper right"সীমানা বাক্সের উপরের ডানদিকে কোণে কিংবদন্তি স্থাপন করা হয়, যা ডিফল্টরূপে অক্ষের স্থানাঙ্কে (বা বাউন্ডিং বক্স নোটেশনে ) (0,0)প্রসারিত (1,1)হয় (x0,y0, width, height)=(0,0,1,1)

অক্ষ বাউন্ডিং বাক্সের বাইরে কিংবদন্তি স্থাপন করতে, কেউ (x0,y0)কিংবদন্তির নীচের বাম কোণে অক্ষের স্থানাঙ্কের একটি দ্বৈত নির্দিষ্ট করতে পারে ।

plt.legend(loc=(1.04,0))

যাইহোক, আরও বহুমুখী পদ্ধতির bbox_to_anchorযুক্তিটি ব্যবহার করে ম্যানুয়ালি বাউন্ডিং বক্সটি নির্দিষ্ট করা উচিত যার মধ্যে কিংবদন্তি স্থাপন করা উচিত । কেউ নিজেকে (x0,y0)বাক্সের অংশ সরবরাহ করতে সীমাবদ্ধ করতে পারে । এটি একটি শূন্য স্প্যান বাক্স তৈরি করে, যার মধ্যে কিংবদন্তিটি locআর্গুমেন্টের দ্বারা প্রদত্ত দিকে প্রসারিত করবে । যেমন

plt.legnd (bbox_to_anchor = (1.04,1), লোক = "উপরের বাম")

কিংবদন্তিটি অক্ষের বাইরে রাখে, যেমন কিংবদন্তির উপরের বাম কোণটি (1.04,1)অক্ষ স্থানাঙ্কে অবস্থিত।

আরও উদাহরণ নীচে দেওয়া হল, যেখানে অতিরিক্ত যুক্তিগুলির মত modeএবং ncolsএর মধ্যে ইন্টারপ্লেও প্রদর্শিত হয়।

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

l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
                mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right", 
                bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")

কিভাবে 4-tuple যুক্তি ব্যাখ্যা করতে সম্পর্কিত বিশদ বিবরণ থেকে bbox_to_anchor, হিসাবে l4, খুঁজে পাওয়া যেতে পারে এই প্রশ্নেরmode="expand"4-tuple কর্তৃক প্রদত্ত সীমান্ত বক্সের ভিতরে অনুভূমিকভাবে কিংবদন্তি বিস্তৃতি ঘটে। উল্লম্বভাবে প্রসারিত কিংবদন্তির জন্য, এই প্রশ্নটি দেখুন

কখনও কখনও এটি অক্ষ স্থানাঙ্কের পরিবর্তে চিত্রের স্থানাঙ্কে বাউন্ডিং বক্স নির্দিষ্ট করা কার্যকর হতে পারে। এটি l5উপরের উদাহরণে দেখানো হয়েছে , যেখানে bbox_transformআর্গুমেন্টটি চিত্রের নীচের বাম কোণে কিংবদন্তি স্থাপন করতে ব্যবহৃত হয়।

পোস্ট প্রসেসিং

কিংবদন্তিটি অক্ষের বাইরে রাখার ফলে প্রায়শই অনাকাঙ্ক্ষিত পরিস্থিতির দিকে পরিচালিত হয় যে এটি চিত্র বা ক্যানভাসের সম্পূর্ণ বা আংশিক।

এই সমস্যার সমাধানগুলি হ'ল:

  • সাবপ্লট প্যারামিটারগুলি
    সামঞ্জস্য করুন কেউ সাবপ্লট প্যারামিটারগুলি এমনভাবে সামঞ্জস্য করতে পারে যে অক্ষগুলি ব্যবহার করে চিত্রের অভ্যন্তরে কম স্থান নেয় (এবং এর ফলে কিংবদন্তিতে আরও স্থান ছেড়ে যায়) plt.subplots_adjust। যেমন

    plt.subplots_adjust(right=0.7)

    চিত্রের ডানদিকে 30% স্থান রেখে দেয়, যেখানে কেউ কিংবদন্তি রাখতে পারে।

  • আঁটসাঁট লেআউট
    ব্যবহার plt.tight_layoutকরে সাবপ্লট প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে মঞ্জুরি দেয় যাতে চিত্রের উপাদানগুলি চিত্রের কিনারাগুলির বিরুদ্ধে শক্ত হয়ে বসে থাকে। দুর্ভাগ্যক্রমে, এই অটোমেটিজমে কিংবদন্তিটি বিবেচনায় নেওয়া হয় নি, তবে আমরা একটি আয়তক্ষেত্র বাক্স সরবরাহ করতে পারি যা পুরো সাবপ্লট এলাকা (লেবেল সহ) এর মধ্যে খাপ খায়।

    plt.tight_layout(rect=[0,0,0.75,1])
  • ফিগারটি সংরক্ষণ করেbbox_inches = "tight"
    যুক্তিটি চিত্রটি সংরক্ষণ করতে ব্যবহার bbox_inches = "tight"করা plt.savefigযেতে পারে যাতে ক্যানভাসের সমস্ত শিল্পী (কিংবদন্তি সহ) সংরক্ষিত অঞ্চলে ফিট হয়ে যায়। প্রয়োজনে চিত্রের আকারটি স্বয়ংক্রিয়ভাবে সামঞ্জস্য হয়।

    plt.savefig("output.png", bbox_inches="tight")
  • সাবপ্লট প্যারামগুলি
    স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে সাবপ্লট অবস্থানটি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করার একটি উপায় যা চিত্রের আকার পরিবর্তন না করে ক্যানভাসের মধ্যে কিংবদন্তি ফিট করে এই উত্তরটিতে পাওয়া যাবে: সঠিক আকার এবং কোনও প্যাডিং সহ চিত্র তৈরি করা (এবং অক্ষগুলির বাইরে কিংবদন্তি)

উপরে আলোচিত মামলার মধ্যে তুলনা:

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

বিকল্প

চিত্রের কিংবদন্তি
কোনও অক্ষের পরিবর্তে চিত্রটিতে কিংবদন্তি ব্যবহার করতে পারে matplotlib.figure.Figure.legend। এটি ম্যাটপ্ল্লোলিব সংস্করণ> = 2.1 এর জন্য বিশেষত দরকারী হয়ে উঠেছে, যেখানে কোনও বিশেষ যুক্তির প্রয়োজন নেই

fig.legend(loc=7) 

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

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
    axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))

fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)   
plt.show()

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

ডেডিকেটেড সাবপ্লোট অক্ষের অভ্যন্তরে কিংবদন্তি
ব্যবহারের বিকল্প হ'লbbox_to_anchor কিংবদন্তিটিকে তার উত্সর্গীকৃত সাবপ্ল্লট অক্ষগুলিতে স্থাপন করা হবে lax। কিংবদন্তি সাবপ্লট প্লটটির চেয়ে ছোট হওয়া উচিত, তাই আমরা gridspec_kw={"width_ratios":[4,1]}অক্ষ তৈরিতে ব্যবহার করতে পারি । আমরা অক্ষ লুকিয়ে রাখতে পারেন lax.axis("off")কিন্তু এখনও একটি কিংবদন্তি করা। কিংবদন্তি পরিচালনা ও লেবেল মাধ্যমে বাস্তব চক্রান্ত থেকে প্রাপ্ত প্রয়োজন h,l = ax.get_legend_handles_labels(), এবং তারপর মধ্যে কিংবদন্তি সরবরাহ করা যেতে পারে lax, উপকাহিনী lax.legend(h,l)। একটি সম্পূর্ণ উদাহরণ নীচে।

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2

fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....

h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")

plt.tight_layout()
plt.show()

এটি এমন একটি প্লট তৈরি করে যা উপরের প্লটের সাথে দৃশ্যত বেশ অনুরূপ:

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

কিংবদন্তি স্থাপনের জন্য আমরা প্রথম অক্ষ ব্যবহার করতে পারি bbox_transform, তবে কিংবদন্তি অক্ষগুলির ব্যবহার করতে পারি ,

ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")

এই পদ্ধতির ক্ষেত্রে, আমাদের বাহ্যিকভাবে কিংবদন্তি হ্যান্ডলগুলি প্রাপ্ত করার দরকার নেই, তবে আমাদের bbox_to_anchorযুক্তি নির্দিষ্ট করতে হবে ।

আরও পড়া এবং নোট:

  • কিংবদন্তিদের সাথে আপনি কী করতে চান এমন অন্যান্য জিনিসগুলির কয়েকটি উদাহরণ সহ ম্যাটপ্ল্লোব কিংবদন্তি গাইডটি বিবেচনা করুন ।
  • পাই চার্টের জন্য কিংবদন্তি স্থাপনের কয়েকটি উদাহরণ কোড সরাসরি এই প্রশ্নের উত্তরে পাওয়া যেতে পারে: পাইথন - পাই চার্টের সাথে কিংবদন্তি ওভারল্যাপ হয়
  • locযুক্তি স্ট্রিং পরিবর্তে সংখ্যা, যা কল খাটো করতে নিতে পারে, যাইহোক, তারা খুব intuitively একে অপরের সাথে ম্যাপ করা হয় না। রেফারেন্সের জন্য ম্যাপিংটি এখানে:

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


একটি উত্সর্গীকৃত সাবপ্লোট অক্ষ অক্ষের সাথে খুব সুন্দরভাবে কিংবদন্তি স্থাপন করা fig.tight_layout। আপনি যদি plt.subplotsঅক্ষ তৈরি করতে ব্যবহার করছেন তবে কেবল এটির gridspec_kw={'height_ratios': [100, 1]}(বা প্রস্থ_রাটিও) জাতীয় কিছু দিন যাতে কিংবদন্তীর অক্ষগুলি ক্ষুদ্র হয় ... তারপরে fig.tight_layout()এটি ফিট করার জন্য এটি প্রসারিত হবে। কমপক্ষে matplotlib 3.0.3 এর জন্য।
travc

160

কল legend()করার পরে কেবল কলটি কল করুন plot():

# matplotlib
plt.plot(...)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))

# Pandas
df.myCol.plot().legend(loc='center left', bbox_to_anchor=(1, 0.5))

ফলাফলগুলি এরকম কিছু দেখায়:

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


4
একই প্যারামিটারগুলি
matplotlib.pyplot.legend এ

8
এটি কি অন্য কারও জন্য কিংবদন্তির শব্দগুলি কেটে দেয়?
ব্যবহারকারী 1717828

85

প্লট এলাকার বাইরে কিংবদন্তি স্থাপন করতে, এর কীওয়ার্ড locএবং ব্যবহার করুন । উদাহরণস্বরূপ, নিম্নলিখিত কোডটি প্লট ক্ষেত্রের ডানদিকে কিংবদন্তি স্থাপন করবে:bbox_to_anchorlegend()

legend(loc="upper left", bbox_to_anchor=(1,1))

আরও তথ্যের জন্য কিংবদন্তি গাইডটি দেখুন


10
ঠিক আছে - আমি বাস্তবায়ন পছন্দ করি, কিন্তু যখন আমি চিত্রটি সংরক্ষণ করতে যাই (উইন্ডোতে এটি ম্যানুয়ালি আকার পরিবর্তন না করে যা আমি প্রতিবারই করতে চাই না), কিংবদন্তিটি কেটে ফেলা হচ্ছে। আমি কীভাবে এটি ঠিক করতে পারি সে সম্পর্কে কোনও ধারণা?
অ্যাস্ট্রোম্যাক্স

@ এস্ট্রোম্যাক্স আমি নিশ্চিত নই তবে সম্ভবত কল করার চেষ্টা করছি plt.tight_layout()?
খ্রিস্টান অ্যালিস

81

সংক্ষিপ্ত উত্তর: আপনি bbox_to_anchor+ bbox_extra_artists+ ব্যবহার করতে পারেন bbox_inches='tight'


দীর্ঘ উত্তর: আপনি bbox_to_anchorকিংবদন্তি বাক্সের অবস্থানটি ম্যানুয়ালি নির্দিষ্ট করতে ব্যবহার করতে পারেন , যেমন উত্তরগুলিতে কিছু অন্যান্য ব্যক্তি নির্দেশ করেছেন।

তবে, সাধারণ সমস্যাটি হ'ল কিংবদন্তি বাক্সটি ক্রপ করা হয়, যেমন:

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')

fig.savefig('image_output.png', dpi=300, format='png')

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

কিংবদন্তি বাক্সটি ক্রপ হওয়া থেকে রোধ করতে আপনি যখন চিত্রটি সংরক্ষণ করেন তখন আপনি প্যারামিটারগুলি ব্যবহার করতে পারেন bbox_extra_artistsএবং সংরক্ষিত চিত্রটিতে শস্যযুক্ত উপাদানগুলি অন্তর্ভুক্ত করার bbox_inchesজন্য জিজ্ঞাসা করতে পারেন savefig:

fig.savefig('image_output.png', bbox_extra_artists=(lgd,), bbox_inches='tight')

উদাহরণ (আমি কেবলমাত্র 2 প্যারামিটার যুক্ত করতে সর্বশেষ লাইনটি পরিবর্তন করেছি fig.savefig()):

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')    

fig.savefig('image_output.png', dpi=300, format='png', bbox_extra_artists=(lgd,), bbox_inches='tight')

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

আমি আশা করি মতলব্লিট যেমন মতলবের মতো কিংবদন্তি বাক্সের জন্য স্থানীয়ভাবে বাইরে অবস্থানের অনুমতি দিতেন :

figure
x = 0:.2:12;
plot(x,besselj(1,x),x,besselj(2,x),x,besselj(3,x));
hleg = legend('First','Second','Third',...
              'Location','NorthEastOutside')
% Make the text of the legend italic and color it brown
set(hleg,'FontAngle','italic','TextColor',[.3,.2,.1])

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


6
তোমাকে অনেক ধন্যবাদ! "Bbox_to_anchor", "bbox_extra_artist" এবং "" bbox_inches = 'টাইট "পরামিতিগুলি সঠিকভাবে এটির কাজ করার জন্য আমার যা প্রয়োজন ছিল তা ছিল Aw আশ্চর্য!
ডেমিটারিয়ান

6
আপনাকে ধন্যবাদ, তবে বাস্তবে bbox_inches='tight'আমার জন্য সম্পূর্ণরূপে কাজ করে এমনকি bbox_extra_artist ছাড়াই
avtomaton

1
@ ওভোম্যাটন ধন্যবাদ, জেনে রাখা ভাল, আপনি ম্যাটপ্ল্লিটিবের কোন সংস্করণ ব্যবহার করেন?
ফ্রাঙ্ক ডারননকোর্ট

1
@ ফ্র্যাঙ্কডারনোনকোর্ট পাইথন 3, ম্যাটপ্ল্লোলিব সংস্করণ 1.5.3
অ্যাভটোমাটন

68

এখানে সমস্ত দুর্দান্ত উত্তরের পাশাপাশি, এর আরও নতুন সংস্করণ matplotlibএবং সম্ভব হলে প্লটের সাথে হস্তক্ষেপ না করে কিংবদন্তিটি কোথায় স্থাপন করা যায় তা স্বয়ংক্রিয়ভাবে নির্ধারণpylab করতে পারে।

pylab.legend(loc='best')

এটি সম্ভব হলে উপাত্তগুলিকে স্বয়ংক্রিয়ভাবে ডেটা থেকে দূরে রাখবে! লোক = 'সেরা' ব্যবহারের তুলনা করুন

যাইহোক, যদি ডেটাটি ওভারল্যাপ না করে কিংবদন্তি স্থাপনের কোনও জায়গা না থাকে, তবে আপনি অন্য উত্তরগুলির একটির চেষ্টা করতে চাইবেন; ব্যবহার loc="best"কখনও কখনও চক্রান্তের বাইরে কিংবদন্তি রাখবে না ।


2
এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ! আমি কয়েক বছর আগে এটি সন্ধান করেছি এবং এটি পাইনি এবং এটি এমন একটি বিষয় যা সত্যই আমার জীবনকে সহজ করে তোলে makes
এডগার এইচ

4
এই বিকল্পটি সহায়ক তবে প্রশ্নের জবাব দেয় না তাই আমি হ্রাস পেয়েছি। যতদূর আমি বলতে পারি, কিংবদন্তিটিকে কখনই প্লটের বাইরে রাখে না
টমি

3
@ টমি: ওপির মন্তব্যে (যা এখন চলে গেছে বলে মনে হয়) স্পষ্ট করেই স্পষ্ট করে বলা হয়েছিল যে ওপি গ্রন্থের ডেটা coverাকা না দেওয়ার জন্য কিংবদন্তিটি চেয়েছিল, এবং তিনি মনে করেছিলেন যে প্লটের বাইরে এটিই ছিল একমাত্র উপায়। আপনি এটি mefathy, মাতেও সানচেজ, বাসটিয়ান এবং রাডটেকের উত্তরগুলিতে দেখতে পারেন। ওপি এক্স চেয়েছিল, তবে সে ওয়াই চেয়েছিল
dotancohen

1
আসলে না. তিনি / তিনি বিশেষভাবে কিংবদন্তির জন্য প্লটের বাইরে থাকতে বলেছিলেন। এটি প্রশ্নের নামে;) "কীভাবে এই কিংবদন্তিকে চক্রান্তের বাইরে রাখবেন"।
দুরবাচিত

4
এটি গ্যারান্টি দেয় না যে কিংবদন্তি ডেটা অস্পষ্ট করে না। কেবল একটি খুব ঘন প্লট করুন - কিংবদন্তি রাখার কোনও জায়গা নেই। উদাহরণস্বরূপ, নামী আমদানি অ্যারেঞ্জ, পাপ, পিআইপি আমদানি matplotlib.pyplot থেকে plt t = অ্যারেঞ্জ (0.0, 100.0, 0.01) ডুমুর = plt.figure (1) ax1 = fig.add_subplot (211) ax1 হিসাবে এটি চেষ্টা করুন ... স্ক্যাটার (টি, সিন (2 * পাই * টি), লেবেল = 'পরীক্ষা') ax1.grid (সত্য) # ax1.set_ylim ((- 2, 2)) ax1.set_ylabel ('1 Hz') ax1.set_title ( Ax1.get_xticklabels () এ লেবেলের জন্য 'একটি সাইন ওয়েভ বা দুটি':: label.set_color ('r') plt.legnd (লোক = 'সেরা') plt.show ()
adam.r

56

সংক্ষিপ্ত উত্তর : কিংবদন্তিটিতে টেনে নেওয়ার যোগ্যকে ডেকে আনুন এবং আপনি যেখানেই চান ইন্টারেক্টিভভাবে এটিকে সরিয়ে দিন:

ax.legend().draggable()

দীর্ঘ উত্তর : আপনি যদি কিংবদন্তিটিকে প্রোগ্রামটিভের পরিবর্তে ইন্টারেক্টিভ / ম্যানুয়ালি স্থাপন করতে পছন্দ করেন তবে আপনি কিংবদন্তির ড্রাগেবল মোডটি টগল করতে পারেন যাতে আপনি যেখানে খুশি সেখানে টানতে পারেন। নীচের উদাহরণটি দেখুন:

import matplotlib.pylab as plt
import numpy as np
#define the figure and get an axes instance
fig = plt.figure()
ax = fig.add_subplot(111)
#plot the data
x = np.arange(-5, 6)
ax.plot(x, x*x, label='y = x^2')
ax.plot(x, x*x*x, label='y = x^3')
ax.legend().draggable()
plt.show()

নিশ্চিত নয় যে আমি এটি পুরোপুরি বুঝতে পেরেছি। আমি যেখানেই চাই না কেন এই কিংবদন্তিকে কীভাবে "টেনে আনব"? আমি পাইথন 3.6 এবং জুপিটার নোটবুক
sb2020

14

আপনি যা চেয়েছিলেন ঠিক তা নয়, তবে আমি খুঁজে পেয়েছি এটি একই সমস্যার জন্য একটি বিকল্প। কিংবদন্তিকে আধা-ট্রান্সপার্যান্ট করুন, এর মতো করুন: আধা স্বচ্ছ কিংবদন্তি এবং সেমিট্রান্সেন্ট প্যারেন্ট টেক্সট বাক্স সহ ম্যাটপ্লটলিব প্লট

এটি দিয়ে:

fig = pylab.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,label=label,color=color)
# Make the legend transparent:
ax.legend(loc=2,fontsize=10,fancybox=True).get_frame().set_alpha(0.5)
# Make a transparent text box
ax.text(0.02,0.02,yourstring, verticalalignment='bottom',
                     horizontalalignment='left',
                     fontsize=10,
                     bbox={'facecolor':'white', 'alpha':0.6, 'pad':10},
                     transform=self.ax.transAxes)

8

উল্লিখিত হিসাবে, আপনি প্লটটিতে কিংবদন্তি স্থাপন করতে পারেন, বা এটি সামান্য প্রান্তেও রেখে দিতে পারেন। আইপিথন নোটবুক দিয়ে তৈরি প্লটলি পাইথন এপিআই ব্যবহার করে এখানে একটি উদাহরণ দেওয়া আছে । আমি দলে আছি

শুরু করতে, আপনি প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করতে চাইবেন:

import plotly
import math
import random
import numpy as np

তারপরে, প্লটলি ইনস্টল করুন:

un='IPython.Demo'
k='1fw3zw2o13'
py = plotly.plotly(username=un, key=k)


def sin(x,n):
sine = 0
for i in range(n):
    sign = (-1)**i
    sine = sine + ((x**(2.0*i+1))/math.factorial(2*i+1))*sign
return sine

x = np.arange(-12,12,0.1)

anno = {
'text': '$\\sum_{k=0}^{\\infty} \\frac {(-1)^k x^{1+2k}}{(1 + 2k)!}$',
'x': 0.3, 'y': 0.6,'xref': "paper", 'yref': "paper",'showarrow': False,
'font':{'size':24}
}

l = {
'annotations': [anno], 
'title': 'Taylor series of sine',
'xaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'yaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'legend':{'font':{'size':16},'bordercolor':'white','bgcolor':'#fcfcfc'}
}

py.iplot([{'x':x, 'y':sin(x,1), 'line':{'color':'#e377c2'}, 'name':'$x\\\\$'},\
      {'x':x, 'y':sin(x,2), 'line':{'color':'#7f7f7f'},'name':'$ x-\\frac{x^3}{6}$'},\
      {'x':x, 'y':sin(x,3), 'line':{'color':'#bcbd22'},'name':'$ x-\\frac{x^3}{6}+\\frac{x^5}{120}$'},\
      {'x':x, 'y':sin(x,4), 'line':{'color':'#17becf'},'name':'$ x-\\frac{x^5}{120}$'}], layout=l)

এটি আপনার গ্রাফ তৈরি করে এবং আপনাকে কিংবদন্তির মধ্যে কিংবদন্তি রাখার সুযোগ দেয়। কিংবদন্তির জন্য যদি এটি সেট না করা হয় তবে ডিফল্ট হ'ল এটি এখানে প্লট হিসাবে স্থাপন করা হবে।

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

বিকল্প স্থান নির্ধারণের জন্য, আপনি গ্রাফিক এবং কিংবদন্তির সীমানার প্রান্তটি ঘনিষ্ঠভাবে সারিবদ্ধ করতে পারেন এবং আরও কাছের ফিটের জন্য সীমানা লাইনগুলি সরিয়ে ফেলতে পারেন।

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

আপনি কোডের সাথে বা জিইউআই দিয়ে কিংবদন্তি এবং গ্রাফটি সরিয়ে নিয়ে আবার স্টাইল করতে পারেন। কিংবদন্তি স্থানান্তর করতে, আপনার <= 1. এর x এবং y মান নির্ধারণ করে গ্রাফের অভ্যন্তরে কিংবদন্তি স্থাপনের জন্য নীচের বিকল্পগুলি রয়েছে: যেমন:

  • {"x" : 0,"y" : 0} -- নিচে বামে
  • {"x" : 1, "y" : 0} -- নিচের ডানে
  • {"x" : 1, "y" : 1} -- উপরের ডানে
  • {"x" : 0, "y" : 1} -- উপরে বাঁদিকে
  • {"x" :.5, "y" : 0} - নীচে কেন্দ্র
  • {"x": .5, "y" : 1} - শীর্ষ কেন্দ্র

এই ক্ষেত্রে, আমরা ডকুমেন্টেশনেlegendstyle = {"x" : 1, "y" : 1} বর্ণিত উপরের ডানটি চয়ন করি :

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


3

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

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)

# Put a legend to the right of the current axis
leg = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.draw()

# Get the ax dimensions.
box = ax.get_position()
xlocs = (box.x0,box.x1)
ylocs = (box.y0,box.y1)

# Get the figure size in inches and the dpi.
w, h = fig.get_size_inches()
dpi = fig.get_dpi()

# Get the legend size, calculate new window width and change the figure size.
legWidth = leg.get_window_extent().width
winWidthNew = w*dpi+legWidth
fig.set_size_inches(winWidthNew/dpi,h)

# Adjust the window size to fit the figure.
mgr = plt.get_current_fig_manager()
mgr.window.wm_geometry("%ix%i"%(winWidthNew,mgr.window.winfo_height()))

# Rescale the ax to keep its original size.
factor = w*dpi/winWidthNew
x0 = xlocs[0]*factor
x1 = xlocs[1]*factor
width = box.width*factor
ax.set_position([x0,ylocs[0],x1-x0,ylocs[1]-ylocs[0]])

plt.draw()

আমি এটি বেশ দরকারী বলে মনে করি এবং এটি আমার পক্ষে কাজ করে। নোট করুন যে আপনি যদি ডাব্লুএক্স ব্যাকএন্ডে থাকেন (যেমন উইন্ডোজ ব্যবহার করে), মিলিগ্রাআর উইন্ডো.উইএম_জিমেট্রি ("% ix% i"% (উইনউইথনউইউ, মিলিগ্রেশন উইন্ডো.উইনফো_হাইট ())) এর সাথে মিল করুন , উইনহাইটনিউ) বা এর মতো
ইজিজিয়েল ক্রিগলিক

আপনি যদি Qt4Ag ব্যাকেন্ড ব্যবহার করছেন (যা ম্যাটপ্ল্লোলিবের আমার লিনাক্স ইনস্টলেশনটিতে ডিফল্ট), তবে লাইনটি এর mgr.window.wm_geometry(...)সাথে প্রতিস্থাপন করুন mgr.window.setFixedWidth(winWidthNew)
ফিলিপ এস

এবং যেমনটি আমি সবেমাত্র আবিষ্কার করেছি, আপনি যদি এমন একটি ব্যাকএন্ড ব্যবহার করেন যা কোনও উইন্ডো না দেখায়, যা কোনও ফাইলের জন্য সরাসরি সংরক্ষণ করার জন্য বোঝানো হয় (এসভিজি এবং এজিজি ব্যাকেন্ডের মতো), কেবল উইন্ডোটিকে পুরোপুরি আকার পরিবর্তন করতে হবে। fig.set_size_inches(...)আপনার প্রয়োজনীয় আকার পরিবর্তন করার যত্ন নেয়।
ফিলিপ এস

3

এটি এই প্রশ্নটি সতেজ করার মতো, যেহেতু ম্যাটপ্ল্লোলিবের নতুন সংস্করণগুলি প্লটের বাইরে কিংবদন্তিটিকে অবস্থান করা আরও সহজ করে তুলেছে। আমি Matplotlib সংস্করণ সহ এই উদাহরণটি উত্পাদন করেছি 3.1.1

locবাউন্ডিং বাক্সের যে কোনও জায়গায় কিংবদন্তিটি স্থাপন করতে ব্যবহারকারীরা প্যারামিটারে স্থানাঙ্কের 2-টুপল পাস করতে পারেন । plt.tight_layout()প্লট মাত্রাগুলি পুনরুদ্ধার করতে ম্যাটপ্ল্লোলিব পেতে আপনাকে চালানো দরকার একমাত্র গোচা যাতে কিংবদন্তিটি দৃশ্যমান:

import matplotlib.pyplot as plt

plt.plot([0, 1], [0, 1], label="Label 1")
plt.plot([0, 1], [0, 2], label='Label 2')

plt.legend(loc=(1.05, 0.5))
plt.tight_layout()

এটি নিম্নলিখিত প্লটটি বাড়ে:

বাইরে কিংবদন্তি সঙ্গে প্লট

তথ্যসূত্র:


2

আপনি চেষ্টা করতে পারেন figlegend। যে কোনও অক্ষের অবজেক্টের থেকে আলাদা করে কিংবদন্তি তৈরি করা সম্ভব। তবে আপনাকে কিছু "ডামি" পাথ তৈরি করতে হবে যাতে অবজেক্টগুলির বিন্যাসটি সঠিকভাবে পাস হবে তা নিশ্চিত করতে।


1

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

import matplotlib.pyplot as plt
p1, = plt.plot([1, 2, 3])
p2, = plt.plot([3, 2, 1])
p3, = plt.plot([2, 3, 1])
plt.legend([p2, p1, p3], ["line 1", "line 2", "line 3"]).get_frame().set_alpha(0.5)
plt.show()

1

আমার কাছে বিশাল কিংবদন্তি হওয়ার সময় যে সমাধানটি আমার পক্ষে কাজ করেছিল তা হ'ল অতিরিক্ত খালি চিত্রের বিন্যাস ব্যবহার করা। নিম্নলিখিত উদাহরণে আমি 4 টি সারি তৈরি করেছি এবং নীচে আমি শীর্ষে কিংবদন্তির (অফবক্স_ টো_আংচর) অফসেটের সাথে চিত্রটি প্লট করেছি এটি কাটবে না।

f = plt.figure()
ax = f.add_subplot(414)
lgd = ax.legend(loc='upper left', bbox_to_anchor=(0, 4), mode="expand", borderaxespad=0.3)
ax.autoscale_view()
plt.savefig(fig_name, format='svg', dpi=1200, bbox_extra_artists=(lgd,), bbox_inches='tight')

1

এখানে যোগ করার অনুরূপ আরও একটি সমাধান bbox_extra_artistsএবং এখানে bbox_inches, যেখানে আপনার savefigকলের সুযোগে আপনার অতিরিক্ত শিল্পী রাখার দরকার নেই । আমি আমার বেশিরভাগ প্লট ফাংশনের অভ্যন্তরে তৈরি করার পরে এটি নিয়ে এসেছি।

আপনি যখন এটি লিখতে চান তখন বাউন্ডিং বাক্সে আপনার সমস্ত সংযোজন যুক্ত করার পরিবর্তে আপনি এগুলি সময়ের Figureশিল্পীদের সাথে আগে যুক্ত করতে পারেন । উপরের ফ্রাঙ্ক ডারনকোর্টের উত্তরের অনুরূপ কিছু ব্যবহার করা :

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# plotting function
def gen_plot(x, y):
    fig = plt.figure(1)
    ax = fig.add_subplot(111)
    ax.plot(all_x, all_y)
    lgd = ax.legend( [ "Lag " + str(lag) for lag in all_x], loc="center right", bbox_to_anchor=(1.3, 0.5))
    fig.artists.append(lgd) # Here's the change
    ax.set_title("Title")
    ax.set_xlabel("x label")
    ax.set_ylabel("y label")
    return fig

# plotting
fig = gen_plot(all_x, all_y)

# No need for `bbox_extra_artists`
fig.savefig("image_output.png", dpi=300, format="png", bbox_inches="tight")

উত্পন্ন প্লটটি এখানে।


-1

আপনার ইস্যুটি ইতিমধ্যে সাজানো হয়েছে কিনা তা আপনি জানেন না ... সম্ভবত হ্যাঁ, তবে ... আমি মাতলাবের মতো লোকেশনের জন্য কেবল 'বাইরের' স্ট্রিংটি ব্যবহার করেছি। আমি ম্যাটপ্লোটলিব থেকে পাইলাব আমদানি করেছি। কোডটি অনুসরণ হিসাবে দেখুন:

from matplotlib as plt
from matplotlib.font_manager import FontProperties
...
...
t = A[:,0]
sensors = A[:,index_lst]

for i in range(sensors.shape[1]):
    plt.plot(t,sensors[:,i])

plt.xlabel('s')
plt.ylabel('°C')
lgd = plt.legend(b,loc='center left', bbox_to_anchor=(1, 0.5),fancybox = True, shadow = True)

প্লট দেখতে ক্লিক করুন

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