使用 pandas 将时间序列绘制为条形图会导致年份不正确

问题描述 投票:0回答:1

我有以下数据框(除了我的实际数据超过 25 年):

import pandas as pd


df = pd.DataFrame(
    dict(
        date=pd.date_range(start="2020-01-01", end="2020-12-31", freq="MS"),
        data=[1,2,3,4,5,6,7,8,9,10,11,12]
    ), 
)
df

输出:

    date    data
0   2020-01-01  1
1   2020-02-01  2
2   2020-03-01  3
3   2020-04-01  4
4   2020-05-01  5
5   2020-06-01  6
6   2020-07-01  7
7   2020-08-01  8
8   2020-09-01  9
9   2020-10-01  10
10  2020-11-01  11
11  2020-12-01  12

我使用 matplotlib 和 pandas 默认绘图得到了不同的结果:

import matplotlib as mpl
import matplotlib.dates as mdates
import matplotlib.pyplot as plt


fig = mpl.figure.Figure(constrained_layout=True)
axs = fig.subplot_mosaic("ac;bd")

ax = axs["a"]
ax.bar(x="date", height="data", data=df, width=15)

ax = axs["b"]
ax.bar(x="date", height="data", data=df, width=15)

locator = mdates.AutoDateLocator(minticks=12, maxticks=24)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

ax = axs["c"]
df.plot.bar(x="date", y="data", ax=ax, legend=False)

ax = axs["d"]

df.plot.bar(x="date", y="data", ax=ax, legend=False, ) # incorrect year -> 1970 instead of 2020

locator = mdates.AutoDateLocator(minticks=12, maxticks=24)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

for k, ax in axs.items():
    for label in ax.get_xticklabels():
        label.set_rotation(40)
        label.set_horizontalalignment('right')

fig

输出:

enter image description here

我希望能够使用 pandas 进行绘图,然后适当地设置刻度格式以供发布准备绘图。但是,在使用 pandas 时,我似乎丢失了日期时间信息或得到了错误的年份。

有没有一种方法可以使用

mdates
功能来格式化轴刻度标签而不直接使用数据?即,如果我对数据重新采样,或者在不同的年份进行切片,我希望轴能够自动反映这一点。


这是我遇到的问题的更简单说明:

import matplotlib as mpl
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
fig = mpl.figure.Figure(constrained_layout=True)
axs = fig.subplot_mosaic("a")

ax = axs["a"]

df.plot.bar(x="date", y="data", ax=ax, legend=False) # incorrect year -> 1970 instead of 2020

formatter = mdates.DateFormatter("%Y - %b")
ax.xaxis.set_major_formatter(formatter)

fig

enter image description here

使用时日期全错了

DateFormatter

python pandas dataframe matplotlib plot
1个回答
0
投票

当您使用条形图时,x 坐标变为 0、1、2、3 等。这就是为什么

mdates.DateFormatter
返回 1970,因为它将这些坐标视为自纪元时间以来的秒数。

您可以手动设置刻度标签:

ax.set_xticklabels(df["date"].dt.strftime("%Y - %b"))
© www.soinside.com 2019 - 2024. All rights reserved.