【问题标题】:pandas .plot() x-axis tick frequency -- how can I show more ticks?pandas .p​​lot() x 轴刻度频率——如何显示更多刻度?
【发布时间】:2017-02-04 11:58:20
【问题描述】:

我正在使用 pandas .p​​lot() 绘制时间序列,并希望看到每个月都显示为 x-tick。

这是数据集结构

这是 .plot() 的结果

我试图使用其他帖子和 matplotlib documentation 中的示例并做类似的事情

ax.xaxis.set_major_locator(
   dates.MonthLocator(revenue_pivot.index, bymonthday=1,interval=1))

但这删除了所有的刻度:(

我也尝试过xticks = df.index,但没有任何改变。

在 x 轴上显示更多刻度的正确方法是什么?

【问题讨论】:

  • 您是否将日期解析为日期时间?
  • @DemetriP 谢谢。看起来这至少是问题的一部分。现在在使用 ax.xaxis.set_major_locator 之后,我确实看到了滴答声……唯一的问题是现在我每年只看到一个滴答声。我显然使用 MonthLocator 错误。

标签: pandas datetime matplotlib time-series


【解决方案1】:

无需将任何参数传递给MonthLocator。确保根据@Rotkiv 的回答在df.plot() 调用中使用x_compat

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates

df = pd.DataFrame(np.random.rand(100,2), index=pd.date_range('1-1-2018', periods=100))
ax = df.plot(x_compat=True)
ax.xaxis.set_major_locator(mdates.MonthLocator())
plt.show()
  • set_major_locator格式化x轴

  • 未格式化的 x 轴

【讨论】:

    【解决方案2】:

    您还可以使用 pandas Timestamp 对象的属性“手动”格式化 pandas DateTimeIndex 的 x 轴刻度和标签。

    我发现这比使用来自 matplotlib.dates 的定位器要容易得多,后者适用于除 pandas 之外的其他日期时间格式(如果我没记错的话),因此如果日期没有相应地转换,有时会出现奇怪的行为。

    这是一个通用示例,根据 pandas Timestamp 对象的属性将每个月的第一天显示为标签:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    # data
    dim = 8760
    idx = pd.date_range('1/1/2000 00:00:00', freq='h', periods=dim)
    df = pd.DataFrame(np.random.randn(dim, 2), index=idx)
    
    # select tick positions based on timestamp attribute logic. see:
    # https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Timestamp.html
    positions = [p for p in df.index
                 if p.hour == 0
                 and p.is_month_start
                 and p.month in range(1, 13, 1)]
    # for date formatting, see:
    # https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
    labels = [l.strftime('%m-%d') for l in positions]
    
    # plot with adjusted labels
    ax = df.plot(kind='line', grid=True)
    ax.set_xlabel('Time (h)')
    ax.set_ylabel('Foo (Bar)')
    ax.set_xticks(positions)
    ax.set_xticklabels(labels)
    
    plt.show()
    

    产量:

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      描述here的正确方法 使用 x_compat 参数,可以抑制自动刻度分辨率调整

      df.A.plot(x_compat=True)

      【讨论】:

      • 对我不起作用。 Python 3.6,熊猫 0.19.2。知道为什么吗?
      • 我都不是,python 3.6 和 pandas 0.22
      • @seanysull 使用准确的信息进行修复应该非常简单。不幸的是,这个问题没有MCVE,因此很难判断您的数据框等是否设置与 OP 相同(正如 OP 自己回答的那样,他们可能在“幕后”做了一些解决问题的事情)。我个人会问另一个问题,链接到这个问题,解释为什么这对你不起作用。
      【解决方案4】:

      如果只想显示更多的刻度,还可以深入了解pd.plotting._converter的结构:

      dai = ax.xaxis.minor.formatter.plot_obj.date_axis_info
      dai['fmt'][dai['fmt'] == b''] = b'%b'
      

      绘图后,formatterTimeSeries_DateFormatter 并且 _set_default_format 已被调用,因此 self.plot_obj.date_axis_info is not None。您现在可以根据自己的喜好操作结构化数组.date_axis_info,即包含更少的b'' 和更多的b'%b'

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多