Saya ingin menggunakan set_xticks dan set_xticklabels untuk mengontrol jumlah label tetapi bagan tidak terlihat benar.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
import seaborn as sns

d = {'sel_date': pd.date_range('2020-01-01', '2021-01-01', 24), 'ID':list('abbb')*6, 'index':np.random.randint(10, size=24)}
df = pd.DataFrame(data=d)
plot = pd.pivot_table(df, values='index', index=['sel_date'],
                    columns=['ID'], aggfunc=np.mean)
plot.fillna(0, inplace=True)
date_fmt = mdates.DateFormatter("%Y-%m")

fig, ax = plt.subplots(figsize=(8, 4))
ax = sns.lineplot(data=plot)
ax.set_xticks(np.arange(7))
months = pd.date_range('2020-01', '2021-01', periods=7).strftime('%Y-%m').tolist()
ax.set_xticklabels(months)
plt.show()

Itu kembali

[Text(0, 0, '2020-01'),
 Text(1, 0, '2020-03'),
 Text(2, 0, '2020-05'),
 Text(3, 0, '2020-07'),
 Text(4, 0, '2020-09'),
 Text(5, 0, '2020-11'),
 Text(6, 0, '2021-01')]

enter image description here

Jika saya memplot tanggal sumbu x sebagai datetime, itu berfungsi

import matplotlib.dates as mdates
date_fmt = mdates.DateFormatter("%Y-%m")
fig, ax = plt.subplots(figsize=(8, 4))
ax = sns.lineplot(data=plot)
ax.set(xlabel='')
ax.xaxis.set_major_formatter(date_fmt)

enter image description here

Saya ingin tahu mengapa bagan pertama tidak berfungsi. Terima kasih

0
Osca 28 Mei 2021, 09:52

1 menjawab

Jawaban Terbaik

Kesalahan berasal dari fakta bahwa matplotlib menganggap jumlah hari dari 1970-01-01 UTC sebagai abcissa (lihat dokumentasi), seperti yang dijelaskan oleh r-beginners, dan Anda memilih centang untuk dari 0 sampai 6.

Tanda centang asli adalah (Anda dapat memeriksanya sendiri dengan menelepon ax.get_xticks() sebelum menyetel tanda centang khusus):

array([18262., 18322., 18383., 18444., 18506., 18567., 18628.])

Anda tidak dapat mengubah centang yang dipilih secara otomatis (menghapus ax.set_xticks(np.arange(7))) atau menggunakan nilai yang benar saat menyetelnya (tidak terlalu diperlukan karena nilainya tidak akan diubah, tetapi saya akan membiarkannya di sini karena mungkin berguna untuk seseorang di masa depan):

ax.set_xticks(ax.get_xticks())
months = pd.date_range('2020-01', '2021-01', periods=7).strftime('%Y-%m').tolist()
ax.set_xticklabels(months)
1
wagnifico 28 Mei 2021, 09:37