【问题标题】:Pandas Plotting Display all date values on x-axis (matplolib only displays few values) formatted as MMM-YYYY [duplicate]Pandas Plotting 在 x 轴上显示所有日期值(matplotlib 仅显示少数值),格式为 MMM-YYYY [重复]
【发布时间】:2020-12-17 13:05:03
【问题描述】:
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime

df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

我得到下图,需要在 x 轴上绘制每个 MONTH-YEAR 的所有日期值。 我想以格式(2 月 19 日)在 x 轴上显示对角格式的所有月份和年份。我可以将绘图的大小放大以适合所有人,因为我会将其保存为 jpg。

我希望 x 轴具有以下值: 1月16日、2月16日、3月16日、4月16日、5月16日、6月16日、7月16日、8月16日、9月16日、10月16日、11月16日、12月16日、1月17日、2月17日…… (我想显示所有这些值,matplotlib 会自动截断这个,我想避免那个)

【问题讨论】:

  • 您必须在 matplotlib 中设置正确的定位器和格式化程序才能获得所需的 xticks。请阅读matplotlib tutorial 并询问,如果您仍然无法管理。一般来说,自定义标签涉及两个步骤:locating the ticks and formatting their labels。如果您想更频繁地使用它,您应该熟悉这些概念。

标签: python pandas matplotlib


【解决方案1】:

如 cmets 中所述,您必须同时设置定位器和格式化程序。这在 graphs in generalseparately for datetime axes 的 matplotlib 文档中得到了很好的解释。另请参阅TickLocators 的说明。格式化代码来源于 Python 的strftime() and strptime() format codes

from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter


#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)

ax = df.plot()

#defines the tick location 
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)

plt.tight_layout()
plt.show()

示例输出:

【讨论】:

    【解决方案2】:

    仅使用 pandas 函数,您可以使用 stftime() 将日期架构索引 '%Y-%m-%d' 替换为新形式 '%b-%Y' 和一些情节中的参数。

    smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())
    

    xticks 指定您绝对想看到的标签。

    set_xticklabels 修改标签列表。

    【讨论】:

    • 我对格式没有那么大的问题。我面临的主要问题是在 x 轴上显示所有月份值。 Pyplot 会自动在 x 轴上显示几个值
    • 好的,我做了一个完整的更正,我认为它现在可以工作了。
    【解决方案3】:

    我建议您使用 matplotlib 而不是 pandas plot,并执行以下操作以您指定的格式绘制日期:

    import matplotlib.dates as mdates
    
    from pandas.plotting import register_matplotlib_converters
    register_matplotlib_converters()
    
    myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
                                          # %b is Month abbreviated name, %Y is the Year
    
    # ... after some code
    
    fig, ax = plt.subplots(figsize=(15,8))
    
    ax.xaxis.set_major_formatter(myFmt)
    fig.autofmt_xdate()
    
    # Plot data ...
    
    ax.set_xticks("""... define how often to show the date""")
    

    您可以通过以下方式从数据框中获取数据:.to_numpy().values()

    有关set_xticks 功能,请参阅此documentation

    【讨论】:

    • 这似乎不起作用,它只显示所有年份的 Jan-01。我得到了你为格式化所做的实现,它非常好。但它仍然没有显示 x 轴上的所有值
    • 抱歉,我误读了您的请求。我更新了答案。我的方式是格式化“日”,而不是“年”。
    • 谢谢,但这不是我的问题,我想你不小心做了一天而不是一年。我面临的主要问题是在 x 轴上显示所有日期。我已经更新了问题以使其更清楚。抱歉,如果有点模棱两可。
    • 我还添加了 set_xticks 函数。试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2017-06-10
    • 2021-12-30
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多