【问题标题】:Unable to adjust x-axis DateFormat in pandas bar chart无法在熊猫条形图中调整 x 轴日期格式
【发布时间】:2013-10-24 23:49:15
【问题描述】:

我希望用 matplotlib 绘制一个熊猫时间序列对象data。对于简单的折线图data.plot(),我能够使用ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S')) 成功更改x 轴日期格式。

但是,我无法对条形图 data.plot(kind='bar') 执行相同操作。并且图表不会出现。有没有办法更改熊猫条形图的数据格式?我知道我可以使用 plt.bar 方法创建图表,但是对于更复杂的数据,我需要使用 pandas 堆积条形图。

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import pandas as pd
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
data=pd.Series(values, index=dates)

fig=figure(figsize(5,5))
ax=fig.add_subplot(111)
data.plot(kind='bar')
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S'))

【问题讨论】:

    标签: matplotlib pandas


    【解决方案1】:

    由于 Pandas 仅使用 matplotlib,您当然可以使用 matplotlib 创建一个相同的(堆叠)条形图。没有理由你只能为此使用 Pandas。

    但在这种情况下它不会有帮助。 Matplotlib 的 bar() 将 xvalues 从日期更改为浮点数,因此 DateFormatter 不再起作用。你可以通过ax.get_xticks()查看xticks。

    我不知道如何制作 xticks 日期,但您可以自己覆盖 xticklabels:

    ax.set_xticklabels([dt.strftime('%Y-%m-%d %H:%M:%S') for dt in data.index.to_pydatetime()])
    

    【讨论】:

    • 谢谢。我看到使用 ax.set_xticklabels 甚至适用于熊猫情节。
    • 这似乎不适用于已按groupby 分组的熊猫数据帧:AttributeError: 'MultiIndex' object has no attribute 'to_pydatetime'
    【解决方案2】:

    如果您已使用 groupby 对数据进行分组,那么您可以使用以下方法执行与上述答案相同的操作:

    new_ticks = []
    for dt in data.index:
        new_ticks.append(datetime.datetime(dt[0],dt[1],1))
    ax.set_xticklabels([dt.strftime('%Y-%m') for dt in new_ticks])
    

    我的数据是按月汇总和分组的,所以 index 元组只有 (2009,4) 。显然,如果您的元组有更多方面(即天、小时),那么您可以将它们添加到 datetime 函数中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2022-01-15
      • 2023-02-03
      相关资源
      最近更新 更多