熊猫图隐藏了一些x轴标签

时间:2018-02-22 16:21:43

标签: python pandas matplotlib

我有一个字典,其中键是日期,值是整数。我想用零填充缺少的日期并绘制它。这是我到目前为止所做的事情。

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)

2 个答案:

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

enter image description here

答案 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")))