将格式应用于Jupyter笔记本中的所有子图

时间:2017-07-06 19:30:17

标签: python pandas plot seaborn

在Jupyter Notebook中绘制具有不同时间分辨率(每小时,每天,每月)的3个pandas数据帧时,我想对所有三个子图表应用一致的格式,仅显示月份而非年份(即1月,2月,3月和不是2010年1月,2010年2月,2010年3月)。

问题:如何在所有子图中应用格式?

导入库

import matplotlib
import matplotlib.dates
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import seaborn as sns
%matplotlib inline

创建3个数据帧

hourly = pd.DataFrame({'val': np.random.rand(24*365)}, index=pd.date_range('2010-01-01', '2010-12-31 23:00', freq='1H'))
daily = pd.DataFrame({'val': np.random.rand(365)}, index=pd.date_range('2010-01-01', '2010-12-31 23:00', freq='1D'))
monthly = pd.DataFrame({'val': np.random.rand(12)}, index=pd.date_range('2010-01-01', '2010-12-31 23:00', freq='1M'))

将格式绘制并应用于三个子图

def plot2(hourly, daily, monthly):
    f, ax = plt.subplots(3, 1, sharex = False, figsize=(16, 14))
    hourly[['val']].plot(ax=ax[0], legend=False)
    daily[['val']].plot(ax=ax[1], legend=False)
    monthly[['val']].plot(ax=ax[2], legend=False)

    for axA in ax:
        month = matplotlib.dates.MonthLocator()
        monthFmt = matplotlib.dates.DateFormatter('%b')
        axA.xaxis.set_major_locator(month)
        axA.xaxis.set_major_formatter(monthFmt)
        for item in axA.get_xticklabels():
            item.set_rotation(0)

    sns.despine()
    plt.tight_layout()
    return f, ax

plot2(hourly, daily, monthly)

结果图显示了第二个和第三个图的所需格式,但不是第一个图。 Figure showing the first plot is not formatted properly, but the second and third plots are formatted properly

我正在使用Python 3.5

1 个答案:

答案 0 :(得分:0)

好像熊猫有一些问题。使用matplolib可以更好地工作:

def plot2(hourly, daily, monthly):
    f, ax = plt.subplots(3, 1, sharex = False, figsize=(16, 14))
    ax[0].plot(hourly.index, hourly[['val']])
    ax[1].plot(daily.index, daily[['val']])
    ax[2].plot(monthly.index, monthly[['val']])

    for axA in ax[::-1]:
        month = matplotlib.dates.MonthLocator()
        monthFmt = matplotlib.dates.DateFormatter('%b')
        axA.xaxis.set_major_locator(month)
        axA.xaxis.set_major_formatter(monthFmt)
        for item in axA.get_xticklabels():
            item.set_rotation(0)

    sns.despine()
    plt.tight_layout()
    return f, ax

enter image description here