Saya tidak tahu bagaimana cara memutar teks pada X Axis. Stempel waktu, sehingga ketika jumlah sampel meningkat, mereka semakin dekat dan lebih dekat sampai tumpang tindih. Saya ingin memutar teks 90 derajat sehingga sampel semakin berdekatan, mereka tidak tumpang tindih.
Di bawah ini adalah apa yang saya miliki, ini berfungsi dengan baik dengan pengecualian bahwa saya tidak tahu cara memutar teks sumbu X.
import sys
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime
font = {'family' : 'normal',
'weight' : 'bold',
'size' : 8}
matplotlib.rc('font', **font)
values = open('stats.csv', 'r').readlines()
time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]
plt.plot(time, delay)
plt.grid(b='on')
plt.savefig('test.png')
python
matplotlib
tMC
sumber
sumber
ha
(horizontal align)Jawaban:
Ini bekerja untuk saya:
sumber
ax.plot(...)
kemudianplt.xticks(rotation=90)
Jalan mudah
Seperti dijelaskan di sini , ada metode yang ada di
matplotlib.pyplot
figure
kelas yang secara otomatis merotasikan tanggal dengan tepat untuk Anda.Anda dapat memanggilnya setelah Anda memplot data Anda (yaitu
ax.plot(dates,ydata)
:Jika Anda perlu memformat label lebih lanjut, periksa tautan di atas.
Objek non-datetime
Sesuai komentar languitar , metode yang saya sarankan untuk non-datetime
xticks
tidak akan diperbarui dengan benar ketika zoom, dll. Jika itu bukandatetime
objek yang digunakan sebagai data x-axis Anda, Anda harus mengikuti jawaban Tommy :sumber
Banyak jawaban "benar" di sini tetapi saya akan menambahkan satu lagi karena saya pikir beberapa perincian tidak disertakan. OP meminta rotasi 90 derajat tetapi saya akan berubah menjadi 45 derajat karena ketika Anda menggunakan sudut yang tidak nol atau 90, Anda juga harus mengubah perataan horizontal; jika tidak, label Anda akan tidak di tengah dan agak menyesatkan (dan saya rasa banyak orang yang datang ke sini ingin memutar sumbu ke sesuatu selain 90).
Kode termudah / paling tidak
Pilihan 1
Seperti disebutkan sebelumnya, itu mungkin tidak diinginkan jika Anda lebih suka mengambil pendekatan Berorientasi Objek.
pilihan 2
Cara cepat lain (ini ditujukan untuk objek tanggal tetapi tampaknya bekerja pada label apa pun; ragu bahwa ini direkomendasikan):
fig
Anda biasanya akan mendapatkan dari:fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Berorientasi Objek / Berurusan langsung dengan
ax
Opsi 3a
Jika Anda memiliki daftar label:
Opsi 3b
Jika Anda ingin mendapatkan daftar label dari plot saat ini:
Opsi 4
Mirip dengan di atas, tetapi sebaliknya melalui manual.
Opsi 5
Kami masih menggunakan
pyplot
(sepertiplt
) di sini tetapi berorientasi objek karena kami mengubah properti dariax
objek tertentu .Opsi 6
Opsi ini sederhana, tetapi AFAIK Anda tidak dapat mengatur label dengan menyelaraskan cara ini sehingga opsi lain mungkin lebih baik jika sudut Anda tidak 90.
Sunting: Ada diskusi tentang "bug" ini dan perbaikannya berpotensi dijadwalkan untuk
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774sumber
Coba pyplot.setp. Saya pikir Anda bisa melakukan sesuatu seperti ini:
sumber
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
berfungsi dengan baik dengan backend Qt4Agg. Dalam kasus saya, akan direset olehplt.hist()
, jadi saya memanggilnya setelah, meskipunplt.plot()
tidak mengatur ulang, jadi Anda harus baik-baik sajalocs, labels = plt.xticks() plt.setp(labels, rotation=90)
sebelumplt.plot(time, delay)
dan itu bekerja dengan baik.Terpisah dari
ini juga mungkin:
sumber
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Saya datang dengan contoh serupa. Sekali lagi, kata kunci rotasi adalah .. yah, kuncinya.
sumber
datetime
Jawaban saya diilhami oleh jawaban cjohnson318, tetapi saya tidak ingin memberikan daftar label yang sudah di-kode; Saya ingin memutar label yang ada:
sumber
Jika menggunakan
plt
:Dalam kasus menggunakan panda atau burung laut untuk plot, dengan asumsi
ax
sebagai sumbu untuk plot:Cara lain untuk melakukan hal di atas:
sumber
for tick in ax.get_xticklabels(): tick.set_rotation(45)
melakukan trik untukku.Jika Anda ingin menerapkan rotasi pada objek sumbu, cara termudah adalah menggunakan
tick_params
. Sebagai contoh.Referensi dokumentasi Matplotlib di sini .
Ini berguna ketika Anda memiliki array sumbu yang dikembalikan oleh
plt.subplots
, dan lebih mudah daripada menggunakanset_xticks
karena dalam hal itu Anda perlu juga mengatur label centang, dan juga lebih nyaman bahwa mereka yang beralih di atas kutu (untuk alasan yang jelas)sumber
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
.labelrotation=30
.sumber
Itu akan tergantung pada apa yang Anda rencanakan.
Untuk panda dan burung laut yang memberi Anda objek Sumbu:
Jika Anda perlu memutar label Anda mungkin perlu mengubah ukuran font juga, Anda dapat menggunakannya
font_scale=1.0
untuk melakukannya.sumber
Untuk memutar label sumbu x ke 90 derajat
sumber
Solusi paling sederhana adalah dengan menggunakan:
tetapi juga
misalnya untuk tanggal saya menggunakan rotasi = 45 dan bawah = 0,20 tetapi Anda dapat melakukan beberapa tes untuk data Anda
sumber