使用子图时,X轴标签不显示

时间:2019-04-04 20:54:13

标签: python python-3.x pandas numpy matplotlib

即使我明确指示matplotlib绘制它们,我的x标签也不会显示在子图中。

起初,我怀疑其他图的标签被下面的子图遮盖了,所以我使用plt.tight_layout()在子图之间添加了额外的空间,但是我仍然看不到我的x标签,只有更多空格。我怀疑空白掩盖了我的标签,但我不确定。

如果我对子图阵列进行转置,则确实会出现标签,但这违反了我正在研究的要求。

import datetime as dt
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

FOR = '15'
SAT = "J02"
ranges = np.array([[-1000, 1000], [-1000, 1000]])
Final= pd.DataFrame(np.random.uniform(ranges[:, 0], ranges[:, 1], size=(30, ranges.shape[0])), columns=('In_Track','Cross_Track'))
LifeTime = pd.DataFrame(np.random.uniform(ranges[:, 0], ranges[:, 1], size=(4000, ranges.shape[0])), columns=('In_Track','Cross_Track'))
Hundred = pd.DataFrame(np.random.uniform(ranges[:, 0], ranges[:, 1], size=(300, ranges.shape[0])), columns=('In_Track','Cross_Track'))
Final.insert(0, 'd', [dt.datetime(2001,9,11)]*len(Final))
LifeTime.insert(0, 'd', [dt.datetime(2001,9,11)]*len(LifeTime))
Hundred.insert(0, 'd', [dt.datetime(2001,9,11)]*len(Hundred))

ThreePanel, (ax1a, ax2a, ax3a) = plt.subplots(nrows=3, ncols=1, sharex=False, sharey=True, figsize=(10.8, 19.2), dpi=100)
datestring="02-29-2016"
ax1a.plot(range(1, 31), Final['In_Track'], 'b-*', label='inTrack')
ax1a.plot(range(1, 31), Final['Cross_Track'], 'r-*', label=' xTrack')
yrange = [-3000,3000]
ax1a.set_ylim(yrange)
ax1a.grid(True)
ax1a.set_ylabel('Angle   ['+r'$\mu$'+ 'rad]')
ax1a.set_xlabel('FOR Scan Position')
ax1a.set_title('Geolocation Accuracy relative to VIIRS\nfor' + ' ' + SAT + ' on ' + datestring)
ax1a.legend(loc='best')
ax1b = ax1a.twinx()   # mirror them
ax1b.set_ylim(np.array(yrange)/16808. * 100.)
ax1b.set_ylabel('Percentage of FOV Size [%]')#\nfootprint semiaxes ranges from 14x14km at FOR 15 to 48x24km at FORs 1 & 30')
ax1b.set_xlabel('FOR Scan Position')

LifeTime.plot(kind='line', y='In_Track', ax=ax2a)
LifeTime.plot(kind='line', y='Cross_Track', ax=ax2a)
ax2a.set_xlabel('Date')
yrange = [-3000, 3000]
ax2a.set_ylim(yrange)
ax2a.set_ylabel('Angle   ['+r'$\mu$'+ 'rad]')
ax2a.grid(True)
ax2b = ax2a.twinx() #mirror yaxis
ax2b.set_ylim(np.array(yrange)/16808. * 100.)
ax2b.set_ylabel('Percentage of FOV Size [%]')
ax2b.axhline(y=10.7, c ='m', ls='--')
ax2b.axhline(y=-10.7, c ='m', ls='--')
DateDiff = '300 Days'
ax2a.set_title(DateDiff + ' of Geolocation Accuracy relative to VIIRS for FOR Scan Position: ' + FOR)

#ax3a = plt.subplot(3,1,3, sharex=None)
Hundred.plot(kind='line', y='In_Track', ax=ax3a)
Hundred.plot(kind='line', y='Cross_Track', ax=ax3a)
ax3a.set_xlabel('Date')
yrange = [-3000, 3000]
ax3a.set_ylim(yrange)
ax3a.set_ylabel('Angle   ['+r'$\mu$'+ 'rad]')
ax3a.grid(True)
ax3b = ax3a.twinx() #mirror yaxis
ax3b.set_ylim(np.array(yrange)/16808. * 100.)
ax3b.set_ylabel('Percentage of FOV Size [%]')
DateDiff = '100 Days'
ax3a.set_title(DateDiff + ' of Geolocation Accuracy relative to VIIRS for FOR Scan Position: ' + FOR)
ThreePanel.tight_layout(pad=0.4, w_pad=0.5, h_pad=10)

outfilename = 'Reproducible.png'
plt.savefig(outfilename)

在上面的可复制代码中,我为3个不同的子图分别设置了明确的x标签。但是,只有最底部的子图显示其x标签。

1 个答案:

答案 0 :(得分:0)

不要问我细节,但是调用数据框的plot方法会在幕后进行各种未知的格式化。如果您改用axis.plot方法绘制数据,则所有内容都会显示出来,尽管您必须更改布局设置:

# LifeTime.plot(kind='line', y='In_Track', ax=ax2a)
# LifeTime.plot(kind='line', y='Cross_Track', ax=ax2a)
ax2a.plot(LifeTime.index, LifeTime.In_Track)
ax2a.plot(LifeTime.index, LifeTime.Cross_Track)

# Hundred.plot(kind='line', y='In_Track', ax=ax3a)
# Hundred.plot(kind='line', y='Cross_Track', ax=ax3a)
ax3a.plot(Hundred.index, Hundred.In_Track)
ax3a.plot(Hundred.index, Hundred.Cross_Track)