Menempatkan teks di pojok kiri atas plot matplotlib


112

Bagaimana cara meletakkan teks di sudut kiri atas (atau kanan atas) gambar matplotlib, misalnya di mana legenda kiri atas berada, atau di atas plot tetapi di sudut kiri atas? Misalnya jika itu adalah sebuah plt.scatter (), maka sesuatu yang akan berada di dalam kuadrat pencar, letakkan di pojok kiri atas.

Saya ingin melakukan ini tanpa mengetahui secara ideal skala scatterplot yang sedang diplot, karena ini akan berubah dari kumpulan data ke kumpulan data. Saya hanya ingin teksnya kira-kira di kiri atas, atau kira-kira di kanan atas. Dengan pemosisian tipe legenda, itu tidak boleh tumpang tindih dengan titik plot pencar apa pun.

Terima kasih!


Jika Anda ingin meletakkan teks Anda di kotak stackoverflow.com/questions/20842613/…
raphael

1
Saya pikir ini adalah duplikat dari pertanyaan ini . Pertanyaan duplikat bahkan memiliki jawaban yang jauh lebih baik, meskipun jenis jawaban yang disediakan di sini (menggunakan textdan ax.transAxes) tidak ada di antaranya.
ImportanceOfBeingErnest

Jawaban:


162

Anda bisa menggunakan text.

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

text koordinat dapat diberikan relatif terhadap sumbu, sehingga posisi teks Anda tidak bergantung pada ukuran plot:

Transformasi default menentukan bahwa teks berada dalam koordinat data, alternatifnya, Anda dapat menentukan teks dalam koordinat sumbu (0,0 di kiri bawah dan 1,1 di kanan atas). Contoh di bawah ini menempatkan teks di tengah sumbu ::

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

Untuk mencegah teks mengganggu titik pencar Anda lebih sulit afaik. Metode yang lebih mudah adalah dengan mengatur y_axis (ymax in ylim((ymin,ymax))) ke nilai yang sedikit lebih tinggi dari koordinat y maksimum dari poin Anda. Dengan cara ini Anda akan selalu memiliki ruang kosong ini untuk teks.

EDIT: di sini Anda memiliki contoh:

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]:

masukkan deskripsi gambar di sini

Parameter ha dan va mengatur perataan teks Anda relatif terhadap titik penyisipan. yaitu. ha = 'left' adalah set yang baik untuk mencegah teks panjang keluar dari sumbu kiri saat bingkai diperkecil (dibuat lebih sempit) secara manual.


Saya mendapatkan pemusatan tetapi bagaimana saya bisa membuatnya menjadi kiri atas? Saya mencoba "horizontalalignment" disetel ke 'kiri' dan vertikalalignment disetel ke atas tetapi tidak berhasil

1
Anda harus bermain dengan nilai x, y seperti yang ditunjukkan ( 0,0 di kiri bawah dan 1,1 di kanan atas ). Lihat edit
joaquin

2
@ user3645626 Impornya adalah: from pylab import figure, text, scatter, show Kode dalam jawaban dijalankan di konsol ipython dalam mode pylab di mana impor eksplisit tidak diperlukan. Pada lingkungan yang bersih Anda perlu mengimpor di atas dan membuat show()untuk melihat plot
joaquin

5

Salah satu solusinya adalah menggunakan plt.legendfungsi tersebut, bahkan jika Anda tidak menginginkan legenda yang sebenarnya. Anda dapat menentukan penempatan kotak legenda dengan menggunakan lockeyterm. Informasi lebih lanjut dapat ditemukan di situs web ini, tetapi saya juga menyertakan contoh yang menunjukkan cara menempatkan legenda:

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) 

Perhatikan bahwa loc=2legenda berada di pojok kiri atas plot. Dan jika teks tumpang tindih dengan plot, Anda dapat membuatnya lebih kecil dengan menggunakan legend.fontsize, yang akan membuat legenda lebih kecil.


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

Output dari Keduanya

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.