版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Python數(shù)據(jù)可視化第5章Matplotlib繪圖高階設(shè)置教師:xxx2024.07第1節(jié)
坐標(biāo)軸和刻度第5章Matplotlib繪圖高階設(shè)置第2節(jié)
軸的高階應(yīng)用第3節(jié)
圖表配色第4節(jié)
文本屬性設(shè)置圖形中的坐標(biāo)軸常常需要微調(diào)。二維圖形有x軸和y軸,每個(gè)軸可以單獨(dú)設(shè)置屬性,如軸標(biāo)簽、刻度位置、刻度標(biāo)簽、軸自身的位置及外觀等。第1節(jié)
坐標(biāo)軸和刻度一、
軸標(biāo)簽軸標(biāo)簽是軸最重要的屬性,說明該軸對應(yīng)何種數(shù)據(jù)。其設(shè)置命令為plt.xlabel()/plt.ylabel()或ax.set_xlabel()/ax.set_ylabel()importnumpyasnpimportmatplotlib.pyplotasplt a=np.arange(0,5,0.02)plt.plot(a,np.sin(2*np.pi*a),'r-.')plt.xlabel('橫軸:時(shí)間',fontproperties='SimHei',fontsize=18)
#黑體
plt.ylabel('縱軸:振幅',fontproperties='Simsun',labelpad=5,fontsize=18)#宋體
一、
軸標(biāo)簽標(biāo)題和軸標(biāo)簽的文本框效果通過設(shè)置關(guān)鍵字參數(shù)bbox實(shí)現(xiàn),該參數(shù)接收字典類型的值。#奧運(yùn)五環(huán),設(shè)置文本框fig=plt.figure(figsize=(4,4),dpi=100)ax=fig.add_subplot(111)x1=np.linspace(-1,1,100)y1=(1-x1**2)**0.5forpin[-1.5,0,1.5]: #上面的三個(gè)環(huán),每個(gè)環(huán)由上下半圓構(gòu)成ax.plot(x1+p,y1) #上半圓ax.plot(x1+p,-y1) #下半圓forpin[1,-1]: #下面的兩個(gè)環(huán)ax.plot(x1+p,y1-1)ax.plot(x1+p,-y1-1)x=np.linspace(-5,5,5000)y=np.random.uniform(-4,4,5000)一、
軸標(biāo)簽方法set_label_coords()用于設(shè)置文本的位置,位置參數(shù)采用相對Axes的坐標(biāo),將寬和高均視為1進(jìn)行標(biāo)準(zhǔn)化,例如坐標(biāo)(0.5,0.3)表示在x軸50%及y軸30%處。數(shù)值如取負(fù)值則在坐標(biāo)軸的反方向,例如(-0.05,0.03)表示在x軸負(fù)向5%及y軸正向3%處。ax.scatter(x,y,c='y',marker='*',s=100,alpha=0.1)#放大的散點(diǎn)作為背景ax.set_xlim(-3,3) #x軸刻度范圍ax.set_ylim(-3,3)box=dict(facecolor='#6959CD',pad=2,alpha=0.4)#文本框?qū)傩?,字典格式ax.set_xlabel('x軸',fontsize=18,bbox=box)ax.set_ylabel('y軸',fontsize=18,bbox=box)ax.yaxis.set_label_coords(-0.08,0.5)#設(shè)置y軸標(biāo)簽位置ax.xaxis.set_label_coords(1.0,-0.05)ax.set_title('奧運(yùn)五環(huán)',fontsize=20,va='bottom',bbox=box)fig=plt.figure(figsize=(10,4))t=np.arange(0.0,12*np.pi,0.01)x=np.sin(t)*(np.e**np.cos(t)-2*np.cos(4*t)-np.sin(t/12)**5)y=-np.cos(t)*(np.e**np.cos(t)-2*np.cos(4*t)-np.sin(t/12)**5)ax1=fig.add_subplot(131)plt.plot(x,y,color='r')plt.title('圖1默認(rèn)軸范圍',fontsize=16)ax2=fig.add_subplot(132)plt.plot(x,y,color='m')plt.xlim(-6,6)#設(shè)置x軸范圍plt.ylim(-6,6)#設(shè)置y軸范圍plt.title('圖2指定軸范圍為6',fontsize=16)ax3=fig.add_subplot(133)plt.plot(x,y,color='m')plt.axis([-1,1,-1,1])#同時(shí)設(shè)置x和y軸范圍plt.title('圖3指定軸范圍為1',fontsize=16)
二、
軸范圍繪圖時(shí)坐標(biāo)軸顯示的數(shù)據(jù)范圍一般會根據(jù)繪圖數(shù)據(jù)自動(dòng)設(shè)定,但有時(shí)需要做一些調(diào)整。圖形太靠近邊框可增大軸的范圍,圖形留白太多可縮小軸的范圍。設(shè)置軸范圍使用plt.xlim()/plt.ylim()/plt.axis()或ax.set_xlim()/ax.set_ylim()命令。軸刻度作為圖形的一部分,由刻度線和刻度標(biāo)簽組成。繪圖時(shí)plt會根據(jù)數(shù)據(jù)的特征顯示合適的軸刻度線和刻度標(biāo)簽。數(shù)據(jù)量很少時(shí),刻度標(biāo)簽可能和每個(gè)數(shù)據(jù)對應(yīng),數(shù)據(jù)量很大時(shí),就會若干個(gè)數(shù)據(jù)才標(biāo)注一個(gè)刻度。設(shè)置軸刻度使用plt.xticks()/plt.yticks()或ax.set_xticks()/ax.set_yticks()等方法。x=np.linspace(0,4,1000)x_tick=np.arange(-1.5,2.0,0.5) #x軸刻度y_tick=np.arange(-1.5,3.0,0.5)y=(x**(2/3))+0.9*((3.3-x**2)**0.5)*np.sin(31.41593*x)plt.plot(x,y,lw=3,c='r',label='heart')plt.plot(-x,y,lw=3,c='black')plt.xticks(x_tick,labels=list('ABCDEFG'),fontsize=14) #設(shè)置x軸刻度標(biāo)簽plt.yticks(y_tick,labels=list('abcdefghi'),fontsize=14) #設(shè)置y軸刻度標(biāo)簽plt.title('刻度標(biāo)簽修改',fontsize=16) 三、軸刻度坐標(biāo)軸的高階應(yīng)用有:設(shè)置主刻度和次刻度、繪制雙Y軸圖形、子圖間共享坐標(biāo)軸等。第2節(jié)
軸的高階應(yīng)用一、坐標(biāo)軸的刻度樣式刻度由刻度標(biāo)簽和刻度線組成,可用下面的命令設(shè)置刻度格式。ax.tick_params(axis="x",which="major",length=10,width=2,colors="r",labelsize=None)設(shè)置刻度線的樣式,參數(shù)含義如下:axis:"x"設(shè)置x軸,"y"設(shè)置y軸,"both"設(shè)置x和y軸。which:"major"設(shè)置主刻度線,"minor"設(shè)置次刻度線(默認(rèn)不顯示)。length:刻度線長度width:刻度線寬度colors:刻度線顏色labelsize:刻度標(biāo)簽文字大小labelcolor:刻度標(biāo)簽顏色 ax=plt.gca()#獲取當(dāng)前子圖ax.tick_params(axis="both",which="major",width=5,colors="b",labelsize=12)#刻度樣圖如下frommatplotlib.tickerimportMultipleLocator,AutoMinorLocatorfig=plt.figure(figsize=(10,6))ax=fig.add_subplot()x=np.linspace(0,10,100)ax.plot(x,np.cos(x))#余弦曲線#set_major_locator設(shè)置x軸和y軸主刻度線的位置#參數(shù)MultipleLocator(2)表示在2倍處設(shè)置主刻度線,如0246等位置ax.xaxis.set_major_locator(MultipleLocator(2))ax.yaxis.set_major_locator(MultipleLocator(1))#set_minor_locator設(shè)置x軸和y軸次刻度線的位置#參數(shù)AutoMinorLocator(4)表示將每一份主刻度等分為4份ax.xaxis.set_minor_locator(AutoMinorLocator(4))ax.yaxis.set_minor_locator(AutoMinorLocator(2))#該函數(shù)控制刻度標(biāo)簽的顯示精度,函數(shù)形參要求為(x,pos)的形式defminor_tick(x,pos):ifnotx%1:returnx#x為1的整數(shù)倍則返回原數(shù)據(jù)
return'%.1f'%x#x為小數(shù),則保留1位小數(shù)位數(shù)#set_minor_formatter設(shè)置次刻度標(biāo)簽格式ax.xaxis.set_minor_formatter(minor_tick)#必須執(zhí)行此設(shè)置語句才能顯示次刻度線ax.yaxis.set_minor_formatter(minor_tick)ax.tick_params('x',which='major',length=10,width=2,labelsize=12,colors='r')#x軸主刻度線格式ax.tick_params('x',which='minor',length=5,width=1,labelsize=10,labelcolor='k')#x軸次刻度線格式ax.set_xlim(0,10)ax.set_ylim(-1.5,1.5)ax.grid(linestyle='-.',linewidth=0.5,color='r');刻度可分為主刻度(major)和次刻度(minor),次刻度默認(rèn)不顯示。為展示刻度參數(shù)效果,下面繪制一條標(biāo)注主、次刻度的余弦曲線。代碼使用刻度定位器設(shè)置刻度線位置,刻度格式器設(shè)置刻度標(biāo)簽的顯示樣式。一、坐標(biāo)軸的刻度樣式畫布上的任何內(nèi)容都是一個(gè)Artist對象,可以獲取這些對象做進(jìn)一步設(shè)置。下面繪制一條余弦曲線,然后獲取x軸的刻度標(biāo)簽和刻度線進(jìn)行設(shè)置,這樣可實(shí)現(xiàn)靈活的個(gè)性化設(shè)置,具體代碼如下:二、刻度標(biāo)簽和刻度線個(gè)性化設(shè)置plt.figure(facecolor='pink')x=np.linspace(-5,5,50)plt.plot(x,np.cos(x),'r-.*')ax=plt.gca() #返回當(dāng)前子圖fortlabelinax.xaxis.get_ticklabels():#獲取x軸刻度標(biāo)簽并設(shè)置屬性tlabel.set_color('b')tlabel.set_fontsize(16)tlabel.set_rotation(10) #文字旋轉(zhuǎn)角度fortlineinax.xaxis.get_ticklines():#獲取x軸刻度線并設(shè)置屬性tline.set_markersize(8)tline.set_markeredgewidth(2) 圖形一般只有一個(gè)Y軸,但當(dāng)我們需要在一個(gè)繪圖區(qū)體現(xiàn)兩個(gè)不同數(shù)量級或不同單位的組合圖表時(shí),就可以利用雙Y軸圖形實(shí)現(xiàn)。雙Y軸圖形由兩個(gè)共享x軸的彼此重疊的子圖構(gòu)成,代碼如下:三、雙軸圖fig,ax1=plt.subplots()t=np.arange(0.05,10.0,0.01)s1=np.exp(t) #指數(shù)函數(shù)ax1.plot(t,s1,c="b",ls="-",lw=3)#在ax1繪制指數(shù)函數(shù),藍(lán)色ax1.set_xlabel("X軸共享",fontsize=14)ax1.set_ylabel("以e為底的指數(shù)函數(shù)",color="b",fontsize=14)ax1.tick_params(axis="y",labelcolor="b")#設(shè)置Y軸刻度為藍(lán)色#twinx()創(chuàng)建一個(gè)與ax1共享X軸的子圖ax2,ax2的Y軸在右軸脊ax2=ax1.twinx()s2=np.cos(t**2) #余弦函數(shù)ax2.plot(t,s2,c="k",ls="-.")#在ax2繪制余弦函數(shù),黑色ax2.set_ylabel("余弦函數(shù)",color="k",fontsize=14)#ax2的Y軸標(biāo)簽ax2.tick_params(axis="y",labelcolor="k") 指數(shù)函數(shù)和余弦函數(shù)的值域相差非常大,如果兩條曲線按常規(guī)方法用同一個(gè)Y軸,那么余弦函數(shù)的圖形將幾乎呈現(xiàn)為一條橫線。這種情況下應(yīng)采用雙軸圖形。下圖也是一個(gè)雙Y軸案例,在同一個(gè)繪圖區(qū)域呈現(xiàn)某網(wǎng)站一年中每月的用戶活躍量和點(diǎn)擊率。三、雙軸圖np.random.seed(7)month=np.linspace(1,12,12)dau=np.random.randint(200,300,12)#日活數(shù)ctr=np.random.randint(8,20,12)/100#點(diǎn)擊率fig,ax1=plt.subplots(figsize=(10,5),facecolor='white')#左軸(日活數(shù))ax1.bar(month,dau,color='y',alpha=0.5)#設(shè)置y軸刻度標(biāo)簽的文字大小plt.setp(ax1.yaxis.get_ticklabels(),fontsize=12) ax1.set_xlabel('月份',fontsize=14)ax1.set_ylabel('日活躍用戶量(萬人)',fontsize=14)#右軸(點(diǎn)擊率),共享x軸ax2=ax1.twinx()
ax2.plot(month,ctr,'-or')ax2.set_ylabel('點(diǎn)擊率',fontsize=14)ax2.set_ylim(0,0.2) #將點(diǎn)擊率坐標(biāo)軸以百分比格式顯示defto_percent(x,pos):return'%2.1f'%(100*x)+'%'#設(shè)置ax2的y軸主刻度的顯示格式ax2.yaxis.set_major_formatter(to_percent) #設(shè)置右軸刻度標(biāo)簽大小plt.setp(ax2.yaxis.get_ticklabels(),fontsize=12)plt.title('2021年日活及點(diǎn)擊率趨勢',fontsize=18)在多個(gè)子圖的繪制中,可能需要共享不同子圖的坐標(biāo)軸,以強(qiáng)化繪圖區(qū)域的展示效果并精簡繪圖區(qū)域。這可通過在創(chuàng)建多子圖的函數(shù)plt.subplots()中設(shè)置參數(shù)sharey或sharex來實(shí)現(xiàn)。代碼如下:四、多子圖共享坐標(biāo)軸fig,axes=plt.subplots(nrows=2,ncols=2,sharex=True,sharey=True)#子圖間共享x軸和y軸forminrange(2):forninrange(2): #畫2行2列的隨機(jī)直方圖axes[m,n].hist(np.random.randn(500),bins=50,color='k',alpha=0.5)plt.subplots_adjust(wspace=0,hspace=0) #子圖間水平和垂直間距為0語句“plt.subplots(2,2,sharex=True,sharey=True)”創(chuàng)建了2行2列4個(gè)子圖,設(shè)置各子圖共享x軸和y軸。語句“fig.subplots_adjust(wspace=0,hspace=0)”將子圖間的水平和垂直間距都設(shè)為0,這樣圖形更緊湊。普通多子圖的坐標(biāo)軸有時(shí)會有所重疊,也可使用fig.tight_layout()命令自動(dòng)調(diào)整子圖間距。配色的核心是為數(shù)據(jù)集找到一個(gè)最能傳達(dá)數(shù)據(jù)信息的色彩表達(dá)方案。對于給定的數(shù)據(jù)集,最佳配色取決于諸多因素。顏色變化應(yīng)和數(shù)據(jù)變化保持同步,數(shù)值大小借助顏色深淺或色調(diào)冷暖來對比。繪圖時(shí)選擇適當(dāng)?shù)纳悼梢愿玫胤从硵?shù)據(jù)變化的趨勢、數(shù)據(jù)的聚集、分析者對數(shù)據(jù)的理解等信息。第3節(jié)
圖表配色一、顏色參數(shù)繪圖函數(shù)使用color參數(shù)指定顏色,例如plt.plot(x,y,color='b'),有些函數(shù)允許color簡寫為c。顏色用英文單詞或字母縮寫表示均可。顏色英文單詞字母縮寫顏色英文單詞字母縮寫白色whitew藍(lán)色blueb黑色blackk洋紅色maroonm黃色yellowy淺綠色lightgreen
綠色greeng天藍(lán)色skyblue
青色cyanc粉紅色pink
紅色redr紫色purpleplt支持多種顏色格式,語句color='r'/'red'/'#FF0000'/(1.0,0,0)均表示紅色。'#FF0000'是用十六進(jìn)制表示的RGB顏色,(1.0,0,0)是用小數(shù)元組表示的RGB顏色。設(shè)置顏色的另一種方法是使用顏色映射表(cmap)。顏色映射表將不同的數(shù)值轉(zhuǎn)換為不同的顏色,指定的映射表不同,同樣的數(shù)值就對應(yīng)不同的顏色。二、顏色映射---colormapnp.random.seed(7)p=np.random.rand(20,2) #二維數(shù)組,坐標(biāo)dottype=np.random.randint(0,3,20)#點(diǎn)的類型,取值012plt.scatter(p[:,0],p[:,1],s=60,c=dottype)#使用默認(rèn)的顏色映射表plt.scatter(p[:,0]+0.1,p[:,1]+0.1,s=60,c=dottype,cmap='spring')#指定'spring'表上述代碼先隨機(jī)生成20個(gè)點(diǎn)的坐標(biāo),隨機(jī)設(shè)定這些點(diǎn)的類型為0、1或2。“plt.scatter(c=dottype)”在繪制散點(diǎn)圖時(shí)根據(jù)參數(shù)c的指定,將點(diǎn)的類型自動(dòng)映射為三種不同的顏色,此時(shí)使用默認(rèn)的映射表。后續(xù)繪圖又使用了“cmap='spring'”的參數(shù),指定使用spring映射表,這樣又轉(zhuǎn)換為三種顏色,上圖一共有6種顏色的點(diǎn)。上圖使用了'spring'暖色系,讀者可嘗試替換為'winter'冷色系的效果。'Greys'表是灰度映射,小數(shù)值對應(yīng)深黑色,大數(shù)值對應(yīng)淺白色。'Greys_r'表是反轉(zhuǎn)灰度映射,小數(shù)值對應(yīng)淺白色,大數(shù)值對應(yīng)深黑色。如果有需要還可以自定義顏色映射表。上例只有0/1/2三種類型,假設(shè)想用r/g/b顏色與之對應(yīng),示例如下:二、顏色映射---colormapimportmatplotlibasmplnp.random.seed(7)p=np.random.rand(20,2)dottype=np.random.randint(0,3,20) #類型值0/1/2mycolormap=mpl.colors.ListedColormap(['r','g','b'])#創(chuàng)建自定義顏色映射表plt.scatter(p[:,0],p[:,1],s=60,c=dottype,cmap=mycolormap)#指定自定義的表通過上面的自定義映射表成功地將三種類型的點(diǎn)用紅綠藍(lán)三色區(qū)分開了。如果不用顏色映射表,自行指定對應(yīng)每個(gè)點(diǎn)的顏色列表也可以,示例如下:np.random.seed(7)p=np.random.rand(20,2)dottype=np.random.randint(0,3,20) #類型值0/1/2,有20個(gè)數(shù)據(jù)colordict={0:'r',1:'g',2:'b'} #顏色字典lstcolor=[colordict[c]forcindottype] #轉(zhuǎn)換得到顏色列表(長度20)plt.scatter(p[:,0],p[:,1],s=60,c=lstcolor) #lstcolor長度應(yīng)和點(diǎn)數(shù)一致三、顏色標(biāo)尺---colorbar顏色映射表完成了數(shù)值和顏色的轉(zhuǎn)換,我們還可以在圖形旁邊添加一個(gè)顏色標(biāo)尺以便清楚地展示顏色和數(shù)值的對應(yīng)關(guān)系。np.random.seed(7)#二維數(shù)組,坐標(biāo)p=np.random.rand(150,2)dottype=np.random.randint(0,20,150)plt.scatter(p[:,0],p[:,1],s=60,c=dottype,cmap=plt.cm.winter)#顯示顏色標(biāo)尺(反映數(shù)值和顏色的映射)plt.colorbar(shrink=0.8,aspect=15) plt.colorbar()命令將顯示顏色標(biāo)尺。參數(shù)shrink=0.8設(shè)定標(biāo)尺高度為圖形高度的80%,aspect=15規(guī)定標(biāo)尺寬度,該值越大則標(biāo)尺越窄。四、顏色案例函數(shù)pcolor()可將二維數(shù)組映射為顏色圖,示例如下:np.random.seed(7)rd=np.random.rand(10,10) #隨機(jī)二維數(shù)組10行10列plt.pcolor(rd,cmap='winter') #將數(shù)組映射為顏色圖plt.axis('equal') #設(shè)置軸相等,使顏色圖顯示為正方形plt.colorbar() #顯示顏色標(biāo)尺代碼中的rd是10行10列的方陣,值為0~1間的隨機(jī)小數(shù),pcolor()將數(shù)值映射為不同顏色。該數(shù)組行列數(shù)一樣,但默認(rèn)情況下圖形并不是正方形,而是矩形。這是因?yàn)槠聊粰M縱方向的單位分辨率不同,導(dǎo)致同樣的距離在橫縱方向占據(jù)的實(shí)際長度是不同的。“plt.axis('equal')”語句的目的就是將X軸和Y軸的單位長度調(diào)整為一致,這樣方陣的顏色圖就是一個(gè)正方形。四、顏色案例除了指定顏色映射表,還可以使用映射函數(shù)將數(shù)值轉(zhuǎn)為顏色的元組表達(dá)。例如plt.cm.summer(5)返回元組“(0.02,0.51,0.4,1.0)”,元組前3個(gè)數(shù)對應(yīng)RGB三原色,第4個(gè)數(shù)1.0是默認(rèn)的透明度。#極坐標(biāo)圖,使用plt.cm.summer()函數(shù)映射顏色np.random.seed(7)n=15theta=np.linspace(0.0,2*np.pi,n,endpoint=False)r=30*np.random.rand(n)width=np.pi/4*np.random.rand(n)#返回極坐標(biāo)系子圖ax=plt.subplot(polar=True)bars=ax.bar(theta,r,width=width,bottom=0.0)forr,barinzip(r,bars):#plt.cm.summer()函數(shù)將數(shù)值映射為顏色元組bar.set_facecolor(plt.cm.summer(r/30))#設(shè)置柱體顏色
#透明度bar.set_alpha(r/30)四、顏色案例plt本身也可以顯示圖片,例如常見的jpg格式的圖片讀入后是一個(gè)三維數(shù)組,可以用plt.imshow()命令顯示?!皃lt.imshow(數(shù)組)”可以將數(shù)組映射為顏色圖像。下例將同一張圖片按不同顏色映射模式顯示。plt.figure(figsize=(12,8))a=plt.imread('data/tu.jpg')#讀取圖片tu.jpgprint(a.shape) #jpg圖片讀入后是一個(gè)三維數(shù)組plt.subplot(221)plt.imshow(a) #三維數(shù)組按RGB色彩顯示plt.subplot(222)plt.imshow(a[:,:,0])
#a[:,:,0]是二維數(shù)組,按默認(rèn)顏色表映射plt.subplot(223)plt.imshow(a[:,:,0],cmap=plt.cm.coolwarm)#指定coolwarm映射表plt.subplot(224)plt.imshow(a[:,:,0],cmap='Greys') #指定'Greys'灰度映射表foraxinplt.gcf().axes: #獲取當(dāng)前畫布上所有的axesax.set_axis_off() #不顯示ax的軸四、顏色使用案例理解了jpg圖片的數(shù)組格式后,我們可以造出一張彩色圖片。下面的代碼會產(chǎn)生一張100x100像素的彩色jpg圖片,上半部分紅色,下半部分黃色。a=np.zeros((100,100)) #100行100列的全0數(shù)組r=a.copy() r[:,:]=255 #255,紅色部分g=a.copy() #綠色數(shù)組g[50:]=255 #數(shù)組下半部分是綠色的最大值,這樣下半部分r和g合成黃色b=a.copy() #藍(lán)色數(shù)組,保持全0#dstack深度疊加得到符合RGB格式的三維數(shù)組arr=np.dstack((r,g,b)).astype('uint8')plt.imshow(arr) #顯示數(shù)組#保存圖片fromPILimportImage #導(dǎo)入Imageim=Image.fromarray(arr) #將數(shù)組轉(zhuǎn)為圖片對象imim.save('img/red_yellow.jpg') #存為圖片文件四、顏色案例plt還有一條顏色填充命令fill_between(),用于在指定區(qū)間填充顏色。例如模擬表示數(shù)據(jù)在一定范圍內(nèi)波動(dòng),某些算法會使用此圖表示數(shù)據(jù)的可能邊界。x=np.linspace(1,10,30)y=2*x+np.random.randn(30)plt.plot(x,y) #折線圖plt.fill_between(x,y*0.9,y*1.1,color='g',alpha=0.3) #x范圍內(nèi),[0.9y,1.1y]區(qū)間填充顏色五、繪圖風(fēng)格plt在繪圖時(shí)可選用繪圖風(fēng)格。風(fēng)格是一組預(yù)定義樣式的集合,包括窗口背景色、網(wǎng)格線、線條顏色等設(shè)置內(nèi)容。使用“plt.style.use(風(fēng)格)”命令選擇某種風(fēng)格后,此后的圖形就具有該風(fēng)格的樣式。一般較常用的有'seaborn_v0_8'和'ggplot'等樣式。plt.style.use('default')命令可恢復(fù)為默認(rèn)風(fēng)格,恢復(fù)默認(rèn)風(fēng)格后,前面已設(shè)的中文字體將失效,因此要再設(shè)置一次中文字體。plt.style.available #列出可用的風(fēng)格名稱Out:['Solarize_Light2','_classic_test_patch','bmh','classic','dark_background','fast','fivethirtyeight','ggplot','grayscale','seaborn_v0_8',…]plt.style.use('seaborn_v0_8') #選擇seaborn_v0_8風(fēng)格plt.plot(np.random.randn(10)) #該圖形的輸出具有seaborn的樣式,圖略plt.style.use('default') #恢復(fù)為默認(rèn)風(fēng)格plt.rcParams['font.family']='Simhei' #恢復(fù)默認(rèn)風(fēng)格后要重設(shè)中文字體圖形中的文本非常重要,起到說明、注釋和強(qiáng)調(diào)的作用。圖形標(biāo)題、軸標(biāo)簽和刻度標(biāo)簽都是文本對象。對文本通常做字體(family)、字體風(fēng)格(style)、字體粗細(xì)(weight)、字體大小(size)等方面的設(shè)置。全局文本屬性使用plt.rcParams()函數(shù)設(shè)置,設(shè)置后默認(rèn)對之后的所有繪圖命令有效。第4節(jié)
文本屬性設(shè)置一、文本屬性設(shè)置方法plt.rcParams['font.family']='SimHei' #設(shè)置使用黑體字體以正常顯示中文plt.rcParams['font.size']=18 #全局文本默認(rèn)大小18plt.rcParams['text.color']='blue' #全局文本藍(lán)色plt.rcdefaults() #恢復(fù)默認(rèn)參數(shù)命令plt.rcParams.keys()列出所有可設(shè)置的參數(shù),含300余個(gè)設(shè)置項(xiàng),主要是關(guān)于lines、patch、font、text、axes等內(nèi)容的配置。某些參數(shù)項(xiàng)如設(shè)置錯(cuò)誤有時(shí)會導(dǎo)致后續(xù)圖形無法輸出,此時(shí)可執(zhí)行plt.rcdefaults()命令恢復(fù)默認(rèn)參數(shù)。全局設(shè)置將影響所有的繪圖命令,一般使用較多的是在繪圖命令中單獨(dú)設(shè)置某個(gè)屬性。我們可以在命令中指定參數(shù),或獲取繪圖命令返回的對象再做進(jìn)一步設(shè)置,以下兩種方式效果相同。#方式一plt.text(0.5,0.5,'文本',fontsize=16,c='b')#方式二t=plt.text(0.5,0.5,'文本')
#獲取返回的文本對象t,類型為matplotlib.text.Textplt.setp(t,fontsize=16,c='b')
#利用plt.setp對t進(jìn)行設(shè)置一、文本屬性設(shè)置方法Matplotlib的很多函數(shù)都支持自定義文本和字體屬性,如text()、xlabel()、ylabel()和title()等。文本和字體常用的屬性及含義如下表所示:屬性參數(shù)取值含義familyArial/sans-serif/simhei/simsun字體名稱或字體類型,可以使用列表,按順序使用第一個(gè)匹配的字體size/fontsize9/10/12..../30xx-small/small/large/x-large/xx-large字號大小style/fontstylenormal/italic/oblique字體風(fēng)格weight/fontweight0~1000或light/normal/medium/bold字體粗細(xì)字體類別、字體風(fēng)格、字體大小等屬性都可以在繪圖函數(shù)中指定,下面演示各種屬性的設(shè)置。二、文本屬性設(shè)置示例plt.rcParams['font.size']=18 #設(shè)置默認(rèn)字體大小18fig=plt.figure(figsize=(10,8))ax=fig.add_subplot()pi=[0.9,0.8,0.7,0.6,0.5,0.4,0.3] #y坐標(biāo)#可用的中文字體名families=['simhei','SimSun','FangSong','KaiTi','MicrosoftYaHei']fontname=['黑體','宋體','仿宋','楷體','微軟雅黑']ax.text(0,1,'family',fontsize=24,ha='center')fori,faminenumerate(zip(families,fontname)): ax.text(0,pi[i],fam[1],family=fam[0],ha='center') sizes=[10,14,18,24,30] #字號大小ax.text(0.5,1,'size',fontsize=24,ha='center')fori,sizeinenumerate(sizes):ax.text(0.5,pi[i],size,size=size,ha='center')字體類別、字體風(fēng)格、字體大小等屬性都可以在繪圖函數(shù)中指定,下面演示各種屬性的設(shè)置。上圖最后兩列演示style和weight屬性需要設(shè)置為“family='sans-serif'”英文字體才有效。二、文本屬性設(shè)置示例#字體風(fēng)格(僅對英文字體有效)styles=['normal','italic','oblique'] ax.text(1,1,'style',fontsize=24,ha='center')fori,styleinenumerate(styles):ax.text(1,pi[i],style,family='sans-serif',style=style,ha='center')#字體粗細(xì)(僅對英文字體有效)weights=['light','normal','semibold','bold','black'] ax.text(1.5,1,'weight',fontsize=24,ha='center')fori,weightinenumerate(weights):ax.text(1.5,pi[i],weight,weight=weight,family='sans-serif',ha='center')ax.axis([0,1.6,0.1,1.1]) #設(shè)置x和y軸范圍plt.axis('off') #不顯示坐標(biāo)軸Python數(shù)據(jù)可視化ThankYou!Python數(shù)據(jù)可視化第6章Matplotlib庫其他繪圖函數(shù)教師:xxx2024.07第1節(jié)
繪制動(dòng)態(tài)圖第6章Matplotlib庫其他繪圖函數(shù)第2節(jié)
繪制世界地圖第3節(jié)
文本數(shù)據(jù)可視化Matplotlib不僅可繪制靜態(tài)圖形,還可繪制動(dòng)態(tài)圖形(動(dòng)畫),可保存為.gif動(dòng)畫文件。雖然這個(gè)動(dòng)圖功能比較有限,但給用戶提供了一種全新的數(shù)據(jù)展示手段,提升了視覺表現(xiàn)力。第1節(jié)
繪制動(dòng)態(tài)圖一、
動(dòng)圖函數(shù)FuncAnimation動(dòng)圖繪制需使用matplotlib中的animation.FuncAnimation函數(shù)。繪制的大致過程為:先編寫init初始化及update更新兩個(gè)子函數(shù),將這兩個(gè)子函數(shù)作為參數(shù)傳入FuncAnimation函數(shù),此后系統(tǒng)將自動(dòng)周期性調(diào)用update函數(shù)更新圖像。創(chuàng)建動(dòng)圖的語法格式為:ani=FuncAnimation(fig,func,frames=None,init_func=None,repeat,interval)fig:承載動(dòng)畫的畫布func:動(dòng)畫的更新函數(shù)(update),用于產(chǎn)生動(dòng)畫的幀frames:一輪動(dòng)畫所需的數(shù)據(jù),動(dòng)畫過程中每一幀的數(shù)據(jù)會傳遞給更新函數(shù)update(n)的形參“n”init_func:初始化函數(shù),每次新一輪動(dòng)畫開始時(shí)執(zhí)行一次,非必須參數(shù)repeat:動(dòng)畫是否一直循環(huán),默認(rèn)值Trueinterval:每幀更新時(shí)間間隔,默認(rèn)值200毫秒一、
動(dòng)圖函數(shù)FuncAnimation#設(shè)為notebook輸出模式,以便在jupyter中觀察動(dòng)畫效果%matplotlibnotebookfrommatplotlib.animationimportFuncAnimation #引入動(dòng)圖函數(shù),繪制一條會“動(dòng)”的余弦曲線x=np.arange(0,2*np.pi,0.01) lines_lst=plt.plot(x,np.cos(x)) #執(zhí)行后返回Line2D列表line=lines_lst[0] #取出第0根線,這是update函數(shù)需要改變的全局對象definit(): #初始化函數(shù),每次新一輪動(dòng)畫開始時(shí)執(zhí)行一次,不是必須的line.set_ydata(np.cos(x))
defupdate(n): #最重要的更新動(dòng)畫函數(shù),每幀自動(dòng)重復(fù)調(diào)用#print('幀號:',n)line.set_ydata(np.cos(x+n/10)) #每次傳入的n值不同,更新Y軸數(shù)據(jù),圖像自動(dòng)更新
ani=FuncAnimation(fig=plt.gcf(), #創(chuàng)建動(dòng)畫對象,gcf()獲取當(dāng)前畫布,作為動(dòng)畫的載體func=update, #設(shè)置更新函數(shù)frames=100, #如為單個(gè)整數(shù),則數(shù)據(jù)序列為range(0,100)init_func=init, #設(shè)置初始化函數(shù)interval=20,repeat=True) #每幀間隔20毫秒,默認(rèn)值True,動(dòng)畫一直循環(huán)ani.save('img/cos_ani.gif',fps=10) #保存為gif動(dòng)畫文件,每秒10幀一、
動(dòng)圖函數(shù)FuncAnimation上例中動(dòng)圖繪制的核心是update(n)函數(shù),用于更新動(dòng)畫的每一幀。每幀更新時(shí),該函數(shù)被自動(dòng)調(diào)用,傳入數(shù)據(jù)n,根據(jù)n重新計(jì)算y坐標(biāo)值,line.set_ydata()就會更新圖形。update函數(shù)被自動(dòng)周期性調(diào)用就產(chǎn)生了動(dòng)畫效果。FuncAnimation中的參數(shù)frames設(shè)定一輪動(dòng)畫的數(shù)據(jù)序列,本例設(shè)置為整數(shù)100,則表示數(shù)據(jù)序列為range(0,100),一輪動(dòng)畫有100幀,此時(shí)update(n)更新時(shí)傳入的n相當(dāng)于當(dāng)前幀號。frames也可設(shè)定為一個(gè)序列,每幀更新時(shí)就依次收到序列中的一個(gè)數(shù)據(jù)。機(jī)器學(xué)習(xí)的線性二分類問題中我們需要找一條直線將兩類數(shù)據(jù)分開。在尋找最優(yōu)直線的過程中需不斷更新其斜率和截距,以下的動(dòng)畫模擬演示了更新斜率的過程。#如在spyder中調(diào)試,可設(shè)為qt彈出窗口模式,觀察動(dòng)畫效果%matplotlibqtfrommatplotlib.animationimportFuncAnimationfig,ax=plt.subplots()
#新建畫布defupdate(k):
#更新函數(shù),此處k是直線斜率ax.clear()
#清空子圖,后續(xù)代碼重繪各圖形對象ax.set_xlim(0,10)ax.set_ylim(0,20)ax.scatter([2,2],[10,15],s=60,marker='D',c='r')
#繪制兩類散點(diǎn)ax.scatter([4,8],[7,7.2],s=60,marker='x',c='b')x=np.array([0,10])y=k*x+1
#斜率變動(dòng),重算yax.plot(x,
y)
#重新繪制直線ax.text(2,
2,
f'y={k:.2f}*x+1',fontsize=20) #標(biāo)注公式#本例設(shè)定直線斜率在[0,2.4]間變動(dòng)ani=FuncAnimation(fig,update,frames=np.linspace(0,2.4,20),interval=300,repeat=False)二、直線圖動(dòng)畫直線圖動(dòng)畫的另一種實(shí)現(xiàn)代碼如下,兩種方法效果相同。frommatplotlib.animationimportFuncAnimationfig,ax=plt.subplots()
#定義畫布ax.set_xlim(0,10)ax.set_ylim(0,20)ax.scatter([2,2],[10,15],s=60,marker='D',c='r')
#繪制散點(diǎn)ax.scatter([4,8],[7,7.2],s=60,marker='x',c='b')x=np.array([0,10])k=0y=k*x+1line,=ax.plot(x,y) #返回直線列表(注意line后有一個(gè)逗號,用于拆分列表,得到直線)txtobj=ax.text(2,2,f'y={k:.2f}*x+1',fontsize=20) #txtobj對應(yīng)公式文本defupdate(k):
#更新函數(shù),k是斜率y=k*x+1
#斜率變動(dòng),重算yline.set_ydata(y)
#更新直線txtobj.set_text(f'y={k:.2f}*x+1') #更新公式文本ani=FuncAnimation(fig,update,frames=np.linspace(0,2.4,20),interval=300,repeat=False) 二、直線圖動(dòng)畫假定某公司在4個(gè)城市都有銷售,要?jiǎng)討B(tài)對比各個(gè)城市每個(gè)月的銷售金額,用動(dòng)態(tài)條形圖實(shí)現(xiàn)如下:np.random.seed(7)city=['武漢','廣東','深圳','北京']month=[str(x)+'月'forxinrange(1,13)] #1月至12月data=np.random.randint(100,200,size=(12,4)) #銷售數(shù)據(jù)fig,ax=plt.subplots(figsize=(8,5))defupdate(k): #更新函數(shù)
ax.clear() #清空子圖
ax.barh(city,data[k],height=0.5,color=['r','g','b','y'],alpha=0.5) #重繪條形圖
ax.set_title(month[k],fontsize=20)ani=FuncAnimation(fig,update,interval=500,frames=len(month)) #動(dòng)畫對象三、條形圖動(dòng)畫Cartopy庫是Python平臺下的一款地圖工具包,在氣象學(xué)領(lǐng)域應(yīng)用廣泛。本節(jié)介紹該包的使用,教材最后一章會使用這個(gè)庫繪制全球疫情地圖。第2節(jié)
繪制世界地圖一、地圖繪制包CartopyCartopy是一個(gè)地圖繪制包,提供了多種地圖投影和地理信息處理方法。該包提供易于使用的訪問接口,可與matplotlib庫配合創(chuàng)建滿足出版質(zhì)量的地圖。Anaconda平臺可在命令行上執(zhí)行下面的命令安裝所需的包。pipinstallcartopy
Cartopy和matplotlib配合使用,兩者版本需匹配。Cartopy0.23(2024.7月的最新版本)和matplotlib3.7匹配,Cartopy0.22和matplotlib3.5匹配。Cartopy繪制地圖的方式很簡單,先按某種投影模式創(chuàng)建子圖(即地圖),然后使用stock_img方法將背景圖片添加到地圖中,再根據(jù)經(jīng)緯度添加標(biāo)注數(shù)據(jù)。下面展示了兩種地圖投影模式:importcartopy.crsasccrs #導(dǎo)入cartopy中的ccrs(含多種地圖投影模式)ax1=plt.subplot(121,projection=ccrs.Mollweide()) #ccrs.Mollweide圓形地圖ax1.stock_img() #設(shè)置默認(rèn)的地圖背景ax1.set_title('Mollweide圓形地圖',fontsize=16)ax2=plt.subplot(122,projection=ccrs.PlateCarree()) #ccrs.PlateCarree矩形平面地圖ax2.stock_img()ax2.set_title('PlateCarree矩形地圖',fontsize=16) 一、地圖繪制包Cartopy下面根據(jù)給定的經(jīng)緯度在兩個(gè)城市間連線:importcartopy.crsasccrs ax=plt.axes(projection=ccrs.PlateCarree()) #創(chuàng)建具有地理投影的子圖,此子圖上的點(diǎn)需用經(jīng)緯度表示ax.stock_img()city=['紐約','上海']lon=[-74.0,121.48] #經(jīng)度(東經(jīng)正值,西經(jīng)負(fù)值)lat=[40.7,31.22] #緯度(北緯正值,南緯負(fù)值)ax.plot(lon,lat,lw=2,marker='o',mfc='r') #ax采用地理投影,經(jīng)緯度會自動(dòng)定位到地圖上forkinrange(len(city)):ax.text(lon[k],lat[k]-5,city[k],ha='center',va='top',c='b',fontsize=20)#標(biāo)注城市名,ha水平居中 一、地圖繪制包Cartopy代碼“ax=plt.axes(projection=ccrs.PlateCarree())”按平面矩形投影模式創(chuàng)建子圖ax,后續(xù)繪圖時(shí)x坐標(biāo)對應(yīng)經(jīng)度,y坐標(biāo)對應(yīng)緯度,經(jīng)緯度會被自動(dòng)投影到地圖上正確的位置。此外還可以給地圖添加地貌線和經(jīng)緯網(wǎng)格線,如下所示:importcartopy.featureascfeatureimportcartopy.crsasccrsfig=plt.figure(figsize=(8,6),dpi=100)ax=fig.add_subplot(projection=ccrs.PlateCarree())ax.stock_img()#設(shè)置網(wǎng)格線的范圍并要求標(biāo)注gl=ax.gridlines(ylocs=np.arange(-90,90+30,30),
xlocs=np.arange(-180,180+60,60),draw_labels=True,linestyle='--')gl.top_labels=False #網(wǎng)格線的上標(biāo)簽不顯示gl.right_labels=False #網(wǎng)格線的右標(biāo)簽不顯示ax.add_feature(cfeature.COASTLINE) #海岸輪廓線ax.add_feature(cfeature.RIVERS) #河流輪廓線ax.add_feature(cfeature.LAKES) #湖泊輪廓線 一、地圖繪制包Cartopy本例演示使用cartopy的API接口給國家著色,利用顏色可直觀區(qū)分各國的諸如人口、經(jīng)濟(jì)等數(shù)據(jù)。首先借助cartopy.io.shapereader內(nèi)的natural_earth和Reader接口完成各個(gè)國家地理信息的獲取。natural_earth用于獲取世界地理信息的文件路徑,Reader讀取文件得到國家的經(jīng)緯度和輪廓線等地理信息。然后用add_geometries在地圖上描繪國家邊界線并同時(shí)根據(jù)統(tǒng)計(jì)數(shù)據(jù)填充顏色,最后再添加一個(gè)顏色標(biāo)尺顯示顏色和和值的對應(yīng)關(guān)系。代碼實(shí)現(xiàn)如下:二、世界地圖著色importmatplotlibasmplimportcartopy.crsasccrsfromcartopy.ioimportshapereader #引入相關(guān)地理文件接口np.random.seed(7)#1.設(shè)置國家地理文件的路徑信息filename=shapereader.natural_earth(resolution='110m',category='cultural',name='admin_0_countries')#創(chuàng)建地理文件閱讀器對象reader=shapereader.Reader(filename)二、世界地圖著色#2.用隨機(jī)數(shù)模擬每個(gè)國家的數(shù)據(jù)(數(shù)據(jù)個(gè)數(shù)和reader中包含的國家和地區(qū)數(shù)一樣)data=np.random.randint(50,1000,len(list(reader.records())))#數(shù)據(jù)中的最大值,用于顏色轉(zhuǎn)換max_value=data.max()#3.創(chuàng)建世界地圖fig=plt.figure(figsize=(8,6),dpi=100)ax=fig.add_subplot(projection=ccrs.PlateCarree())#4.遍歷國家,country中含有國家的地理數(shù)據(jù)fori,countryinenumerate(reader.records()):rgba=mpl.cm.rainbow(data[i]/max_value) #將數(shù)據(jù)利用rainbow()工具轉(zhuǎn)為rgba元組顏色#子圖上添加國家,參數(shù)(國家地理信息,投影類型,填充顏色,邊界線顏色)ax.add_geometries([country.geometry],ccrs.PlateCarree(),facecolor=rgba,edgecolor='k')生成一些隨機(jī)數(shù)據(jù),作為每個(gè)國家的模擬統(tǒng)計(jì)數(shù)據(jù)。數(shù)據(jù)個(gè)數(shù)要和文件內(nèi)的國家和地區(qū)數(shù)一致;創(chuàng)建地理投影子圖,仍使用平面矩形投影模式;遍歷reader中的國家,將統(tǒng)計(jì)數(shù)據(jù)用rainbow()工具轉(zhuǎn)換為一個(gè)rgba顏色元組。二、世界地圖著色#5.在子圖右側(cè)添加新繪圖區(qū)(顏色標(biāo)尺)cax=fig.add_axes([0.92,0.25,0.02,0.5])#創(chuàng)建顏色的歸一化轉(zhuǎn)換器norm=mpl.colors.Normalize(vmin=50,vmax=max_value)#創(chuàng)建顏色標(biāo)尺并添加到cax子圖mpl.colorbar.ColorbarBase(cax,cmap=mpl.cm.rainbow,norm=norm)在子圖右側(cè)添加顏色標(biāo)尺。此處不能使用以前的plt.colorbar()方法添加,因?yàn)閍dd_geometries繪圖命令并沒有使用cmap參數(shù),系統(tǒng)無從參照去繪制顏色條。此處的顏色標(biāo)尺需人工設(shè)定,先用歸一化轉(zhuǎn)化器Normalize將統(tǒng)計(jì)數(shù)據(jù)歸一化到0~1之間,再使用ColorbarBase創(chuàng)建一個(gè)顏色條并添加到cax子圖中。文本可視化可以分為文本內(nèi)容可視化、文本關(guān)系可視化和文本多特征信息可視化三個(gè)方面。其中,文本的內(nèi)容可以通過關(guān)鍵詞、短語、句子和主題進(jìn)行展示。本節(jié)介紹文本內(nèi)容可視化中關(guān)鍵詞的詞云繪制方法。第3節(jié)
文本數(shù)據(jù)可視化importre #引入正則模塊regdp='2020年我國的GDP總量是100萬億元're.findall('\d+',gdp)
#從文本中提取所有的數(shù)字,\d+代表所有數(shù)字Out:['2020','100'] #返回提取得到的信息列表re.findall('\D+',gdp)
#從文本中提取所有的非數(shù)字,\D+代表非數(shù)字Out:['年我國的GDP總量是','萬億元']一、正則表達(dá)式文本處理需要從文本中提取信息,正則表達(dá)式是最好的提取工具。正則表達(dá)式使用特定的規(guī)則去匹配或檢索字符串。例如“\d+”匹配一連串?dāng)?shù)字,“[a-z]+”匹配一連串小寫字母。在支持正則表達(dá)式的編程語言中,正則表達(dá)式的語法規(guī)則是一樣的,區(qū)別只在于支持的語法數(shù)量有略微差異。元字符用于匹配某類字符,表達(dá)某種規(guī)則,常用的元字符如下:. :句點(diǎn)符匹配除了換行符\n外的任意單個(gè)字符\w :匹配字符(英文或中文)和數(shù)字,即[a~zA~Z中文0-9]\W :匹配任何非單詞字符,與\w相反\d :匹配數(shù)字[0-9]\D :匹配非數(shù)字的字符,與\d相反\s :匹配單個(gè)空白字符,如空格、換行符\n,回車符\r,制表符\t等\S :匹配任何非空白字符,與\s相反^ :匹配字符串的開始$ :匹配字符串末尾\ :取消轉(zhuǎn)義,將元字符視為普通字符* :前詞可重復(fù)0次到無限次? :前詞可重復(fù)0次或1次+ :前詞可重復(fù)1次到無限次() :()內(nèi)包含要提取的內(nèi)容表達(dá)一、正則表達(dá)式正則表達(dá)式的功能異常強(qiáng)大,寫法非常靈活。有時(shí)表達(dá)形式很復(fù)雜,要多次嘗試才能找到正確的規(guī)則。re模塊中常用的正則函數(shù)如下:importrere.findall(pattern,string,flags) #查找返回所有匹配的字符串列表re.match(pattern,string,flags)
#必須從頭部開始匹配,返回匹配對象或None值re.search(pattern,string,flags) #可從任意位置開始匹配,返回匹配對象或None值re.split(pattern,string,flags) #分割字符串re.sub(pattern,repl,string,count=0,flags=0) #替換子字符串參數(shù)中“pattern”代表正則表達(dá)式,“string”表示要匹配的字符串,“flags”是標(biāo)志位,控制匹配方式,例如是否區(qū)分大小寫、多行匹配等。一、正則表達(dá)式下面是一些正則表達(dá)式的示例:s
=
'Pythonisaprogramminglanguage're.findall('p',s)
#查找字母pOut:['p']
#默認(rèn)區(qū)分大小寫,所以只找到一個(gè)小寫pre.findall('p',s,flags=re.I)
#re.I表示忽略大小寫Out:['P','p']
#大寫、小寫p均找到re.findall('\w+',
s)
#提取所有單詞Out:['Python','is','a','programming','language']re.findall('\w{6,8}',
s)
#提取6-8個(gè)字符長度的單詞,{6,8}長度限定Out:['Python','programm','language']re.findall('\w{7,}',
s)
#提取長度>=7的單詞,注意{7,}逗號后沒有空格Out:['programming','language']一、正則表達(dá)式s='網(wǎng)址,聯(lián)系郵箱abc@126.com。're.findall('http://[a-z0-9\.]+\.[a-z0-9]+',s,flags=re.I) #提取網(wǎng)址Out:['']一、正則表達(dá)式正則表達(dá)式“http://[a-z0-9\.]+\.[a-z0-9]+”表示匹配“http://英文數(shù)字.英文數(shù)字”這樣的字符串?!癧a-z0-9\.]+”中的“[a-z0-9]”代表所有的英文字母和數(shù)字,“\.”代表句點(diǎn)(句點(diǎn)本是元字符,前面加斜杠\停止轉(zhuǎn)義,只代表句點(diǎn)本身),“+”號代表任意多個(gè)。為便于理解,這個(gè)表達(dá)式寫得比較簡單,并不完善,無法匹配所有的網(wǎng)址。re.findall('a(\d+)b','xa23bcc45xx') #a(\d+)b表示只提取ab中間的數(shù)字Out:['23'] #只提取23,數(shù)字45沒有取出上例的“()”很有用,前后的a和b是匹配規(guī)則,當(dāng)匹配時(shí),就取出()中匹配的內(nèi)容。一、正則表達(dá)式re.search函數(shù)用于查找字符串中可匹配的子串,找到第一個(gè)匹配項(xiàng)即返回,如果沒有匹配項(xiàng)就返回None。re.match函數(shù)必須從字符串首位置開始匹配。search()和match()都僅匹配一次,findall()則匹配所有符合規(guī)則的子串。s='Pythonisaprogramminglanguage'r=re.search('is',s)r #r的類型是re.MatchOut:<re.Matchobject;span=(7,9),match='is'>r.start(),r.end(),r.group() #匹配的起始、結(jié)束位置、匹配的字符串Out:(7,9,'is')re.match('is',s)
#將返回空None,因?yàn)?is'不在s的首部re.match('Python',s)
#匹配成功Out:<re.Matchobject;span=(0,6),match='Python'>一、正則表達(dá)式re.split()提供了靈活的分割形式,幫助我們分離字符串。s
=
'Python;is,a,\\language' #內(nèi)含多種形式的分隔符;,\\s.split()
#字符串自身的split()無法完全正確分割Out:['Python;','is,','a',',','\\','language']re.s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第二章向量概念及運(yùn)算教案
- 《麥哨》教學(xué)設(shè)計(jì)
- 鄉(xiāng)村道路片石擋土墻施工合同
- 企業(yè)內(nèi)部評審員管理辦法
- 人教版小學(xué)二年級語文下冊全冊教案
- 惠州市燃?xì)庾赓U合同
- 建筑工程綠化協(xié)議
- 汽車用品店加油站施工合同
- 城市景觀墻體租賃協(xié)議
- 橡膠性能計(jì)量器具規(guī)范
- 二 《學(xué)習(xí)工匠事跡 領(lǐng)略工匠風(fēng)采》(教學(xué)設(shè)計(jì))-【中職專用】高二語文精講課堂(高教版2023·職業(yè)模塊)
- 工程項(xiàng)目建設(shè)程序
- 分子結(jié)構(gòu)與化學(xué)性質(zhì)的關(guān)系
- 道路(光彩工程)亮化施工投標(biāo)方案(技術(shù)方案)
- 2023年房地產(chǎn)估價(jià)師考試完整真題及答案解析
- 第14課 推進(jìn)綠色發(fā)展
- 山東省泰安市新泰市2023-2024學(xué)年五年級上學(xué)期期中語文試卷
- 《機(jī)械設(shè)計(jì)》課程思政教學(xué)案例(一等獎(jiǎng))
- 2023-2024學(xué)年福建省廈門市七年級上冊期中語文模擬試題(附答案)
- 話劇社管理制度
- 余華讀書分享名著導(dǎo)讀《在細(xì)雨中呼喊》
評論
0/150
提交評論