python - 如何在 matplotlib 中为 Pandas 的 DatetimeIndex 自定义 xaxis 刻度?
问题描述
我有一个像这样的熊猫数据框data
;
num
Date
2020-03-01 311
2020-03-08 432
2020-03-15 420
2020-03-22 304
2020-03-29 1030
2020-04-05 1497
2020-04-12 2259
2020-04-19 1938
Date
在哪里DatetimeIndex
。我试图将其绘制如下;
from matplotlib import pyplot as plt
x = data.index
fig = plt.figure()
ax1 = fig.add_subplot(111)
tested_plot = ax1.bar(x, data["num"])
dates_fmt = mdates.DateFormatter('%m/%d')
ax1.xaxis.set_major_formatter(dates_fmt)
plt.show()
我希望 xaxis 中的刻度显示在条存在的位置(如 3/1、3/8、...、4/12、4/19)。但是当我绘制上面的图时,四月开始时会重置刻度,并且条形和刻度不对应;
我知道我可以转换DatetimeIndex
为Index
字符串使用strftime
这将解决问题,但我想保留DatetimeIndex
进一步定制。我也用过
import matplotlib.dates as mdates
ax1.xaxis.set_major_locator(mdates.DayLocator(interval=7))
强制刻度相隔一周,但是我无法设置刻度的开始日期,现在刻度上没有条形。有人知道如何解决这个问题吗?
解决方案
你可以试试pandas.DataFrame.plot
和matplotlib.axes.Axes.set_xticklabels
。在该set_xticklabels
方法中,您可以根据需要格式化日期(此处使用pandas.Series.dt.strftime
):
df.plot(kind="bar", ax=ax1)
ax1.set_xticklabels([date.strftime("%Y-%m-%d") for date in df.index],
rotation=45)
完整代码
# Be sure dates are datetime objects
# df["Date"] = pd.to_datetime(df["Date"])
# df.set_index("Date", inplace=True)
print(df)
# num
# Date
# 2020-03-01 311
# 2020-03-08 432
# 2020-03-15 420
# 2020-03-22 304
# 2020-03-29 1030
# 2020-04-05 1497
# 2020-04-12 2259
# 2020-04-19 1938
fig = plt.figure()
ax1 = fig.add_subplot(111)
df.plot(kind="bar", ax=ax1)
ax1.set_xticklabels([date.strftime("%Y-%m-%d") for date in df.index],
rotation=45)
plt.show()
输出
推荐阅读
- sqlite - 将日期字符串 dd/mm/yyyy 格式化为 yyyy-mm-dd
- bitbucket - How to use 2-factor auth with Bitbucket API
- php - What is the name of "::" in PHP?
- rust - 假设两个可变引用不能别名,为什么 Rust 编译器不优化代码?
- regex - 带有正则表达式的 grep-bash 命令返回 0 个结果,正在寻找替代方案
- javascript - Auth0 忽略范围选项
- angular - Calling ngZone.runTask in ngZone.runOutsideAngular still triggering change detection in other components
- python - SQLite Query in Python returns empty results
- vue.js - Vuex Watch 动态变化值
- flutter - 如何解决 - 列表中最初没有显示任何项目,同时使用 TextField 进行搜索,直到在 Flutter 中输入任何内容?