python - 使用 mdates 和 matplotlib 将 x 轴设置为日期

标签 python pandas matplotlib seaborn

我正在加载这些包:

import pandas as pd
from matplotlib import pyplot as plt
import numpy
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib
import matplotlib.dates as mdates
sns.set()
%matplotlib inline

我有一个数据框df,看起来像这样

df['element_date'] = pd.to_datetime(df['element_date'])
df['mdate'] = [mdates.date2num(d) for d in df['element_date']]
df.head()

id            Tier    element     element_date           mdate
5228039     Tier B      4      2018-05-28 10:59:00  736842.457639
5232263     Tier B      3      2018-05-28 10:59:00  736842.457639
5245478     Tier B      EA     2018-05-27 13:58:00  736841.581944
4975552     Tier B      2      2018-05-30 21:01:00  736844.875694
4975563     Tier A      2      2018-05-30 21:01:00  736844.875694

我试图将计数图的 x 轴仅设置为月份和日期,但收到一条错误消息。这是我正在运行的代码(我已删除命名标签以节省空间):

fig, ax = plt.subplots(figsize=(15,10))
fig = sns.countplot(x="mdate", hue="element", data=df)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
plt.show(fig)

我收到DateFormatter 发现值 x=0,这是非法日期。这通常是因为您没有通知轴它正在绘制日期,例如使用 ax.xaxis_date()

现在,我当然尝试添加ax.xaxis_date(),但没有成功。我也没有等于 0 的 x 值。我已经删除了 NA,并且值计数为 mdate,并且没有找到 0。

我在这里查看了一堆不同的答案,但似乎无法找到解决方案。我尝试过使用 element_date 作为我的日期时间值,以及使用 mdate 来使用“mathplotlib”日期。

任何想法将不胜感激。本质上,我只是想让我的 x 轴成为两个月内一系列有序的日期,并为每个日期计算元素。

谢谢!

最佳答案

在 GitHub pandas 问题页面上,用户 @pawaller 发现了一个 workaround使用 plt.FixedFormatter 在其中对日期时间数据帧列进行字符串格式。

ax.xaxis.set_major_formatter(plt.FixedFormatter(df['element_date'].dt.strftime("%m-%d")))

但是,使用上面的方法并不会立即起作用,因为值标签乱序且未正确对齐。因此,需要 unique()sort_values():

x_dates = df['element_date'].dt.strftime('%m-%d').sort_values().unique()
ax.xaxis.set_major_formatter(plt.FixedFormatter(x_dates))

下面进行演示(其中 mdate 列从未使用过):

数据

from io import StringIO
...

txt = '''id            Tier    element     element_date           mdate
5228039     "Tier B"      4      "2018-05-28 10:59:00"  736842.457639
5232263     "Tier B"      3      "2018-05-28 10:59:00"  736842.457639
5245478     "Tier B"      EA     "2018-05-27 13:58:00"  736841.581944
4975552     "Tier B"      2      "2018-05-30 21:01:00"  736844.875694
4975563     "Tier A"      2      "2018-05-30 21:01:00"  736844.875694'''

df = pd.read_table(StringIO(txt), sep="\s+", parse_dates=[3])

情节

fig, ax = plt.subplots(figsize=(13,4))

fig = sns.countplot(x="element_date", hue="element", data=df, ax=ax)

x_dates = df['element_date'].dt.strftime('%m-%d').sort_values().unique()
ax.xaxis.set_major_formatter(plt.FixedFormatter(x_dates))

plt.legend(loc='upper left')
plt.show()
plt.close()

Plot Output

关于python - 使用 mdates 和 matplotlib 将 x 轴设置为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702150/

相关文章:

python - 获取每个组的前 n 个条目,其中每个组的 n 不同

C++中的python linspace

python - 如何检测并绘制 asc 文件的强度

Python 分析处方数据集 - 循环提前终止,并且没有输出文件

python - 将 pandas dataframe 列从十六进制字符串转换为 int

python - 识别 python pandas 中的重复对

Python:将字符串数组转换为数据框中的int数组

python - 使用 pandas 和 scipy 的树状图

python - 使用 matplotlib 更改 3D 散点图的默认颜色条

python - 在 matplotlib 绘图上操作和动画图像