问题

绘制个例逐小时观测结果时,由于时间标签太长,因此再绘图时,选择了12H绘制标签:

fig2 = plt.figure(figsize=(8,8))#设置画布大小

times=wrftime

ax = fig2.add_subplot(1,1,1)

ax.plot(times,var_plot[0:121],marker='.',linestyle='-', linewidth = 0.5, label='MOSAiC', color='black')

#plt.plot(times,wrf_var[1:10],marker='o', markersize=5, linestyle='-', label='Polar-WRF', color='coral')

font1 = {'family' : 'Times New Roman',

'weight' : 'bold',

'size' : 20,

}

plt.ylabel("upward longwave flux W/m^2",font1)

plt.xlabel('Date',font1)

plt.xlim(np.min(times), np.max(times))

dates=pd.date_range(np.min(times), np.max(times),freq='12H')

#ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))

plt.xticks(dates,fontproperties='Times New Roman', size=12,weight='bold')

plt.yticks(fontproperties='Times New Roman', size=12,weight='bold')

plt.legend(loc='upper center',frameon=False)

plt.show()

看上去还行,但是不太容易看出日变化,所以想再给它的刻度弄密一点,即修改sep=1H,不过那样会造成刻度过于密集,所以研究了一下关于python Matplotlib里对于时间刻度的处理。

matplotlib.dates.DateFormatter——修改时间标签显示格式

这个功能还是比骄好用的,比如加上这行代码后,日期看上去清爽了很多:

ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))

但讲道理,把日期和时间放一起总觉得很不顺眼,我想要让它们分成两行,应该怎么做呢? 于是试着加入换行符/n,发现是有效的:

fig2 = plt.figure(figsize=(8,8))#设置画布大小

times=wrftime

ax = fig2.add_subplot(1,1,1)

ax.plot(times,var_plot[0:121],marker='.',linestyle='-', linewidth = 0.5, label='MOSAiC', color='black')

#plt.plot(times,wrf_var[1:10],marker='o', markersize=5, linestyle='-', label='Polar-WRF', color='coral')

font1 = {'family' : 'Times New Roman',

'weight' : 'bold',

'size' : 20,

}

plt.ylabel("upward longwave flux W/m^2",font1)

plt.xlabel('Date',font1)

plt.xlim(np.min(times), np.max(times))

dates=pd.date_range(np.min(times), np.max(times),freq='12H')

ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d\n%H:%M'))

plt.xticks(dates,fontproperties='Times New Roman', size=12,weight='bold')

plt.yticks(fontproperties='Times New Roman', size=12,weight='bold')

plt.legend(loc='upper center',frameon=False)

plt.show()

但还是不够顺眼,能不能同一天的只显示一个标签,而下面是它的时刻呢?

Matplotlib主副刻度与时间定位器

Matplotlib是允许设置主副刻度标签的,那么这个问题变开始变得很好解决,只要设置不同的主副刻度标签即可。 此外, Matplotlib还提供了不同的时间定位器(locator),我们将二者的结合,便可以打上需要的时间刻度标签:

plt.ylabel("upward longwave flux W/m^2",font1)

plt.xlabel('Time',font1)

plt.xlim(np.min(times), np.max(times))

dates1=pd.date_range(np.min(times), np.max(times),freq='1D')

dates2=pd.date_range(np.min(times), np.max(times),freq='6H')

day = mdates.DayLocator(interval=1)

ax.xaxis.set_major_locator(day) #设置主刻度

ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))

#设置副刻度格式

hoursLoc = mdates.HourLocator(interval=6) #为20小时为1副刻度

ax.xaxis.set_minor_locator(hoursLoc)

ax.xaxis.set_minor_formatter(mdates.DateFormatter('%H'))

#设置主刻度旋转角度和刻度label刻度间的距离pad

ax.tick_params(which='major',axis='x',length=5,pad=10,direction='in')

ax.tick_params(which='minor',axis='x',direction='in',labelsize=9)

plt.xticks(fontproperties='Times New Roman', size=12,weight='bold')

plt.yticks(fontproperties='Times New Roman', size=12,weight='bold')

plt.legend(loc='upper center',frameon=False)

plt.show()

完成,终于顺眼一点lorz

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: