Sahədən olan əfsanəni necə çıxartmaq olar?

Bir rəsmdə hazırlanmalı olan bir sıra 20 grafiğim (altyazı deyil). Əfsanənin qutunun xaricində olmasını istəyirəm. Eyni zamanda rəqəmin ölçüsü azaldıqca, ekseni dəyişdirmək istəmirəm. Aşağıdakı sorgularla mənə kömək edin:

  • Qədim sahənin xaricində əfsanə sahəsini tərk etmək istəyirəm. (Əfsanənin sahənin sahəsinin sağ tərəfində olmasını istəyirəm).
  • Hər halda mətnin yazı tipini ölçüsünü əfsanə sahəsinin içərisində azaldır, belə ki efsane pəncərəsinin ölçüsü kiçik olacaq.
677
15 янв. pottigopi 15 yanvarda təyin olundu 2011-01-15 19:10 '11 saat 19:10 'da 2011-01-15 19:10
@ 16 cavab

Şrift xassələrini yaratmaq

 from matplotlib.font_manager import FontProperties fontP = FontProperties() fontP.set_size('small') legend([plot1], "title", prop=fontP) 
89
15 янв. cavab Navi 15 yanvar verilir . 2011-01-15 19:21 '11 at 19:21 2011-01-15 19:21

İstədiyiniz şeyi etmək üçün bir neçə yol vardır. @İnalis və @Navininin nə dediyinə əlavə etmək üçün, bəndəni boşluqdan qismən qoymaq və / və ya şrift ölçüsünü azaltmaq üçün bbox_to_anchor sözü argumentini istifadə edə bilərsiniz.

Şriftin ölçüsünü azaltmağı düşünməzdən əvvəl (oxumağı daha da çətinləşdirə bilər) əfsanəni fərqli yerlərdə yerləşdirməklə ətrafında oynaya bilərsiniz:

Yəni ümumi bir nümunə ilə başlayaq:

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

2019

1407
15 янв. Joe Kington tərəfindən 15 yanvar cevap 2011-01-15 21:12 '11 at 21:12 2011-01-15 21:12

Legend bbox_to_anchor ( bbox_to_anchor )

Əfsanə plt.legend üçün loc argümanı istifadə edərək, baltaların sərhəd qutusuna yerləşdirilir.
Məsələn, loc="upper right" əlifbası bəndlərin koordinatlarında (və ya (x0,y0, width, height)=(0,0,1,1) göstəricidən (0,0) -dən (1,1) yuxarıya keçən sərhəd qutunun yuxarı sağ küncündə əfsanəni yerləşdirir (x0,y0, width, height)=(0,0,1,1) ).

Bir əfsanəni baltaların sərhəd qutusunun kənarına (x0,y0) üçün, əfsanənin sol alt küncünün axınlarının koordinatlarını (x0,y0) göstərə bilərsiniz.

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

Lakin, daha universal bir yanaşma, bbox_to_anchor arqumentini istifadə edərək, bbox_to_anchor yerləşdirilməsi lazım olan sərhəd qutusunu əl ilə göstərmək olardı. Boksunuzda yalnız hissənin (x0,y0) y0 (x0,y0) çatdırılmasını məhdudlaşdıra bilərsiniz. Bu, əfsanənin argument loc verdiyi istiqamətdə genişlənəcək sıfır sıra sahəsi yaradır. Məsələn,

  plt.legend (bbox_to_anchor = (1.04,1), loc = "yuxarı sol") 

əfsanəni axınların kənarına qoyur ki, əfsanənin yuxarı sol küncündə baltalar koordinatlarında (1.04,1) .

Əlavə nümunələr aşağıdakılardır: əlavə olaraq, modencols kimi müxtəlif arqumentlər arasında qarşılıqlı əlaqə.

2019

16 апр. Cavab 16 Apreldə ImportanceOfBeingErnest tərəfindən verilir 2017-04-16 19:04 '17 saat 07:04 'da 2017-04-16 19:04

Sadəcə legend() çağırışı 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)) 

Nəticələr belə bir şeyə bənzəyir:

2019

121
03 июля '14 в 5:43 2014-07-03 05:43 Cavab Şital Şah tərəfindən verilir 03 iyul 'da 5:43 2014-07-03 05:43

Qısa cavab: bbox_to_anchor + bbox_extra_artists + bbox_inches='tight' istifadə edə bilərsiniz.


Daha uzun cavab: bbox_to_anchor istifadə edə bilərsiniz. E-poçt penceresinin yerini əl ilə müəyyən etmək üçün, bəzi digər insanlar cavablarda qeyd etdilər.

Lakin, adi problem, əfsanə sahəsinin kəsilməsindən ibarətdir, məsələn:

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

2019

73
17 авг. Franck Dernoncourt tərəfindən verilmiş cavab 17 Avqust 2014-08-17 01:49 '14 da 1:49 2014-08-17 01:49

Qısa cavab : sürükleyin və əfsanəni buraxın və onu istədiyiniz yerə hərəkətə keçirin:

 ax.legend().draggable() 

Uzun cavab . İstədiyiniz yerə sürükləməyiniz üçün efektin əvəzini online / əl yerinə qoymağı seçsəniz, əfsanənin sürüklə və buraxma rejimini dəyişə bilərsiniz. Aşağıdakı nümunəyə baxın:

 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() 
52
20 февр. cavab 20 mefathy verilir . 2013-02-20 22:41 '13 saat 10:41 'da 2013-02-20 22:41

Buradakı bütün mükəmməl cavablara əlavə olaraq, matplotlibpylab daha yeni versiyaları qrafiklərə müdaxilə etmədən əfsanəni qoymaq üçün avtomatik olaraq müəyyən edə bilər.

 pylab.legend(loc='best') 

Bu avtomatik olaraq əfsanəni sahədən çıxarır! 2019

49
08 дек. cavab 08 dekabrda verilir . 2014-12-08 12:46 '14 at 12:46 2014-12-08 12:46

Legend üçün regionun xaricindəki bbox_to_anchor açar sözlərindən locbbox_to_anchor legend() . Məsələn, aşağıdakı kod efektini grafik sahəsinin sağ tərəfinə qoyacaqdır:

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

Daha ətraflı məlumat üçün Legend Guide- ə baxın.

48
15 янв. Christian Alis tərəfindən 15 yanvarda verilən cavabı 2011-01-15 19:41 '11 at 19:41 2011-01-15 19:41

İstədiyiniz şey deyil, amma eyni problem üçün bir alternativ tapdım. Məsələn, legend şəffaf olun: 2019

13
17 апр. Cavab Bastiaan 17 Aprel verilir. 2014-04-17 20:27 '14 saat 20:27 2014-04-17 20:27

Daha çox qeyd edildiyi kimi, əfsanəni sahəyə yerləşdirə və ya bir qədər kənarına buraxa bilərsiniz. Aşağıda bir IPython laptop istifadə edərək Plotly Python API istifadə nümunəsidir. Mən komanda oldum.

Başlamaq üçün lazımi paketləri quraşdırmaq istədiyiniz olacaq:

 import plotly import math import random import numpy as np 

Sonra Plotly qurun:

 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)^kx^{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) 

Bu sizin cədvəlinizi yaradır və sahənin içində əfsanəni saxlamağa imkan verir. Bir əfsanənin default dəyəri, əgər göstərilməyibsə, burada göstərildiyi kimi yerləşdirməkdir.

2019

7
09 февр. Cavab Mateo Sanchez tərəfindən verilir 09 fevral. 2014-02-09 16:55 '14 da 16:55 2014-02-09 16:55

Bu istiqamətdə bir şey mənim üçün çalışdı. Joe tərəfindən alınan kiçik bir kodla başlayan bu üsul, avtomatik olaraq əfsanəni rəqəmin sağına qoymaq üçün pəncərənin genişliyini dəyişdirir.

 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() 
3
21 дек. Cavab Martin 21 dekabrda verilir. 2013-12-21 03:38 '13 at 3:38 2013-12-21 03:38

figlegend da istifadə edə bilərsiniz. Hər hansı bir Axın obyektindən asılı olmayan bir əfsanə yarada bilərsiniz. Lakin, obyektlərin biçimlendirilmesinin düzgün keçdiyindən əmin olmaq üçün bir neçə "kukla" kontur yaratmaq tələb oluna bilər.

2
17 янв. cavab 17 yanvarda Uri Laserson tərəfindən verilir 2011-01-17 10:06 '11 at 10:06 2011-01-17 10:06

Burada tapılan matplotlib təlimatından nümunə. Bu, daha sadə nümunələrdən biridir, amma əfsanəyə şəffaflıq əlavə etdim və plt.show () əlavə edərək, onu interaktiv qabağa daxil edə və nəticə əldə edə bilərsiniz:

 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
10 июня '14 в 20:13 2014-06-10 20:13 Cavab radtek tərəfindən verilir 10 İyun 2014 , 20:13 2014-06-10 20:13

Böyük bir əfsanəyə malik olduğum zaman mənim üçün işləyən həll əlavə boş şəkil düzeni istifadə etmək idi. Aşağıdakı nümunədə mən 4 xətt çəkmişəm və aşağıda əfsanəyə (bbox_to_anchor) görə bir forma ilə bir şəkil çəkirəm, bu əksi deyil.

 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
28 авг. Cavab Crystal 28 aug verilir . 2016-08-28 20:04 '16 saat 20:04 'da 2016-08-28 20:04

bbox_extra_artistsbbox_inches əlavə etmək üçün bənzər bir həlldir, burada savefig zənginizin ərazisində əlavə rəssamların olması lazım deyil. Mən funksiyaların içərisində mənim ən çox hissəsini yaratdığım kimi, bu ilə tanış oldum.

Onlara yazmaq istədiyiniz zaman əlavə addımlarınızı sərhəd qutusuna əlavə etmək əvəzinə, şəkillərin rəssamlarına əvvəllər əlavə edə bilərsiniz. Franck Dernoncourt'a bənzər bir şey istifadə edərək , yuxarıdakılara cavab verin:

İşdə sahəsi var. 

1
27 янв. İvirshup tərəfindən verilmiş cavab Jan 27 2017-01-27 11:03 '17 'da 11:03' də 2017-01-27 11:03

Bilmirəm, probleminizi anladınızmı bilmirəm ... Bəlkə, bəli, amma ... Matlab'da olduğu kimi bir yer üçün 'kənardan' simli istifadə etdim. Mən matplotlib dən pylab idxal. aşağıdakı kodlara baxın:

 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) 

Sahəni görmək üçün basın.

0
15 марта '17 в 12:31 2017-03-15 12:31 cavab 15 mart '17 'də 12:17'Ziuccia tərəfindən verilmişdir 2017-03-03-15 12:31

haqqında digər suallar və ya bir sual