Matplotlib grafiğinin sol üst köşesine metin koymak


112

Metni bir matplotlib figürünün sol üst (veya sağ üst) köşesine, örneğin sol üst göstergenin nerede olacağı veya grafiğin üstüne ama sol üst köşeye nasıl koyabilirim? Örneğin bir plt.scatter () ise, scatter'ın karesi içinde olacak bir şey, en sol üst köşeye yerleştirin.

Bunu, ideal olarak çizilen dağılım grafiğinin ölçeğini bilmeden yapmak istiyorum, çünkü veri kümesinden veri kümesine değişecektir. Sadece metnin kabaca sol üstte veya kabaca sağ üstte olmasını istiyorum. Açıklama türü konumlandırmayla, yine de herhangi bir dağılım çizim noktasıyla çakışmamalıdır.

Teşekkürler!


Metninizi bir kutuya koymak istiyorsanız stackoverflow.com/questions/20842613/…
raphael

1
Bunun bu sorunun bir kopyası olduğunu düşünüyorum . Yinelenen sorunun çok daha iyi yanıtları vardır, ancak burada sağlanan yanıt türü ( textve kullanılarak ax.transAxes) aralarında değildir.
ImportanceOfBeingErnest

Yanıtlar:


162

Kullanabilirsiniz text.

text(x, y, s, fontsize=12)

text koordinatlar eksene göre verilebilir, bu nedenle metninizin konumu çizimin boyutundan bağımsız olacaktır:

Varsayılan dönüştürme, metnin veri koordinatlarında olduğunu belirtir; alternatif olarak, eksen koordinatlarında metin belirtebilirsiniz (0,0 sol alt ve 1,1 sağ üsttür). Aşağıdaki örnek, metni eksenlerin ortasına yerleştirir:

text(0.5, 0.5,'matplotlib',
     horizontalalignment='center',
     verticalalignment='center',
     transform = ax.transAxes)

Metnin dağılmanızın herhangi bir noktasına müdahale etmesini önlemek artık daha zor. Daha kolay yöntem, y_axis (ymax in ylim((ymin,ymax))) değerini, noktalarınızın maksimum y koordinatından biraz daha yüksek bir değere ayarlamaktır . Bu şekilde metin için her zaman bu boş alana sahip olacaksınız.

DÜZENLEME: burada bir örnek var:

In [17]: from pylab import figure, text, scatter, show
In [18]: f = figure()
In [19]: ax = f.add_subplot(111)
In [20]: scatter([3,5,2,6,8],[5,3,2,1,5])
Out[20]: <matplotlib.collections.CircleCollection object at 0x0000000007439A90>
In [21]: text(0.1, 0.9,'matplotlib', ha='center', va='center', transform=ax.transAxes)
Out[21]: <matplotlib.text.Text object at 0x0000000007415B38>
In [22]:

görüntü açıklamasını buraya girin

Ha ve va parametreleri, metninizin ekleme noktasına göre hizalamasını ayarlar. yani. ha = 'sol', çerçeve manuel olarak küçültüldüğünde (daha dar yapıldığında) uzun bir metnin sol eksenden çıkmasını önlemek için iyi bir kümedir.


Merkezlemeyi alıyorum ama onu nasıl yukarıdan sola bırakabilirim? "Yatay

1
belirtildiği gibi x, y değerleri ile oynamalısınız ( 0,0 sol alt ve 1,1 sağ üsttür ). Düzenlemeye bakın
Joaquin

2
@ user3645626 İçeri aktarımlar: Yanıttaki from pylab import figure, text, scatter, show kod, açık içeri aktarmanın gerekli olmadığı pylab modunda bir ipython konsolunda yürütüldü. Temiz bir ortamda yukarıdakileri içe aktarmanız ve show()arsayı görüntülemeniz gerekir
joaquin

5

plt.legendGerçek bir efsane istemeseniz bile, bir çözüm işlevi kullanmak olabilir. locGösterge kutusunun yerleşimini keyterm kullanarak belirtebilirsiniz. Bu web sitesinde daha fazla bilgi bulunabilir , ancak bir efsanenin nasıl yerleştirileceğini gösteren bir örnek de ekledim:

ax.scatter(xa,ya, marker='o', s=20, c="lightgreen", alpha=0.9)
ax.scatter(xb,yb, marker='o', s=20, c="dodgerblue", alpha=0.9)
ax.scatter(xc,yc marker='o', s=20, c="firebrick", alpha=1.0)
ax.scatter(xd,xd,xd, marker='o', s=20, c="goldenrod", alpha=0.9)
line1 = Line2D(range(10), range(10), marker='o', color="goldenrod")
line2 = Line2D(range(10), range(10), marker='o',color="firebrick")
line3 = Line2D(range(10), range(10), marker='o',color="lightgreen")
line4 = Line2D(range(10), range(10), marker='o',color="dodgerblue")
plt.legend((line1,line2,line3, line4),('line1','line2', 'line3', 'line4'),numpoints=1, loc=2) 

Not çünkü loc=2, efsane arsa sol üst köşesinde bulunur. Metin arsa ile örtüşüyorsa, kullanarak onu küçültebilirsiniz legend.fontsize, bu da lejantı küçültür.


0
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 6))
plt.text(0.1, 0.9, 'text', size=15, color='purple')

# or 

fig, axe = plt.subplots(figsize=(6, 6))
axe.text(0.1, 0.9, 'text', size=15, color='purple')

İkisinin Çıktısı

görüntü açıklamasını buraya girin

import matplotlib.pyplot as plt

# Build a rectangle in axes coords
left, width = .25, .5
bottom, height = .25, .5
right = left + width
top = bottom + height
ax = plt.gca()
p = plt.Rectangle((left, bottom), width, height, fill=False)
p.set_transform(ax.transAxes)
p.set_clip_on(False)
ax.add_patch(p)


ax.text(left, bottom, 'left top',
        horizontalalignment='left',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, bottom, 'left bottom',
        horizontalalignment='left',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right bottom',
        horizontalalignment='right',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right top',
        horizontalalignment='right',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(right, bottom, 'center top',
        horizontalalignment='center',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'right center',
        horizontalalignment='right',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'left center',
        horizontalalignment='left',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(0.5 * (left + right), 0.5 * (bottom + top), 'middle',
        horizontalalignment='center',
        verticalalignment='center',
        transform=ax.transAxes)

ax.text(right, 0.5 * (bottom + top), 'centered',
        horizontalalignment='center',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, top, 'rotated\nwith newlines',
        horizontalalignment='center',
        verticalalignment='center',
        rotation=45,
        transform=ax.transAxes)

plt.axis('off')

plt.show()

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.