气象绘图加强版(二十五)——辅助线型

本节提要:主要讲解matplotlib日常绘制中常用的辅助线型系统。



在使用matplotlib绘制数据分析图时,时常需要针对各种统计数据要求或者美观醒目的要求,添加各种线型,如距平线、突出框等。这里我们简单选择几种常见的美化线型。
一、水平线
这种线最常见的应用即是距平线。这里我们使用axhline 命令添加水平距平线。这个命令的本质是绘图命令中的plot命令。主要关键词与plot内部相似,必备参数y表示需要添加的水平线所在的位置。
fig=plt.figure(figsize=(4,3),dpi=550)ax=fig.add_axes([0,0,1,1])ax.plot(np.arange(0,30+31,1),df['日降水量(mm)'][0:30+31],lw=1,c='k',label='2018')ax.plot(np.arange(0,30+31,1),df['日降水量(mm)'][30+31:30+31+31+30],lw=1,c='tab:blue',label='2019')ax.plot(np.arange(0,30+31,1),df['日降水量(mm)'][30+31+31+30:],lw=1,c='tab:orange',label='2020')ax.legend()ax.set_xlabel('日期')ax.set_ylabel('降雨量(mm)')ax.axhline(y=30,c='r',ls='-',lw=1)ax.text(-1,31,'30mm',color='r')
二、垂直线
与水平线对应的线,由于气象数据的特殊性,与横线相比出现几率较小。其命令是axhline。
三、水平贯穿矩形标记
可调用的矩形标记,默认表现为贯穿整个子图系统,但是可以修改参数调节位置。其本质是polygon。可调用polygon的参数进行美化。其命令为axhspan。
ax.axhspan(0,9.9,facecolor='#A6F28F')ax.axhspan(9.9,25,facecolor='#3DBA3D')ax.axhspan(25,50,facecolor='#61BBFF')ax.axhspan(50,100,facecolor='#0000FF')ax.axhspan(100,250,facecolor='#FA00FA')
四、垂直贯穿矩形标记
与水平贯穿矩形标记类似,其命令为axvspan。
ax.axvspan(20,40,facecolor='grey')
五、Polygon
通过调用Polygon来添加任意的辅助图块。
from matplotlib.patches import Rectanglerectangle=Rectangle([-10,0],90,50,facecolor='tab:blue',                    alpha=0.75,                    edgecolor='tab:blue',                    lw=0.3,ls='-')ax.add_patch(rectangle)
六、跨图穿越矩形
这是我在很久以前看到的一幅图,十分炫技,所以一直想仿制一下。最重要的部件是在matplotlib.patches中的ConnectionPatch,这个功能可以让我们在不同的子图之间进行贯穿绘制。该命令的本质是plot。可以用plot的参数进行美化。这里我只是简要的仿制了一下,比原图观赏性差,姑妄看之。
import matplotlib.pyplot as pltimport pandas as pdimport matplotlib.ticker as mtickerimport numpy as npfrom matplotlib.patches import ConnectionPatchplt.rcParams['font.sans-serif']=['FangSong']filepath=r'C:\Users\lenovo\Desktop\2018-2020降水特征.xlsx'df=pd.read_excel(filepath)fig=plt.figure(figsize=(4,4),dpi=550)ax1=fig.add_axes([0,0,1,0.33],zorder=1)ax2=fig.add_axes([0,0.33,1,0.33],zorder=1)ax3=fig.add_axes([0,0.66,1,0.33],zorder=0)ax1.plot(np.arange(0,30+31,1),df['日降水量(mm)'][0:30+31],lw=1,c='purple')ax2.plot(np.arange(0,30+31,1),df['日降水量(mm)'][30+31:30+31+31+30],lw=1,c='tab:blue')ax3.plot(np.arange(0,30+31,1),df['日降水量(mm)'][30+31+31+30:],lw=1,c='tab:orange')########################################################################ax3.set_xticks(np.arange(0,61,30))ax3.xaxis.tick_top()ax3.spines['left'].set_bounds(25,125)ax3.spines['top'].set_bounds(0,60)ax3.spines['right'].set_visible(False)ax3.spines['bottom'].set_visible(False)ax3.yaxis.set_major_locator(mticker.FixedLocator([25,50,75,100,125]))ax3.tick_params(axis='y',which='major',direction='in')#######################################################################ax2.spines['top'].set_visible(False)ax2.spines['left'].set_visible(False)ax2.spines['right'].set_bounds(0,40)ax2.yaxis.set_major_locator(mticker.FixedLocator([0,20,40]))ax2.tick_params(axis='y',which='major',direction='in')ax2.yaxis.set_ticks_position('right')ax2.set_xticks([])ax2.spines['bottom'].set_visible(False)####################################################################ax1.spines['top'].set_visible(False)ax1.spines['right'].set_visible(False)ax1.spines['left'].set_bounds(0,30)ax1.yaxis.set_major_locator(mticker.FixedLocator([0,10,20,30]))ax1.tick_params(axis='y',which='major',direction='in')ax1.set_xlabel('日期')ax1.set_xticks([0,30,60])ax1.set_xticklabels(['6月1日','7月1日','8月1日'])ax1.spines['bottom'].set_bounds(0,60)##################################################################con = ConnectionPatch(xyA=(20,-1.9), coordsA=ax1.transData, xyB=(20,148), coordsB=ax3.transData)con.set_color('grey')ax3.add_artist(con)con.set_linewidth(50)con.set_capstyle('butt')con.set_alpha(0.5)#################################################################con2 = ConnectionPatch(xyA=(50,-1.9), coordsA=ax1.transData, xyB=(50,148), coordsB=ax3.transData)con2.set_color('grey')ax3.add_artist(con2)con2.set_linewidth(50)con2.set_capstyle('butt')con2.set_alpha(0.5)for ax in[ax1,ax2]: ax.patch.set_visible(False)################################################ax3.set_ylabel('降雨量')ax2.text(68,20,'降雨量',rotation=90)ax1.set_ylabel('降雨量')plt.show()
(0)

相关推荐