আমি লক্ষ করেছি যে কোনও উত্তর কোনও সাব-প্লটগুলিতে অনেকগুলি বক্ররেখার উল্লেখ করে একটি একক কিংবদন্তি সহ কোনও চিত্র প্রদর্শন করে না, তাই আপনাকে কৌতূহলী করতে আমি আপনাকে একটি দেখাতে হবে ...
এখন, আপনি কোডটি দেখতে চান , তাই না?
from numpy import linspace
import matplotlib.pyplot as plt
# Calling the axes.prop_cycle returns an itertoools.cycle
color_cycle = plt.rcParams['axes.prop_cycle']()
# I need some curves to plot
x = linspace(0, 1, 51)
f1 = x*(1-x) ; lab1 = 'x - x x'
f2 = 0.25-f1 ; lab2 = '1/4 - x + x x'
f3 = x*x*(1-x) ; lab3 = 'x x - x x x'
f4 = 0.25-f3 ; lab4 = '1/4 - x x + x x x'
# let's plot our curves (note the use of color cycle, otherwise the curves colors in
# the two subplots will be repeated and a single legend becomes difficult to read)
fig, (a13, a24) = plt.subplots(2)
a13.plot(x, f1, label=lab1, **next(color_cycle))
a13.plot(x, f3, label=lab3, **next(color_cycle))
a24.plot(x, f2, label=lab2, **next(color_cycle))
a24.plot(x, f4, label=lab4, **next(color_cycle))
# so far so good, now the trick
lines_labels = [ax.get_legend_handles_labels() for ax in fig.axes]
lines, labels = [sum(lol, []) for lol in zip(*lines_labels)]
# finally we invoke the legend (that you probably would like to customize...)
fig.legend(lines, labels)
plt.show()
দুটি লাইন
lines_labels = [ax.get_legend_handles_labels() for ax in fig.axes]
lines, labels = [sum(lol, []) for lol in zip(*lines_labels)]
একটি ব্যাখ্যা প্রাপ্য - এই লক্ষ্যে আমি একটি কার্যক্রমে জটিল অংশটি encapsulate করেছি, কোডের মাত্র 4 লাইন তবে ভারী মন্তব্য করেছি
def fig_legend(fig, **kwdargs):
# generate a sequence of tuples, each contains
# - a list of handles (lohand) and
# - a list of labels (lolbl)
tuples_lohand_lolbl = (ax.get_legend_handles_labels() for ax in fig.axes)
# e.g. a figure with two axes, ax0 with two curves, ax1 with one curve
# yields: ([ax0h0, ax0h1], [ax0l0, ax0l1]) and ([ax1h0], [ax1l0])
# legend needs a list of handles and a list of labels,
# so our first step is to transpose our data,
# generating two tuples of lists of homogeneous stuff(tolohs), i.e
# we yield ([ax0h0, ax0h1], [ax1h0]) and ([ax0l0, ax0l1], [ax1l0])
tolohs = zip(*tuples_lohand_lolbl)
# finally we need to concatenate the individual lists in the two
# lists of lists: [ax0h0, ax0h1, ax1h0] and [ax0l0, ax0l1, ax1l0]
# a possible solution is to sum the sublists - we use unpacking
handles, labels = (sum(list_of_lists, []) for list_of_lists in tolohs)
# call fig.legend with the keyword arguments, return the legend object
return fig.legend(handles, labels, **kwdargs)
পিএস আমি সনাক্ত করেছিলাম যে sum(list_of_lists, [])
তালিকার তালিকাকে সমতল করার জন্য এটি একটি অত্যন্ত অযোগ্য পদ্ধতি তবে ① আমি এর সংক্ষিপ্ততা পছন্দ করি ② সাধারণত কয়েকটি সাবপ্লট এবং ③ ম্যাটপ্ল্লোব এবং দক্ষতা কয়েক ধরণের বাঁক হয়? ;-)