pandas,matplotlib,使用数据框索引作为轴刻度标签

tbc*_*tbc 8 python matplotlib pandas

我正在使用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
Run Code Online (Sandbox Code Playgroud)

当我这样做:

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 )
Run Code Online (Sandbox Code Playgroud)

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

如果我使用

ax1 = fig.add_subplot(131) # without specifying tick labels
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

zar*_*hur 6

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

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)
Run Code Online (Sandbox Code Playgroud)

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


PJW*_*PJW 5

作为一般解决方案,我发现以下方法是将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
Run Code Online (Sandbox Code Playgroud)

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

fig1 = plt.figure()
ax = fig1.add_subplot(111)
ax.plot(new_series,your_pandas_dataframe)
Run Code Online (Sandbox Code Playgroud)

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

ax.xaxis.set_major_locator(days)
ax.xaxis.set_major_formatter(daysFmt)
ax.xaxis.set_minor_locator(hours)
Run Code Online (Sandbox Code Playgroud)