mengurangi jumlah kutu plot

160

Saya memiliki terlalu banyak kutu pada grafik saya dan mereka saling berhadapan.

Bagaimana saya bisa mengurangi jumlah kutu?

Misalnya, saya punya kutu:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

Dan saya hanya ingin:

1E-5, 1E-3, ... 1E5, 1E7

Saya sudah mencoba bermain dengan itu LogLocator, tetapi saya belum bisa mengetahuinya.

jlconlin
sumber

Jawaban:

266

Atau, jika Anda hanya ingin mengatur jumlah kutu sambil memungkinkan matplotlib untuk memposisikan mereka (saat ini hanya dengan MaxNLocator), ada pyplot.locator_params,

pyplot.locator_params(nbins=4)

Anda dapat menentukan sumbu tertentu dalam metode ini seperti yang disebutkan di bawah ini, standarnya adalah:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)
bgamari
sumber
27
Ini adalah saran yang bagus, juga dapat menentukan pyplot.locator_params(axis = 'x', nbins = 4)(atau axis = 'y') membuat prosesnya sangat mudah. Terima kasih @ bgamari!
benjaminmgross
8
Dengan skala log, ini berfungsi numtickssebagai penggantinbins
meduz
1
@ bgamari, bisakah Anda menambahkan numtickssolusi untuk plot logaritmik seperti yang ditunjukkan oleh @meduz?
Løiten
7
Tampaknya ini tidak menempatkan label di tempat seharusnya. Misalnya, jika label centang asli adalah [0, 1, ..., 99]dan sekarang satu set nticks=10, maka label jarang baru akan ditempatkan sepuluh kali terpisah sepanjang sumbu, yaitu sekarang 1akan duduk di mana 9dulu, di 2mana 19... dan di 9mana 99dulu.
Vim
2
Periksa hasil Anda sebelum memercayai metode ini. @Vim benar. Nilai centang akan ditempatkan dengan salah.
David J.
54

Jika seseorang masih mendapatkan halaman ini di hasil pencarian:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)
Katerina
sumber
7
Ini sebenarnya bekerja vs semua jawaban lain yang tidak melakukan apa pun. terima kasih :)
faizan
Sudah selesai dilakukan dengan baik. Butuh beberapa saat untuk menemukan ini tetapi melakukan apa yang saya inginkan.
John
Terima kasih, ini memastikan bahwa label apa yang tersisa berada di posisi yang benar. Langkah tambahan yang akan meningkatkan jawaban ini adalah juga menghapus tanda centang.
David J.
Jawaban sederhana yang bagus - terkejut tidak ada metode khusus yang diketahui komunitas SO. Ini akan menjadi tambahan yang berharga untuk lib?
jabberwocky
32

Untuk mengatasi masalah penyesuaian dan tampilan kutu, lihat panduan Tick ​​Locators di situs web matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Akan mengatur jumlah kutu di sumbu x ke 3, dan mendistribusikannya secara merata di sumbu.

Ada juga tutorial yang bagus tentang ini

Prageeth Jayathissa
sumber
Hanya pilih 3 datetime index pertama. ketika mendapatkan kapak dari panda.DataFrame.plot ax = df.plot()
Mithril
@Mithril maaf saya tidak mengerti komentar Anda. Bisakah Anda jelaskan?
Prageeth Jayathissa
Jika saya memiliki df ( pandas.DataFrame) dengan indeks datetime [2019-01-01, ... 2019-11-01], panggil ax = df.plot(), kembalikan objek gambar. panggilan ax.xaxis.set_major_locator(plt.MaxNLocator(3)) hanya menampilkan 3 indeks pertama [2019-01-01, 2019-01-02, 2019-01-03].
Mithril
1
@Mithril, df.plot()sering menampilkan minor_locator, jadi Anda mungkin ingin mencoba ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Juga ingat untuk mengganti 3jumlah kutu yang ingin Anda tampilkan. Untuk jangka waktu panda saya sarankan import matplotlib.dates as mdatesdan jalankan ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))denganax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa
20

Ada set_ticks()fungsi untuk objek sumbu.

André Caron
sumber
4
Ini akan berhasil jika saya tahu sebelumnya apa yang saya inginkan. Contoh yang saya berikan di atas hanyalah sebuah contoh. Saya tidak tahu apa kutu itu, saya hanya tahu saya ingin lebih sedikit, yaitu setiap kutu lainnya.
jlconlin
10
Anda dapat memanggil get_xticks()atau get_yticks()pertama untuk objek sumbu, mengedit seperlunya, lalu meneruskan daftar kembali ke set_ticks().
user812786
4
Saya tidak punya set_ticks(), tapi saya punya set_xticks()dan set_yticks(). Ini adalah atribut dari objek sumbu, bukan sumbu. Mungkin ini telah berubah selama beberapa tahun terakhir.
Gauthier
2
Saya tidak yakin jika saya harus, beberapa orang telah menemukan jawaban Anda berguna apa adanya, dan hanya karena berbeda bagi saya tidak berarti itu untuk semua orang.
Gauthier
1
Sebuah contoh akan sangat bermanfaat untuk membuat jawaban ini bermanfaat.
Richard
10

jika seseorang masih membutuhkannya, dan karena tidak ada yang benar-benar bekerja di sini untuk saya, saya datang dengan cara yang sangat sederhana yang menjaga penampilan plot yang dihasilkan "sebagaimana adanya" sambil memperbaiki jumlah kutu ke tepat N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))
raphael
sumber
2
Saya harus memodifikasi baris terakhir sedikit untuk mendapatkannya mengembalikan nilai sebagai int bukannya float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje
@NickSettje masih mengapung bersamaku!
Mohd
4

Solusi yang diberikan @raphael sangat mudah dan cukup membantu.

Namun, label centang yang ditampilkan tidak akan berupa nilai sampel dari distribusi asli tetapi dari indeks array yang dikembalikan oleh np.linspace(ymin, ymax, N).

Untuk menampilkan nilai N yang berjarak sama dari label centang asli Anda, gunakan set_yticklabels()metode ini. Berikut ini cuplikan untuk sumbu y, dengan label bilangan bulat:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)
Tantris
sumber
Kudos untuk tweak yang bagus ini!
Mohd
2

Ketika skala log digunakan, jumlah kutu utama dapat diperbaiki dengan perintah berikut

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Nilai yang ditetapkan untuk numticksmenentukan jumlah kutu sumbu yang akan ditampilkan.

Kredit ke posting @ bgamari untuk memperkenalkan locator_params()fungsi, tetapi nticksparameter melempar kesalahan ketika skala log digunakan.

Ébe Isaac
sumber
Pertanyaan dan jawabannya adalah untuk matplotlib sebelumnya, yaitu 1, dan Anda merujuk ke 2.
Dawid Laszuk