【问题标题】:pandas, matplotlib, use dataframe index as axis tick labelspandas,matplotlib,使用数据框索引作为轴刻度标签
【发布时间】:2012-07-20 04:20:52
【问题描述】:

我正在使用 matplotlib 的 imshow() 函数来显示 pandas.DataFrame

我想从 DataFrame.index 和 DataFrame.columns 列表中绘制 x 轴和 y 轴的标签和刻度,但我不知道该怎么做。

假设datapandas.DataFrame

>>> print data
<class 'pandas.core.frame.DataFrame'>
Index: 201 entries,  1901 to  2101
Data columns:
jan    201  non-null values
feb    201  non-null values
mar    201  non-null values
apr    201  non-null values
may    201  non-null values
jun    201  non-null values
jul    201  non-null values
aug    201  non-null values
sep    201  non-null values
oct    201  non-null values
nov    201  non-null values
dec    201  non-null values

当我这样做时:

ax1 = fig.add_subplot(131, xticklabels=data.columns, yticklabels=data.index)
ax1.set_title("A")
ax1.tick_params(axis='both', direction='out')
im1 = ax1.imshow(data, 
                 interpolation='nearest', 
                 aspect='auto',
                 cmap=cmap )

我最终在图像的 y 轴上得到了间隔很好的刻度标签,但标签是 1901-1906 而不是 1901 到 2101。同样,x 轴刻度标签是 feb-jul 而不是 jan-dec。

如果我使用

ax1 = fig.add_subplot(131) # without specifying tick labels

然后我最终得到的轴刻度标签只是底层的 ndarray 索引值(即 0-201 和 0-12)。我不需要修改刻度和标签的间距或数量,我只希望标签文本来自 DataFrame 索引和列列表。不确定我是否遗漏了一些简单的东西?

提前致谢。

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    我认为问题与为现有刻度指定刻度标签有关。默认情况下,刻度比标签少,因此只使用前几个标签。以下应该首先设置刻度数。

    ax1 = fig.add_subplot(131)
    ax1.set_title("A")
    ax1.tick_params(axis='both', direction='out')
    ax1.set_xticks(range(len(data.columns)))
    ax1.set_xticklabels(data.columns)
    ax1.set_yticks(range(len(data.index)))
    ax1.set_yticklabels(data.index)
    im1 = ax1.imshow(data, interpolation='nearest', aspect='auto', cmap=cmap)
    

    这会在 y 轴上为每年生成一个刻度,因此您可能希望使用索引值的子集。

    【讨论】:

    • 这是最通用的解决方案 - 不需要 DateTime 黑客等。
    【解决方案2】:

    我发现最简单的方法是使用ImageGrid。这是执行此操作的代码和绘图 + here is an IPython notebook,它以更美观的格式显示它:

    mons = ['Jan',
     'Feb',
     'Mar',
     'Apr',
     'May',
     'Jun',
     'Jul',
     'Aug',
     'Sep',
     'Oct',
     'Nov',
     'Dec']
    
    # just get the first 5 for illustration purposes
    df = DataFrame(randn(201, len(mons)), columns=mons,
                   index=arange(1901, 2102))[:5]
    
    from mpl_toolkits.axes_grid1 import ImageGrid
    fig = figure(figsize=(20, 100))
    grid = ImageGrid(fig, 111, nrows_ncols=(1, 1),
                     direction='row', axes_pad=0.05, add_all=True,
                     label_mode='1', share_all=False,
                     cbar_location='right', cbar_mode='single',
                     cbar_size='10%', cbar_pad=0.05)
    
    ax = grid[0]
    ax.set_title('A', fontsize=40)
    ax.tick_params(axis='both', direction='out', labelsize=20)
    im = ax.imshow(df.values, interpolation='nearest', vmax=df.max().max(),
                   vmin=df.min().min())
    ax.cax.colorbar(im)
    ax.cax.tick_params(labelsize=20)
    ax.set_xticks(arange(df.shape[1]))
    ax.set_xticklabels(mons)
    ax.set_yticks(arange(df.shape[0]))
    ax.set_yticklabels(df.index)
    

    【讨论】:

      【解决方案3】:

      作为一般解决方案,我发现以下方法是将 Pandas datetime64 索引引入 matplotlib 轴标签的简单方法。

      首先,通过将 pandas datetime64 索引转换为 Python datetime.datetime 类来创建一个新系列。

      new_series = your_pandas_dataframe.index.to_pydatetime()

      现在您拥有了 matplotlib.dates 的所有功能。在绘图之前,将 matplotlib.dates 导入为 mdates 并声明以下变量:

      years = mdates.YearLocator()   
      months = mdates.MonthLocator()  
      days = mdates.DayLocator()
      hours = mdates.HourLocator(12) #if you want ticks every 12 hrs, you can pass 12 to this function
      minutes = mdates.MinuteLocator() 
      daysFmt = mdates.DateFormatter('%m/%d') #or whatever format you want
      

      现在,使用 new_series 作为 x 轴来制作绘图:

      fig1 = plt.figure()
      ax = fig1.add_subplot(111)
      ax.plot(new_series,your_pandas_dataframe)
      

      您可以使用上面声明的 mdates 函数来调整标签和刻度以使您满意,例如:

      ax.xaxis.set_major_locator(days)
      ax.xaxis.set_major_formatter(daysFmt)
      ax.xaxis.set_minor_locator(hours)
      

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 2015-10-14
        • 2012-03-14
        • 2013-03-24
        • 2014-04-16
        • 2019-05-21
        • 2017-01-07
        • 2017-08-18
        • 2016-10-09
        相关资源
        最近更新 更多