减少绘图 x 轴上的标签数量

Reducing the number of labels on x-axis of plot

提问人:AndysPythonStuff 提问时间:9/21/2022 更新时间:10/18/2022 访问量:1150

问:

我正在学习 matplotlib,并尝试绘制一个简单的散点图,该散点图在 x 轴上有日期,在 y 轴上有值。从 2004 年到 2019 年有 2200 个日期(格式为 2014-09-17 O 型)。

这是我的代码:

x=df.DATE
y=df.CLOSE

plt.figure(figsize=(21,12))
plt.xticks(fontsize=8, rotation = 45)
plt.scatter(x,y)

情节很棒,但显然,xaxis 上有 2000 个条目!我检查了 Matplotlib 文档(也许是我,但与 python 文档不同,它不是对菜鸟友好)和 stackoverflow 上的其他帖子,关于如何减少写在 x 轴上的标签(日期)的数量,并发现了各种命令:Axes.set_xticklabels(labels, *, fontdict=None, minor=False, **kwargs)set_xticks(), MaxNLocator(), autolocator, Axes.set_xticks(MaxNLocator(10)) 等。我尝试了各种变化,但没有一个奏效。许多人需要“斧头”,我没有使用过,当我尝试斧头时,它告诉我它没有定义。

我被难住了。我有什么简单的方法可以将 x 轴上的条目数量减少到最多“n”个日期或每 10 个日期一个?

谢谢!

python matplotlib 格式 x 轴 xticks

评论


答:

1赞 urospet 9/21/2022 #1

您可以使用类似的东西:

import matplotlib.dates as mdates


years = mdates.YearLocator()  
ax.xaxis.set_major_locator(years) #Every year

下面是一个详细的例子: https://matplotlib.org/2.0.2/examples/api/date_demo.html

评论

0赞 JohanC 9/21/2022
仅当 x 值首先从字符串格式正确转换为 matplotlib 的日期格式时,这才有效。该帖子提到它们的格式是这样的。2014-09-17
0赞 urospet 9/22/2022
from datetime import datetime datetime_object = datetime.strptime(datetime_str, '%y-%m-%d') @JohanC
1赞 AndysPythonStuff 10/5/2022 #2

以防其他人有同样的问题。我找到了 2 种简单的方法......

第一

plt.locator_params(axis="x", nbins=<number>)

我不确定它为什么或如何工作,但我的图最初有 2204 个日期,格式为:2014-09-17,全部以 45 度打印出来,作为一条粗的、黑色的、不可读的线。

我使用“数字”= 3 并重新运行代码,它只在 xaxis 上重新绘制了年份。格式 2015.7 个数字,2015-2021 年。用“1”和“2”再做一次,看看发生了什么,仍然得到了 7 年,没有任何变化。

下面是原始代码和图形:

plt.figure(figsize=(21,12))
plt.xticks(fontsize=8, rotation = 45)
plt.scatter(df_btc_price.DATE, df_btc_price.VOLUME)

Original graph with problem

这是带有新图形的修改后的代码。

plt.figure(figsize=(21,12))
plt.xticks(fontsize=8, rotation = 45)
plt.scatter(df_btc_price.DATE, df_btc_price.VOLUME)

plt.locator_params(axis="x", nbins=2)

Ferwe labels on xaxis

我完全不知道为什么会这样,为什么它只打印年份而不是整个日期。

如果有人能启发我,我会很高兴。

第二

记住日期是这样的格式:2020-09-24,添加以下代码:

df_btc_price['DATE'] = pd.to_datetime(df_btc_price['DATE'])

所以它现在看起来像这样:

plt.figure(figsize=(21,12))
plt.xticks(fontsize=8, rotation = 45)
plt.scatter(df_btc_price.DATE, df_btc_price.VOLUME)
df_btc_price['DATE'] = pd.to_datetime(df_btc_price['DATE'])

该图如下所示:

enter image description here

我不知道(还)为什么它只打印年份,或者如何更改它,所以,例如,它打印月份。但至少它解决了凌乱的 x 轴标签。