【问题标题】:Pandas plot hide some x-axis labels熊猫图隐藏了一些 x 轴标签
【发布时间】:2018-02-22 16:21:42
【问题描述】:

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

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)

【问题讨论】:

  • 请为data 添加数据,以便您的示例可以重现。
  • 添加实际数据

标签: python pandas matplotlib


【解决方案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()

【讨论】:

    【解决方案2】:

    我认为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")))
    

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2019-10-01
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多