matplotlib 使用datetime列类型设置主Xtick

fv2wmkja  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(141)

enter image description here
我想清理一些matplotlib图像,从January刻度旁边的每个x中删除年份。
这是我的代码:

df_ref1 = data.groupby(['ref_date'])['fuel'].value_counts().unstack()
fig, ax = plt.subplots(figsize=(6,4), dpi=200);
df_ref1.plot(ax=ax, kind='bar', stacked=True)
ax.set_title('Distribuição de tipo de combustível')
ax.spines[['top','right', 'left']].set_visible(False)
ax.set_xlabel('')
plt.xticks(rotation = 45,ha='right');
ax.legend(['Gasolina','Disel', 'Álcool'],bbox_to_anchor=(.85, .95, 0, 0), shadow=False, frameon=False)
plt.tight_layout()

我尝试使用:

ax.xaxis.set_major_formatter('%Y/%m')
ax.xaxis.set_minor_formatter('%m')

尝试使用:

ax.xaxis.set_major_formatter(DateFormatter('%Y/%m'))
ax.xaxis.set_minor_formatter(DateFormatter('%m'))

但最后转到了1970/01年
但没有成功。有线索吗?

fhity93d

fhity93d1#

一种方法是首先截断标签,只显示年份和月份,然后只显示每隔n个(在您的情况下是第12个)标签,这样您就可以看到每年的第一个月。
我用的数据...

Date  Petrol  Diesel  Alcohol
0  2021-01-01    1975     320       30
1  2021-02-01    1976     321       31
2  2021-03-01    1977     322       32
3  2021-04-01    1978     323       33
....
22 2022-11-01    1997     342       52
23 2022-12-01    1998     343       53
24 2023-01-01    1999     344       54

更新的代码...

df_ref1=df_ref1.set_index('Date', drop=True) ## Set it so dates are in index
##Your code
fig, ax = plt.subplots(figsize=(6,4), dpi=200);
ax.set_title('Distribuição de tipo de combustível')
#ax.spines[['top','right', 'left']].set_visible(False)
ax.set_xlabel('')
df_ref1.plot(ax=ax, kind='bar', stacked=True)
plt.xticks(rotation = 45,ha='right')
ax.legend(['Gasolina','Disel', 'Álcool'],bbox_to_anchor=(.85, .95, 0, 0), shadow=False, frameon=False)

## Get the labels using get_text() and set it to show first 7 characters
labels = [item.get_text() for item in ax.get_xticklabels()]
labels = [x[:7] for x in labels]
ax.set_xticklabels(labels)        

## Show only the 1st, 13th, ... label
every_nth = 12
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

输出图

相关问题