如何使用 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 使用GridSpec和其他功能自定义图形布局