පුරාවෘත්තය කුමන්ත්රණයෙන් ඉවත් කරන්නේ කෙසේද


1036

මට තනි රූපයකින් සෑදිය යුතු බිම් කැබලි 20 ක (උප බිම් නොවේ) මාලාවක් තිබේ. පුරාවෘත්තය කොටුවෙන් පිටත වීමට මට අවශ්‍යයි. ඒ සමඟම, අක්ෂයේ ප්‍රමාණය අඩු වන බැවින් අක්ෂ වෙනස් කිරීමට මට අවශ්‍ය නැත. පහත සඳහන් විමසුම් සඳහා කරුණාකර මට උදව් කරන්න:

  1. පුරාවෘත්ත පෙට්ටිය බිම් ප්‍රදේශයෙන් පිටත තබා ගැනීමට මට අවශ්‍යය. (පුරාවෘත්තය බිම් කොටසේ දකුණු පැත්තේ සිටීම මට අවශ්‍යය).
  2. පුරාවෘත්ත පෙට්ටියේ ඇති අකුරු ප්‍රමාණය අඩු කිරීමට කෙසේ හෝ පුරාවෘත්ත පෙට්ටියේ ප්‍රමාණය කුඩා වනු ඇත.

Answers:


49
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

fontP = FontProperties()
fontP.set_size('xx-small')

p1, = plt.plot([1, 2, 3], label='Line 1')
p2, = plt.plot([3, 2, 1], label='Line 2')
plt.legend(handles=[p1, p2], title='title', bbox_to_anchor=(1.05, 1), loc='upper left', prop=fontP)

රූප විස්තරය මෙහි ඇතුළත් කරන්න

  • විසින් සඳහන් කළ පරිදි Mateen Ulhaq , fontsize='xx-small'ද ආනයනය තොරව, ක්රියා FontProperties.
plt.legend(handles=[p1, p2], title='title', bbox_to_anchor=(1.05, 1), loc='upper left', fontsize='xx-small')

1862

ඔබට අවශ්‍ය දේ කිරීමට ක්‍රම ගණනාවක් තිබේ. @Inalis සහ avNavi දැනටමත් පවසා ඇති දෙයට එකතු කිරීම 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()

alt පෙළ

අපි එකම දේ කරන්නේ නම්, නමුත් 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()

alt පෙළ

ඒ හා සමානව, ඔබට පුරාවෘත්තය වඩාත් තිරස් කර / හෝ රූපයේ ඉහළින් තැබිය හැකිය (මම වටකුරු කොන් සහ සරල බිංදු සෙවනැල්ලක් ද සක්‍රීය කරමි):

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()

alt පෙළ

විකල්පයක් ලෙස, ඔබට වත්මන් බිම් කොටසෙහි පළල හැකිලීමට හැකි අතර පුරාවෘත්තය රූපයේ අක්ෂයට පිටතින් තැබිය හැකිය (සටහන: ඔබ භාවිතා කරන්නේ tight_layout()නම් ඉවත්ව යන්න 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()

alt පෙළ

ඒ හා සමානව, ඔබට කුමන්ත්‍රණය සිරස් අතට හැකිලී, තිරස් පුරාවෘත්තයක් පතුලේ තබන්න:

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()

alt පෙළ

Matplotlib පුරාවෘත්ත මාර්ගෝපදේශය දෙස බලන්න . ඔබටත් බලන්න පුළුවන් plt.figlegend().


13
යමෙකුට මේ සම්බන්ධයෙන් ගැටළු තිබේ නම්, තද_ලයිට් () ගැටළු ඇති කරන බව සලකන්න!
මැතිව් ජී.

4
නියම පිළිතුර!
ලේඛනයට

4
සම්පූර්ණත්වය ලෙස, ඔබට සාමාන්‍යයෙන් (ලේඛයෙන් සාරාංශගත කර ඇති) “ bbox_to_anchorපාවෙන 4 ක (x, y, පළල, බොක්ස්හි උස) හෝ සාමාන්‍යකරණය කළ අක්ෂවල පාවෙන 2 (x, y) ටුපල් එකක් යැයි ඔබට පැවසිය හැකිය. ඛණ්ඩාංක. ”
meduz

7
මෙය මා මෙතෙක් වැඩිපුරම සංචාරය කළ SO පිළිතුර බව මම පිළිගත යුතුය. සාධාරණ පුද්ගලයෙකුට මෙම තර්කනය මෙහි නොපෙන්වා මතක තබා ගත හැකි ක්‍රමයක් නැති නිසා මට නැවත නැවත ඒ වෙත පැමිණීමට උදව් කළ නොහැක.
කේ.ටී.

9
ඔබට රූපය ගොනුවකට සුරැකීමට අවශ්‍ය නම්, ඔබ ආපසු එවූ වස්තුව ගබඩා කළ යුතුය, එනම් legend = ax.legend()පසුව සහ පසුවfig.savefig(bbox_extra_artists=(legend,))
සීතල ෆික්ස්

855

## පුරාවෘත්තය තැබීම ( 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.legend (bbox_to_anchor = (1.04,1), loc = "ඉහළ වමේ")

පුරාවෘත්තය අක්ෂයෙන් පිටත තබයි, පුරාවෘත්තයේ ඉහළ වම් කෙළවර (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. විශේෂ තර්ක අවශ්‍ය නොවන matplotlib version> = 2.1 සඳහා මෙය විශේෂයෙන් ප්‍රයෝජනවත් වී ඇත

fig.legend(loc=7) 

රූපයේ විවිධ අක්ෂයන්හි සියලුම කලාකරුවන් සඳහා පුරාවෘත්තයක් නිර්මාණය කිරීමට. පුරාවෘත්තය ස්ථානගත කර ඇත්තේ locඑය අක්ෂයක් තුළ තබා ඇති ආකාරය හා සමාන වන තර්කය භාවිතා කරමිනි , නමුත් සමස්ත රූපයට සාපේක්ෂව - එබැවින් එය අක්ෂයට පිටතින් තරමක් ස්වයංක්‍රීයව පවතිනු ඇත. ඉතිරිව ඇත්තේ පුරාවෘත්තය සහ අක්ෂය අතර අතිච්ඡාදනය නොවන පරිදි උප පොළවල් සකස් කිරීමයි. මෙහි ඉහළින් “උපසිරැසි පරාමිතීන් සකසන්න” යන කරුණ ප්‍රයෝජනවත් වනු ඇත. උදාහරණයක්:

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තර්කය නියම කළ යුතුය .

### වැඩිදුර කියවීම සහ සටහන්:

  • Matplotlib පුරාවෘත්ත මාර්ගෝපදේශය සලකා බලන්න සමඟ ඔබට කිරීමට අවශ්‍ය වෙනත් දේවල් පිළිබඳ උදාහරණ කිහිපයක් සමඟ .
  • පයි ප්‍රස්ථාර සඳහා ජනප්‍රවාද තැබීම සඳහා උදාහරණ කේත කිහිපයක් මෙම ප්‍රශ්නයට පිළිතුරු වශයෙන් කෙලින්ම සොයාගත හැකිය: පයිතන් - පුරාවෘත්තය පයි ප්‍රස්ථාරය සමඟ අතිච්ඡාදනය වේ
  • මෙම locතර්කය අංක වෙනුවට ඇමතුම් කෙටි ඇති කරන නූල්, ගත හැකි, කෙසේ වෙතත්, ඔවුන් ඉතා අවිවාදයෙන්ම පිළිගැනීමට එකිනෙකාට සිතියම් ගත නොවේ. යොමු කිරීම සඳහා සිතියම්ගත කිරීම මෙන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න


පුරාවෘත්තය කැපවූ උප පොළ අක්ෂ අක්ෂයක් තුළ තැබීම ඉතා සියුම් ලෙස fig.tight_layout. ඔබ plt.subplotsඅක්ෂ නිර්මාණය කිරීමට භාවිතා කරන්නේ නම් , එයට gridspec_kw={'height_ratios': [100, 1]}(හෝ පළල_ අනුපාත) වැනි යමක් දෙන්න, එවිට පුරාවෘත්තයේ අක්ෂ ඉතා කුඩා වේ ... එවිට fig.tight_layout()එය ගැලපෙන පරිදි පුළුල් කරනු ඇත. අවම වශයෙන් matplotlib සඳහා 3.0.3.
travc

163

යන්තම් කතා 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))

ප්‍රති Results ල මේ වගේ දෙයක් වනු ඇත:

රූප විස්තරය මෙහි ඇතුළත් කරන්න


4
matplotlib.pyplot.legend වෙත එකම පරාමිතීන් පසු කරන විට ක්‍රියා කරයි
කිඩ්මෝස් කරන්න

8
පුරාවෘත්තයේ ඇති වචන වෙනත් කිසිවෙකුට මෙය කපා දමනවාද?
user1717828

88

පුරාවෘත්තය බිම් කොටසට පිටින් තැබීමට, භාවිතා කිරීම locසහ එහි bbox_to_anchorමූල පද legend(). උදාහරණයක් ලෙස, පහත කේතය පුරාවෘත්තය බිම් කොටසේ දකුණට තබනු ඇත:

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

වැඩි විස්තර සඳහා, පුරාවෘත්ත මාර්ගෝපදේශය බලන්න


10
හරි - මම ක්‍රියාත්මක කිරීමට කැමතියි, නමුත් මම රූපය සුරැකීමට ගිය විට (කවුළුවේ එය අතින් ප්‍රතිනිර්මාණය නොකර, සෑම විටම කිරීමට මට අවශ්‍ය නැත), පුරාවෘත්තය කපා දමනු ලැබේ. මම එය නිවැරදි කරන්නේ කෙසේද යන්න පිළිබඳ කිසියම් අදහසක් තිබේද?
තාරකා විද්‍යාව

@astromax මට විශ්වාස නෑ නමුත් සමහර විට ඇමතීමට උත්සාහ කරන්න plt.tight_layout()?
ක්‍රිස්ටියන් ඇලිස්

82

කෙටි පිළිතුර: ඔබට bbox_to_anchor+ bbox_extra_artists+ භාවිතා කළ හැකිය bbox_inches='tight'.


දීර් answer පිළිතුර: 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')

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මම matplotlib natively පුරාවෘත්තය කොටුව සඳහා පිටත ස්ථානයක ඉඩ ඇති බව ප්රාර්ථනා Matlab කරන්නේ :

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 = 'තද "පරාමිතීන් එය නිවැරදිව ක්‍රියාත්මක කිරීමට මට අවශ්‍ය වූයේ
හරියටමයි

6
ස්තූතියි, නමුත් ඇත්ත වශයෙන්ම bbox_inches='tight'bbox_extra_artist නොමැතිව පවා මට හොඳින් ක්‍රියා කරයි
avtomaton

1
@avtomaton ස්තූතියි, දැන ගැනීම සතුටක්, ඔබ භාවිතා කරන්නේ matplotlib හි කුමන අනුවාදයද?
ෆ්‍රෑන්ක් ඩර්නන්කෝට්

1
RanFranckDernoncourt python3, matplotlib වෙළුම 1.5.3
avtomaton

68

මෙහි ඇති සියලුම විශිෂ්ට පිළිතුරු වලට අමතරව, නව අනුවාදයන් matplotlibසහ pylabහැකි නම්, බිම් කැබලි වලට ඇඟිලි ගැසීමෙන් තොරව පුරාවෘත්තය තැබිය යුත්තේ කොතැනදැයි ස්වයංක්‍රීයව තීරණය කළ හැකිය.

pylab.legend(loc='best')

මෙය හැකි නම් පුරාවෘත්තය ස්වයංක්‍රීයව දත්ත වලින් away ත් කරනු ඇත! Loc = 'best' භාවිතය සසඳා බලන්න

කෙසේ වෙතත්, දත්ත අතිච්ඡාදනය නොකර පුරාවෘත්තය තැබීමට ස්ථානයක් නොමැති නම්, ඔබට අනෙක් පිළිතුරු වලින් එකක් උත්සාහ කිරීමට අවශ්‍ය වනු ඇත; භාවිතා කිරීම loc="best"කිසි විටෙකත් පුරාවෘත්තය කුමන්ත්‍රණයෙන් පිටත තබන්නේ නැත .


2
මෙය පෙන්වා දීමට ස්තූතියි! මම මීට වසර කිහිපයකට පෙර මෙය සෙවූ නමුත් එය සොයාගත නොහැකි වූ අතර එය මගේ ජීවිතය සැබවින්ම පහසු කරවන දෙයකි.
එඩ්ගර් එච්

4
මෙම විකල්පය ප්‍රයෝජනවත් නමුත් ප්‍රශ්නයට පිළිතුරු නොදෙන නිසා මම පහත් කොට සලකමි. මට කිව හැකි තාක් දුරට, පුරාවෘත්තය කුමන්ත්‍රණයෙන් පිටත තබන්නේ නැත
ටොමී

3
Om ටොමී: OP හි අදහස් දැක්වීමේදී (දැන් නැති වී ඇති බවක් පෙනේ) ප්‍රස්ථාර දත්ත ආවරණය නොකිරීමට පුරාවෘත්තයට OP අවශ්‍ය බව පැහැදිලිවම පැහැදිලි කර ඇති අතර, එය කිරීමට ඇති එකම ක්‍රමය කුමන්ත්‍රණයෙන් පිටත යැයි ඔහු සිතුවේය. මෙෆති, මාටියෝ සැන්චෙස්, බැස්ටියාන් සහ රැඩ්ටෙක් යන අයගේ පිළිතුරු වලින් ඔබට මෙය දැක ගත හැකිය. OP විසින් X ඉල්ලා සිටි නමුත් ඔහුට Y අවශ්‍ය විය .
dotancohen

1
ඇත්තටම නැහැ. ඔහු / ඇය විශේෂයෙන් පුරාවෘත්තය කුමන්ත්‍රණයෙන් පරිබාහිරව ඉල්ලා සිටියේය. එය ප්රශ්නයේ නාමයෙන්;) "පුරාවෘත්තය කුමන්ත්රණයෙන් ඉවත් කරන්නේ කෙසේද".
durbachit

4
පුරාවෘත්තය දත්ත අපැහැදිලි නොවන බවට මෙය සහතික නොවේ. ඉතා plot න කුමන්ත්‍රණයක් කරන්න - පුරාවෘත්තය තැබීමට තැනක් නැත. උදාහරණයක් ලෙස, මෙය උත්සාහ කරන්න ... අංක ආනයන අරෙන්ජ්, පාපය, pi ආනයනය matplotlib.pyplot ලෙස plt t = arange (0.0, 100.0, 0.01) fig = plt.figure (1) ax1 = fig.add_subplot (211) ax1. විසිරීම (t, sin (2 * pi * t), label = 'test') ax1.grid (සත්‍ය) # ax1.set_ylim ((- 2, 2)) ax1.set_ylabel ('1 Hz') ax1.set_title ( X1.get_xticklabels () හි ලේබලය සඳහා 'සයින් තරංගයක් හෝ දෙකක්'): label.set_color ('r') plt.legend (loc = 'best') plt.show ()
adam.r

56

කෙටි පිළිතුර : පුරාවෘත්තයට ඇදගෙන යා හැකි ආයාචනා කර ඔබට අවශ්‍ය ඕනෑම තැනක අන්තර්ක්‍රියාකාරීව ගෙනයන්න:

ax.legend().draggable()

දීර් Answer පිළිතුර : පුරාවෘත්තය ක්‍රමලේඛයට වඩා අන්තර්ක්‍රියාකාරීව / අතින් තැබීමට ඔබ කැමති නම්, ඔබට පුරාවෘත්තයේ ඇදගෙන යා හැකි මාදිලිය ටොගල් කර ඔබට අවශ්‍ය ඕනෑම තැනකට ඇදගෙන යා හැකිය. පහත උදාහරණය පරීක්ෂා කරන්න:

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

ඔබ ඉල්ලූ දේ හරියටම නොවේ, නමුත් එය එකම ගැටලුවට විකල්පයක් බව මට පෙනී ගියේය. පුරාවෘත්තය අර්ධ පාරදෘශ්‍ය කරන්න, එසේ කරන්න: අර්ධ විනිවිද පෙනෙන පුරාවෘත්තයක් සහ අර්ධ පාරදෘශ්‍ය පෙළ කොටුවක් සහිත matplotlib බිම් කොටස

මෙය කරන්න:

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

සටහන් කර ඇති පරිදි, ඔබට පුරාවෘත්තය කුමන්ත්‍රණයෙහි තැබිය හැකිය, නැතහොත් එය තරමක් off ත කෙළවරට ද තැබිය හැකිය. IPython නෝට්බුක් එකකින් සාදන ලද ප්ලොට්ලි පයිතන් API භාවිතා කරන උදාහරණයක් මෙන්න . මම කණ්ඩායමේ ඉන්නේ

ආරම්භ කිරීමට, ඔබට අවශ්‍ය පැකේජ ස්ථාපනය කිරීමට අවශ්‍ය වනු ඇත:

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)

මෙය ඔබගේ ප්‍රස්ථාරය නිර්මාණය කරන අතර පුරාවෘත්තය කුමන්ත්‍රණය තුළම තබා ගැනීමට ඔබට අවස්ථාවක් ලබා දෙයි. පුරාවෘත්තය සකසා නොමැති නම් එහි පෙරනිමිය මෙහි පෙන්වා ඇති පරිදි එය බිම් කොටසේ තැබීමයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

විකල්ප ස්ථානගත කිරීමක් සඳහා, ඔබට පුරාවෘත්තයේ ප්‍රස්ථාරයේ මායිම සහ මායිම සමීපව පෙළගස්වා ගත හැකි අතර, වඩාත් ගැළපෙන පරිදි මායිම් රේඛා ඉවත් කරන්න.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඔබට පුරාවෘත්තය සහ ප්‍රස්තාරය කේතය සමඟ හෝ GUI සමඟ නැවත ගෙනයාමට හැකිය. පුරාවෘත්තය වෙනස් කිරීම සඳහා, <= 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} විස්තර කර ඇති ඉහළ දකුණ තෝරා ගනිමු :

රූප විස්තරය මෙහි ඇතුළත් කරන්න


අපොයි ... ලස්සන වර්ණ (පළමු කුමන්ත්‍රණයේ).
මාටීන් උල්හාක්

7

ඔබ දැනටමත් ඔබේ ගැටලුව විසඳා ඇත්දැයි නොදනී ... බොහෝ විට ඔව්, නමුත් ... මම හුදෙක් මැට්ලැබ්හි මෙන් ස්ථානය සඳහා 'පිටත' නූල භාවිතා කළෙමි. මම matlalotlib වෙතින් pylab ආනයනය කළෙමි. කේතය පහත පරිදි බලන්න:

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(loc='center left', bbox_to_anchor=(1, 0.5),fancybox = True, shadow = True)

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1
මම රළු bතර්කය ඉවත් කිරීමෙන් පසුව මෙය මට හොඳින් ක්‍රියාත්මක විය .
jxmorris12

3
මට තේරෙන්නේ නැහැ. කේතය outsideකොතැනකවත් අඩංගු නොවේ .
ජික්

6

මැට්ප්ලොට්ලිබ් හි නවතම අනුවාදයන් පුරාවෘත්තය කතාවෙන් පිටත ස්ථානගත කිරීම පහසු කර ඇති බැවින් මෙම ප්‍රශ්නය නැවුම් කිරීම වටී. මම මෙම උදාහරණය 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()

මෙය පහත දැක්වෙන කුමන්ත්‍රණයට මග පාදයි:

පිටත පුරාවෘත්තය සමඟ කුමන්ත්රණය

යොමුව:


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()

මෙය බෙහෙවින් ප්‍රයෝජනවත් බව මට පෙනී ගිය අතර එය මට ප්‍රයෝජනවත් විය. ඔබ wx පසුබිමෙහි සිටී නම් (උදා: කවුළු භාවිතා කිරීම), mgr.window.wm_geometry ("% ix% i"% (winWidthNew, mgr.window.winfo_height ()) mgr.window.SetClientSizeWH (winWidthNew) සමඟ ආදේශ කරන්න. , winHeightNew) හෝ ඒ හා සමානයි
එසකියෙල් කෘග්ලික්

ඔබ (matplotlib මගේ Linux ස්ථාපනය මත පෙරනිමි වන) මෙම Qt4Agg ශයට භාවිතා කරන්නේ නම්, එම මාර්ගය වෙනුවට mgr.window.wm_geometry(...)සමග mgr.window.setFixedWidth(winWidthNew).
පිලිප් එස්.

තවද, මම දැන් සොයාගත් පරිදි, ඔබ භාවිතා කරන්නේ කිසිදු කවුළුවක් නොපෙන්වන පසුබිමක් නම්, එය කෙලින්ම ගොනුවකට සුරැකීමට අදහස් කරයි (SVG සහ AGG පසුබිම් වැනි), කවුළු ප්‍රමාණය වෙනස් කිරීම සම්පූර්ණයෙන්ම මඟ හරින්න. fig.set_size_inches(...)ඔබට අවශ්‍ය ප්‍රමාණය වෙනස් කිරීම ගැන සැලකිලිමත් වේ.
පිලිප් එස්.

2

ඔබටත් උත්සාහ කළ හැකිය figlegend. ඕනෑම අක්ෂ වස්තුවකින් ස්වාධීන පුරාවෘත්තයක් නිර්මාණය කළ හැකිය. කෙසේ වෙතත්, වස්තූන් සඳහා හැඩතල ගැන්වීම නිවැරදිව සිදු වන බවට වග බලා ගැනීම සඳහා ඔබට "ව්‍යාජ" මාර්ග කිහිපයක් සෑදීමට අවශ්‍ය විය හැකිය.


1

මෙහි දක්නට ඇති matplotlib නිබන්ධනය සිට උදාහරණයක් මෙතන . මෙය වඩාත් සරල උදාහරණයකි, නමුත් මම පුරාවෘත්තයට විනිවිදභාවය එක් කළ අතර plt.show () එකතු කළෙමි, එවිට ඔබට මෙය අන්තර්ක්‍රියාකාරී කවචයට අලවා ප්‍රති result ලයක් ලබා ගත හැකිය:

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 ක් සාදා ඇති අතර පතුලේ මම පුරාවෘත්තය සඳහා (bbox_to_anchor) ඕෆ්සෙට් සමඟ රූපය සැලසුම් කරමි.

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")

මෙන්න ජනනය කළ බිම් කොටස.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.