Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带有matplotlib的mdates将x轴设置为日期_Python_Pandas_Matplotlib_Seaborn - Fatal编程技术网

Python 使用带有matplotlib的mdates将x轴设置为日期

Python 使用带有matplotlib的mdates将x轴设置为日期,python,pandas,matplotlib,seaborn,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'

我正在加载这些包:

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轴设置为仅月份和日期,但收到一条错误消息。这是我正在运行的代码(为了节省空间,我删除了命名标签):

我发现
DateFormatter发现了一个x=0的值,这是一个非法的日期。这通常是因为您没有通知轴它正在打印日期,例如,使用ax.xaxis_date()

现在,我当然尝试添加了
ax.xaxis\u date()
,但没有成功。我也没有等于0的x值。我已经删除了NA和value counted mdate,但找不到0

我在这里看到了许多不同的答案,但似乎找不到解决方案。我尝试了使用
element\u date
作为日期时间值,以及使用
mdate
使用“mathplotlib”日期

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


谢谢

用户@pawaller在一个GitHub页面上找到了一个使用
plt.FixedFormatter
的字符串格式,您可以在其中设置datetime数据帧列的格式

ax.xaxis.set_major_formatter(plt.FixedFormatter(df['element_date'].dt.strftime("%m-%d")))
但是,使用上述方法并不能立即起作用,因为值标签顺序混乱且未正确对齐。因此,
unique()
sort\u值()
是必需的:

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()

countplot
是一种分类图。类别0是
736841.581944
,类别1是
736842.457639
等。因此不能在由
0,1,2,3等组成的轴上使用日期格式化程序。我想如果你想在轴上有日期,你想要一个数字条形图吗?在这种情况下,请使用
plt.bar
。有趣的是,当我使用相同的数据制作条形图时,我可以将我的x值设置为mdate,但只要我尝试使用以下格式进行格式化:
ax.xaxis.set\u major\u formatter(mdates.DateFormatter(“%m-%d”)
,我就会收到相同的错误消息。不,在使用
plt.bar
时,您无法收到此错误消息,除非你也尝试在同一个轴上绘制其他东西。
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()