我有一个字典,其中键是日期,值是整数。我想用零填充缺少的日期并绘制它。这是我到目前为止所做的事情。
data = {datetime.date(2018, 1, 26): 1, datetime.date(2018, 1, 18): 1, datetime.date(2018, 1, 11): 4, datetime.date(2017, 12, 31): 2, datetime.date(2018, 1, 14): 1, datetime.date(2018, 1, 9): 2, datetime.date(2018, 1, 7): 1, datetime.date(2018, 1, 16): 2, datetime.date(2018, 1, 15): 2, datetime.date(2018, 1, 10): 1, datetime.date(2018, 1, 5): 1, datetime.date(2018, 1, 13): 3}
dates = pd.date_range('2018-01-01', date.today())
data = pd.Series(data=data)
data = data.reindex(dates, fill_value=0)
fig, ax = plt.subplots(figsize=(15, 7))
data.plot(kind='bar', ax=ax)
plt.xticks(rotation=45)
plt.gca().xaxis.set_major_formatter(plt.FixedFormatter(data.index.to_series().dt.strftime("%b %d")))
我遇到的问题是现在x轴上塞满了太多的日期标签。我怎样才能显示图表上的所有点,但只标记x轴上一半的刻度?
编辑:潜在解决方案:
我可以通过添加以下代码跳过每个第二个x轴标签:
xticks = ax.xaxis.get_major_ticks()
for i in range(0, len(xticks)):
if i % 2 != 0:
xticks[i].label1.set_visible(False)
答案 0 :(得分:1)
当您需要自定义轴时使用pd.plot
它有点复杂。最后,pandas
会调用matplotlib
,因此您可以执行以下操作:
from datetime import date
from matplotlib import dates
data = {datetime.date(2018, 1, 26): 1,
datetime.date(2018, 1, 18): 1,
datetime.date(2018, 1, 11): 4,
datetime.date(2017, 12, 31): 2,
datetime.date(2018, 1, 14): 1,
datetime.date(2018, 1, 9): 2,
datetime.date(2018, 1, 7): 1,
datetime.date(2018, 1, 16): 2,
datetime.date(2018, 1, 15): 2,
datetime.date(2018, 1, 10): 1,
datetime.date(2018, 1, 5): 1,
datetime.date(2018, 1, 13): 3}
dates_ = pd.date_range('2018-01-01', date.today()).to_pydatetime()
data = pd.Series(data=data)
data = data.reindex(dates_, fill_value=0)
fig, ax = plt.subplots(figsize=(15, 7))
ax.bar(data.index, data.values)
ax.xaxis.set_major_locator(dates.DayLocator(bymonthday=range(1,32),interval=2))
ax.xaxis.set_major_formatter(dates.DateFormatter('%b\n\n%d'))
ax.xaxis.set_minor_locator(dates.DayLocator(bymonthday=range(1,32),
interval=1))
plt.show()
答案 1 :(得分:0)
我认为Series.fillna()
会这样做:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.fillna.html
您的脚本将如此:
data = <my dictionary>
dates = pd.date_range('2018-01-01', date.today())
data = pd.Series(data=data)
data = data.fillna(0, inplace=True)
fig, ax = plt.subplots(figsize=(15, 7))
data.plot(kind='bar', ax=ax)
plt.xticks(rotation=45)
plt.gca().xaxis.set_major_formatter(plt.FixedFormatter(data.index.to_series().dt.strftime("%b %d")))