如何使用 Matplotlib 调整图形的 x 轴“日期”标签?

Posted

技术标签:

【中文标题】如何使用 Matplotlib 调整图形的 x 轴“日期”标签?【英文标题】:How can I adjust the x-axis "Date" labels of the graph using the Matplotlib? 【发布时间】:2021-11-28 04:26:07 【问题描述】:

1.问题 我想知道交易价格随时间的变化,所以我做了一个散点图。 大局画得很粗,小问题没有解决。它是x轴标签的显示间隔。 我第一次做的结果和他们的部分代码如下。

import matplotlib.pyplot as plt
import matplotlib
import matplotlib.dates as mdates
from datetime import datetime
import pandas as pd

df = pd.read_excel('data.xlsx')
df = df.loc[df['계약면적(㎡)'] > 33]

# Data in the form of 202109 was made into 2021-09-01 
# and then make date data in the form of 202109 using dt.strftime ('%Y%m').

df['계약년월'] = df['계약년월'].astype(str)
df['계약년월'] = df['계약년월'].str[0:4] + '-' + df['계약년월'].str[4:6] + '-01'

df['계약년월'] = pd.to_datetime(df['계약년월'])
df['계약년월'] = df['계약년월'].dt.strftime('%Y%m')

# Graph

plt.figure(figsize=(30,10))

ax = plt.gca()

yticks = [100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000]
ylabels = [10, 20, 30, 40, 50, 60, 70, 80]
plt.yticks(yticks, labels = ylabels)

ax.xaxis.set_major_locator(mdates.MonthLocator())

plt.scatter(df['계약년월'], df['면적당 금액(원)'])
plt.xlabel('계약년월')
plt.ylabel('면적당 금액(원/㎡)')

plt.savefig('Graph.jpg')

如您所见,xticks 的标签显示为 201101 201308 201512 201807 202101。我想在每年的每一年结束时标记这个 20111212 201312 201412 201521 201612 201712 2018212 2018212 20等等。

2。我试过的方法 由于 yticks 很容易由我更改,我尝试将相同的方法应用于 xticks。它的代码如下。

plt.figure(figsize=(30,10))

ax = plt.gca()

yticks = [100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000]
ylabels = [10, 20, 30, 40, 50, 60, 70, 80]
plt.yticks(yticks, labels = ylabels)

# xticks I want to show.
xticks = ['201112', '201212', '201312', '201412', '201512', '201612', '201712', '201812', '201912', '202012']

# For the above list, it was converted into date data in the form of '%Y%m'.

xticks = [datetime.strptime(x, '%Y%m') for x in xticks]

# xlabels displayed in the graph

xlabels = ['2011y-end', '2012y-end', '2013y-end', '2014y-end', '2015y-end', '2016y-end', '2017y-end', '2018y-end', '2019y-end', '2020y-end']

plt.xticks(xticks, labels = xticks)

ax.xaxis.set_major_locator(mdates.MonthLocator(bymonth=None, interval=2, tz=None))

plt.scatter(df['계약년월'], df['면적당 금액(원)'])
plt.xlabel('계약년월')
plt.ylabel('면적당 금액(원/㎡)')

plt.savefig('Graph.jpg')

然而,结果是灾难性的。 可能是在触摸刻度的过程中出现了问题,这个结果是在 201212 之后是 201213 而不是 201301。

我很担心这个,所以我使用 strftime 和 strptime 将 'data' 和 'ticks list' 都转换为日期形式('%Y%m'),但我想知道为什么它不适用,因为我有意的。

如果有没有使用 Python 导致效率低下的代码,请谅解,如果您能让我解决问题,我将不胜感激。

【问题讨论】:

【参考方案1】:
from matplotlib import dates as mdates
plt.xlim(datetime.datetime(2011,12),datetime.datetime(2020,12))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b\n%Y'))

你可以根据自己的意愿设置x轴的主要格式,这里我用%d代表天,%b代表月份,\n代表换行,%Y代表年份。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何使用 Matplotlib 调整图形的 x 轴“日期”标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用matplotlib创建具有连续轴的图形?

Matplotlib 绘图 x 轴(数据文件日期时间)

使用Matplotlib画图系列

Matplotlib 使用GridSpec和其他功能自定义图形布局

如何使用 Python matplotlib 绘制具有 4 个象限的图形或绘图?

使用 seaborn/matplotlib 创建具有轴限制的图形 [重复]