Pandaların Çizimi Tüm tarih değerlerini MMM-YYYY [kopya] olarak biçimlendirilmiş x ekseninde (matplolib yalnızca birkaç değer gösterir) görüntüleyin

Dec 17 2020
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime

df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

Aşağıdaki grafiği alıyorum ve x ekseninde her AY-YIL için tüm tarih değerlerini çizmem gerekiyor. X ekseninde çapraz olarak biçimlendirilmiş tüm ayları ve yılları (Şubat-19) biçiminde görüntülemek istiyorum. Jpg olarak kaydedeceğim için arsanın boyutunu her şeye sığacak şekilde büyütebilirim.

X ekseninin şu değerlere sahip olmasını istiyorum: 16 Ocak, 16 Şubat, 16 Mart, 16 Nisan, 16 Mayıs, 16 Haziran, 16 Temmuz, 16 Ağustos, 16 Eylül, 16 Ekim, 16 Kasım, 16 Aralık, 17 Ocak , 17 Şubat… (Tüm bu değerleri görüntülemek istiyorum, matplotlib bunu otomatik olarak kısaltır, bundan kaçınmak istiyorum)

Yanıtlar

1 Mr.T Dec 17 2020 at 22:48

Yorumlarda belirtildiği gibi, hem Konumlandırıcıyı hem de Biçimlendiriciyi ayarlamanız gerekir. Bu, genel olarak grafikler için matplotlib belgelerinde ve tarih saat eksenleri için ayrı olarak açıklanmıştır . Ayrıca TickLocators'ın açıklamasına bakın . Biçimlendirme kodları Python'un strftime () ve strptime () biçim kodlarından türetilmiştir .

from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter


#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)

ax = df.plot()

#defines the tick location 
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)

plt.tight_layout()
plt.show()

Örnek çıktı:

Boul Dec 17 2020 at 20:47

Yalnızca pandalar işlevleriyle, tarih şema dizininizi '% Y-% m-% d' yeni bir '% b-% Y' biçimiyle ve grafikteki bazı parametreleri değiştirmek için stftime () kullanabilirsiniz .

smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())

xticks ile kesinlikle görmek istediğiniz etiketi belirtin.

etiket listesini değiştirmek için set_xticklabels .

LucaAngioloni Dec 17 2020 at 20:14

Pandas arsa yerine matplotlib kullanmanızı ve tarihleri ​​belirttiğiniz formatta çizmek için şuna benzer bir şey yapmanızı öneririm:

import matplotlib.dates as mdates

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
                                      # %b is Month abbreviated name, %Y is the Year

# ... after some code

fig, ax = plt.subplots(figsize=(15,8))

ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()

# Plot data ...

ax.set_xticks("""... define how often to show the date""")

Verileri veri çerçevesinden şu gibi bir şeyle alabilirsiniz: .to_numpy()veya .values().

Bu bakınız dokümantasyon için set_xticksişlevi.