Saya mengalami masalah saat mencoba agar kutu tanggal saya diputar di matplotlib. Contoh program kecil ada di bawah ini. Jika saya mencoba memutar kutu di bagian akhir, kutu tidak akan diputar. Jika saya mencoba memutar tanda centang seperti yang ditunjukkan di bawah komentar 'crash', maka matplot lib crash.
Ini hanya terjadi jika nilai-x adalah tanggal. Jika saya mengganti variabel dates
dengan variabel t
dalam panggilan ke avail_plot
, xticks(rotation=70)
panggilan berfungsi dengan baik di dalamnya avail_plot
.
Ada ide?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
python
matplotlib
Neal
sumber
sumber
Jawaban:
Jika Anda lebih suka pendekatan yang tidak berorientasi objek, pindah
plt.xticks(rotation=70)
ke kanan sebelum duaavail_plot
panggilan, misIni mengatur properti rotasi sebelum mengatur label. Karena Anda memiliki dua sumbu di sini,
plt.xticks
menjadi bingung setelah Anda membuat dua plot. Pada titik ketikaplt.xticks
tidak melakukan apa-apa,plt.gca()
tidak tidak memberikan sumbu Anda ingin memodifikasi, dan sebagainyaplt.xticks
, yang bekerja pada sumbu saat ini, tidak akan bekerja.Untuk pendekatan berorientasi objek yang tidak menggunakan
plt.xticks
, Anda dapat menggunakansetelah dua
avail_plot
panggilan. Ini menetapkan rotasi pada sumbu yang benar secara khusus.sumber
plt.setp
Anda dapat mengatur beberapa parameter dengan menetapkannya sebagai argumen kata kunci tambahan. yanghorizontalalignment
kwarg sangat berguna ketika Anda memutar label centang:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
di mana saja.plt.setp
solusi benar-benar berorientasi objek. Jika Anda tidak menyukai kenyataan bahwa ada beberapaplt
di dalamnya, gunakanfrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
saja.plt.xticks
yang pyplot. Dokumentasi itu sendiri mengatakan untuk tidak mencampur gaya.plt.setp
lebih verbose tetapi bukan gaya berorientasi objek yang khas baik. Jawaban Anda pasti yang terbaik di sini. Pada dasarnya, apa pun dengan fungsi tidak berorientasi objek. Tidak masalah apakah Anda mengimporsetp
atau tidak.yticks
, dan kode tersebut tidak memiliki kapak yang didefinisikan di luaravail_plot
...Solusi berfungsi untuk matplotlib 2.1+
Ada metode sumbu
tick_params
yang dapat mengubah properti centang. Itu juga ada sebagai metode poros sebagaiset_tick_params
Atau
Sebagai catatan, solusi saat ini mencampur antarmuka stateful (menggunakan pyplot) dengan antarmuka berorientasi objek dengan menggunakan perintah
plt.xticks(rotation=70)
. Karena kode dalam pertanyaan menggunakan pendekatan berorientasi objek, yang terbaik adalah tetap menggunakan pendekatan itu secara keseluruhan. Solusi ini memang memberikan solusi eksplisit yang baikplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
sumber
Solusi mudah yang menghindari perulangan di atas ticklabes adalah dengan hanya menggunakan
fig.autofmt_xdate()
Perintah ini secara otomatis memutar label xaxis dan menyesuaikan posisinya. Nilai standarnya adalah sudut rotasi 30 ° dan perataan horizontal "kanan". Tetapi mereka dapat diubah dalam pemanggilan fungsi
bottom
Argumen tambahan setara dengan pengaturanplt.subplots_adjust(bottom=bottom)
, yang memungkinkan untuk mengatur sumbu sumbu bawah ke nilai yang lebih besar untuk meng-host label centang yang diputar.Jadi pada dasarnya di sini Anda memiliki semua pengaturan yang Anda butuhkan untuk memiliki sumbu tanggal yang bagus dalam satu perintah.
Contoh yang baik dapat ditemukan di halaman matplotlib.
sumber
plt.setp
pendekatan, atau loop atas kutu (yang pada dasarnya sama).twinx
), itu mengacaukan keselarasan antara kutu dan label kutu. Dalam hal ini, solusi oleh Ted Petrou lebih baik.Cara lain untuk menerapkan
horizontalalignment
danrotation
untuk setiap label centang adalah melakukanfor
perulangan pada label centang yang ingin Anda ubah:Dan di sini adalah contoh jika Anda ingin mengontrol lokasi kutu besar dan kecil:
sumber
Cukup gunakan
sumber