Saya mencoba mendamaikan anotasi titik dalam plot sebar Matplotlib dengan pengaturan batas manual, tetapi saya mendapat pesan kesalahan atau saya mendapatkan masalah desain.

Ini kode saya :

fig, ax = plt.subplots(figsize = (20,10)) #manual limit setting
plt.axis([-2,3,-2.5,5])
plt.scatter(x, y)


for i, txt in enumerate(n):   #dot annotation   
    ax.annotate(txt, (x[i], y[i]))

Berikut adalah tutup layar dari output (saya mendapatkan plot pencar terakhir sebagai persegi panjang kecil yang terletak di sudut kiri persegi panjang putih besar:

Output

Saya juga mencoba ini :

 fig, ax = plt.subplots(figsize = (20,10))
    ax = plt.axis([-2,3,-2.5,5])
    plt.scatter(x, y)


for i, txt in enumerate(n):
    ax.annotate(txt, (x[i], y[i]))

Tapi tentu saja saya mendapat pesan kesalahan berikut (meskipun bagan ditampilkan dengan benar, tetapi tanpa label di sebelah setiap titik yang sesuai).

AttributeError: 'list' object has no attribute 'annotate'

Kesalahan muncul karena loop saya mencoba mengulangi ax = plt.axis([-2,3,-2.5,5]), yang memang tidak masuk akal.

Adakah solusi untuk mengatasi masalah ini?

Terima kasih

1
alexnesov 19 Januari 2020, 00:54

2 jawaban

Jawaban Terbaik

Masalah terjadi karena selubung teks khusus dalam hal kliping. Biasanya Anda mungkin ingin teks di luar sumbu ditampilkan. Oleh karena itu anotasi dan teks memiliki argumen annotation_clip. Namun, ini mengganggu opsi bbox_inches="tight" saat menyimpan anotasi, karena anotasi masih dianggap sebagai bagian dari tata letak dan oleh karena itu gambar tetap memperhitungkan anotasi di luar sumbu.

Dua solusi:

  1. Tetapkan annotation_clip dan clip_on. Yaitu. Anda dapat secara eksplisit memberi tahu anotasi untuk dipotong pada sumbu:

    ax.annotate(txt, (x[i], y[i]), annotation_clip=True, clip_on=True)
    
  2. Tetapkan bbox_inches ke None. Saat menggunakan backend sebaris IPython, Anda dapat memintanya untuk tidak memperluas gambar melalui

    %config InlineBackend.print_figure_kwargs = {'bbox_inches':None}
    

    dalam sel sebelum mulai membuat konten Anda. (Ini terlihat di jawaban ini)

4
ImportanceOfBeingErnest 20 Januari 2020, 13:17

Saya tidak dapat mereplikasi masalah pertama (mencoba dalam versi 2.2.3, 3.1.1, 3.1.2) - Saya mendapatkan ini (menggunakan data acak). Coba perbarui versi matplotlib Anda atau gunakan

plt.savefig('/path/to/output/image.png')

Untuk menyimpan gambar ke disk alih-alih menampilkannya secara langsung dan melihat apakah masalah tetap ada.

Namun saya bisa menjelaskan kesalahannya

AttributeError: 'list' object has no attribute 'annotate'

Ini terjadi karena plt.axis() mengembalikan [xmin, xmax, ymin, ymax], bukan axes instance (fig, ax = plt.subplots(figsize=(20,10) mengembalikan instance axes ke ax).

1
William Miller 19 Januari 2020, 04:49