版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章可視化分析目錄contents從數(shù)據(jù)到圖形面向?qū)ο蟮睦L圖模式實(shí)例:人口金字塔可視化分析實(shí)例:電商數(shù)據(jù)可視化分析實(shí)例:氣象數(shù)據(jù)可視化分析Matplotlib大數(shù)據(jù)和人工智能時(shí)代,數(shù)據(jù)科學(xué)一項(xiàng)重要的任務(wù)是對(duì)海量的數(shù)據(jù)進(jìn)行直觀地描述、總結(jié)和表示。相比文本數(shù)據(jù),圖表數(shù)據(jù)可以更加清晰、高效地展示數(shù)據(jù)的信息。在很多情況下,執(zhí)行數(shù)據(jù)分析的第一步便是對(duì)數(shù)據(jù)進(jìn)行可視化分析,并從中獲得數(shù)據(jù)的異常值、必要的數(shù)據(jù)轉(zhuǎn)換、模型設(shè)計(jì)的洞察等信息。Matplotlib是Python社區(qū)中應(yīng)用最廣泛的可視化庫,其基于NumPy的數(shù)組繪制出版級(jí)別的可視化圖形(包括二維圖像和三維圖形),并可與Scipy,Pandas等第三方庫聯(lián)合使用。隨著Python的流行,Matplotlib衍射出了諸如Seaborn,ggplot等高級(jí)封裝的數(shù)據(jù)可視化庫,這些庫都使用Matplotlib作為底層進(jìn)行繪圖。本章將講解Matplotlib的基本功能,并介紹基于Matplotlib的數(shù)據(jù)可視化分析任務(wù)處理。Matplotlib庫包含有pylab和pyplot兩類接口。在最初時(shí),Matplotlib的設(shè)計(jì)與MATLAB高度類似,并因此產(chǎn)生了pylab模塊,其旨在模仿MATLAB的全局風(fēng)格。然而,pylab的使用會(huì)影響Python的內(nèi)置函數(shù)并可能導(dǎo)致難以跟蹤的錯(cuò)誤污染命名空間,如今Matplotlib官方已放棄pylab并明確建議不使用該模塊。為此,在任何情況下都應(yīng)該使用pyplot模塊。Matplotlib可以通過conda或者pip命令進(jìn)行安裝,在安裝完成后,通常以如下方式進(jìn)行引用>>>importmatplotlib.pyplotasplt從數(shù)據(jù)到圖形01基礎(chǔ)圖形下面通過一個(gè)圖形案例來熟悉Matplotlib中pyolot的基礎(chǔ)功能。在以下的例子中,將繪制正弦曲線的圖形,其思路為首先使用NumPy生成包含[0,4π]之間的等距分割的200個(gè)點(diǎn)的一維數(shù)組,計(jì)算出其對(duì)應(yīng)的正弦值,再基于這兩個(gè)數(shù)組使用pyplot生成如圖所示的圖形。>>>x=np.linspace(0,4*np.pi,200)#生成正弦曲線上的點(diǎn)的橫軸坐標(biāo)>>>y=np.sin(x)#計(jì)算正弦曲線上的點(diǎn)的縱軸坐標(biāo)>>>plt.plot(x,y)#繪制正弦曲線圖形>>>plt.show()#將生成的圖形展示plot()函數(shù)matplotlib.pyplot.plot(x,y,fmt,data,**kwargs)其中x,y是標(biāo)量或“array-like”的對(duì)象,作為數(shù)據(jù)點(diǎn)的橫軸、縱軸坐標(biāo),當(dāng)“x”沒有明確給定時(shí),其默認(rèn)為等于range(len(y));“fmt”為格式字符串,不是必須項(xiàng),用于對(duì)繪制圖形的樣式屬性進(jìn)行快速設(shè)置。其格式為“[標(biāo)記(marker)][線條(line)][顏色(color)]”,這三項(xiàng)的每一項(xiàng)都是可選的且不需明確按上述的順序。如“bo”中沒有給定線條參數(shù),代表藍(lán)色圓圈的標(biāo)記但不繪制線條。表7-1至表7-3給出了每項(xiàng)格式字符串參數(shù)常用的取值,這些屬性也可以通過關(guān)鍵字參數(shù)進(jìn)行設(shè)定;“data”是可索引對(duì)象,不是必須項(xiàng),其為有標(biāo)簽數(shù)據(jù)的對(duì)象(如字典對(duì)象),用于提供參數(shù)中的數(shù)據(jù)。格式字符串fmt中標(biāo)記樣式的常用符號(hào)符號(hào)描述符號(hào)描述'.'點(diǎn)標(biāo)記'*'星號(hào)標(biāo)記','像素標(biāo)記'h'垂直六邊形標(biāo)記'o'圓標(biāo)記'H'水平六邊形標(biāo)記'v'下三角標(biāo)記'+'加號(hào)標(biāo)記'^'上三角標(biāo)記'P'實(shí)心加號(hào)標(biāo)記'<'左三角標(biāo)記'x'叉號(hào)標(biāo)記'>'右三角標(biāo)記'X'實(shí)心加號(hào)標(biāo)記'8'八角形標(biāo)記'D'菱形標(biāo)記's'正方形標(biāo)記'|'垂直線標(biāo)記'p'五邊形標(biāo)記'_'水平線標(biāo)記格式字符串fmt中線條樣式的常用取值符號(hào)描述'-'實(shí)線樣式'--'破折線樣式'-.'點(diǎn)劃線樣式':'點(diǎn)虛線樣式格式字符串fmt中顏色的常用取值符號(hào)描述符號(hào)描述'b'藍(lán)色(Blue)'m'品紅色(magenta)'g'綠色(Green)'y'黃色(Yellow)'r'紅色(Red)'k'黑色(Black)'c'青色(Cyan)'w'白色(White)Matplotlib展現(xiàn)圖像繪制正弦曲線圖形代碼的最后一行是將結(jié)果進(jìn)行展現(xiàn)供可視化分析。Matplotlib展現(xiàn)圖像的方式可以分為三種情況:1.在腳本文件(.py)中:需要調(diào)用plt.show()函數(shù),該函數(shù)會(huì)啟動(dòng)事件循環(huán),查找所有當(dāng)前活動(dòng)的圖形對(duì)象,并打開顯示圖形交互的窗口。2.在IPython筆記本(如JupyterNotebook)中:在內(nèi)核中運(yùn)行%matplotlibinline后,創(chuàng)建繪圖的單元格都將嵌入所得圖形的PNG圖像,而無需調(diào)用plt.show()函數(shù)。3.在IPythonshell中:在啟動(dòng)后輸入%matplotlib魔術(shù)命令后,任何pyplot的繪圖命令都會(huì)打開一個(gè)圖形窗口,可以運(yùn)行更多命令來更新繪制窗口,而無需調(diào)用plt.show()函數(shù)。多組數(shù)據(jù)繪制1.多次調(diào)用plt.plot()函數(shù):此方法最為直接且最為常用。如下列代碼所示,正弦曲線使用綠色實(shí)現(xiàn)繪制,余弦曲線使用紅色虛線繪制。值得注意的是當(dāng)有多項(xiàng)數(shù)據(jù)時(shí),可以使用關(guān)鍵字參數(shù)“l(fā)abel=”明確每個(gè)數(shù)據(jù)對(duì)應(yīng)的圖像名稱,并利用plt.legend()函數(shù)將圖例進(jìn)行顯示,以便在分析時(shí)更好地認(rèn)識(shí)數(shù)據(jù)結(jié)構(gòu)。>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標(biāo)>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標(biāo)>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標(biāo)>>>plt.plot(x,y_sin,'g-',label='sin(x)')#繪制正弦曲線圖形為綠色實(shí)線>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#繪制余弦曲線圖形為紅色虛線>>>plt.legend()#顯示圖例>>>plt.show()多組數(shù)據(jù)繪制在同一個(gè)plt.plot()指定多組x,y和fmt參數(shù):此類方法只需要調(diào)用一次plt.plot()函數(shù),但需在函數(shù)內(nèi)部輸入每組(x,y,fmt)的數(shù)據(jù)。使用此種方法需要注意無法在plt.plot()函數(shù)中制定多個(gè)標(biāo)簽,故需要將標(biāo)簽信息移動(dòng)到圖例展示的函數(shù)plt.legend()中,具體代碼如下所示>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標(biāo)>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標(biāo)>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標(biāo)>>>plt.plot(x,y_sin,'g-',x,y_cos,'r-.')#同時(shí)繪制正弦曲線和余弦曲線圖形>>>plt.legend(['sinx','cosx'])#顯示圖例,并在圖例中明確正弦和余弦曲線的標(biāo)簽圖像設(shè)置通常完整的繪圖圖形還包括標(biāo)題,軸標(biāo)簽等信息,分別可以通過pyplot中的title()、xlabel()、ylabel()等函數(shù)進(jìn)行設(shè)置。同時(shí)在數(shù)據(jù)分析時(shí)常運(yùn)用到網(wǎng)格線進(jìn)行輔助觀察,這可以通過pyplot中的gird()函數(shù)設(shè)置。下列代碼將正弦與曲線圖形的橫縱軸分別標(biāo)記為x軸和y軸,設(shè)置圖形標(biāo)題為“正弦與余弦曲線”,并設(shè)置橫縱軸的網(wǎng)格線>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標(biāo)>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標(biāo)>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標(biāo)>>>plt.plot(x,y_sin,'g-',label='sin(x)')#繪制正弦曲線圖形為綠色實(shí)線>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#繪制余弦曲線圖形為紅色虛線>>>plt.legend()#顯示圖例>>>plt.xlabel('x')#設(shè)置x軸標(biāo)簽為“x”>>>plt.ylabel('y')#設(shè)置y軸標(biāo)簽為“y”>>>plt.title('GraphsofSineandCosineCruves')#設(shè)置標(biāo)題>>>plt.grid()#設(shè)置網(wǎng)格線>>>plt.show()中文支持在Matplotlib中,默認(rèn)的字體是不支持中文格式的,因此如果在上述代碼直接將標(biāo)題和軸坐標(biāo)設(shè)置為中文將會(huì)出現(xiàn)中文亂碼。若需要在圖像中顯示中文字符,有兩種方式:1.修改配置文件:Matplotlib從配置文件matplotlibrc中讀取相關(guān)配置信息,比如字體、樣式等,因此可修改此配置文件中的字體為支持中文字體的樣式。此方法雖然可以在當(dāng)前本地終端正確顯示中文,但在新的終端上運(yùn)行代碼依然存在亂碼問題,且不同操作系統(tǒng)的配置文件修改方法亦不盡相同。2.在代碼中動(dòng)態(tài)設(shè)置:直接在Python代碼中動(dòng)態(tài)設(shè)置字體信息,此方法方便靈活,亦避免了修改配置文件。如下列代碼所示,需要注意的是更改字體后會(huì)導(dǎo)致負(fù)號(hào)符號(hào)的顯示異常,故還需對(duì)符號(hào)進(jìn)行配置。同時(shí)這種方式僅針對(duì)當(dāng)前的腳本或內(nèi)核,重新啟動(dòng)內(nèi)核或運(yùn)行腳本需重新運(yùn)行這段代碼。>>>plt.rcParams['font.family']='SimHei'#指定默認(rèn)字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負(fù)號(hào)負(fù)號(hào)異常問題>>>plt.rcParams['font.family']='SimHei'#指定默認(rèn)字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負(fù)號(hào)負(fù)號(hào)異常問題中文支持>>>plt.rcParams['font.family']='SimHei'#指定默認(rèn)字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負(fù)號(hào)負(fù)號(hào)異常問題>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>plt.plot(x,y_sin,'g-',label='正弦曲線')#設(shè)置中文圖例標(biāo)簽>>>plt.plot(x,y_cos,'r-.',label='余弦曲線')#設(shè)置中文圖例標(biāo)簽>>>plt.xlabel('x軸')#設(shè)置中文x軸標(biāo)簽>>>plt.ylabel('y軸')#設(shè)置中文y軸標(biāo)簽>>>plt.title('正弦與余弦曲線圖形')#設(shè)置中文標(biāo)題>>>plt.grid()>>>plt.legend()>>>plt.show()圖像保存在完成圖形的繪制后,有時(shí)需要將其保存供后續(xù)查看分析,為此可以將plt.show()更改為plt.savefig()函數(shù)。該函數(shù)將當(dāng)前圖形畫布按指定方式保存,其接收的第一個(gè)參數(shù)為需保存為的文件名,同時(shí)可以利用“dpi=”關(guān)鍵字參數(shù)設(shè)置保存圖像的分辨率,“transparent=”關(guān)鍵字參數(shù)設(shè)置背景是否設(shè)置為透明等。如下行代碼表示將當(dāng)前圖形命名為“graph.jpeg”文件存儲(chǔ)在工作目錄下,并將存儲(chǔ)圖形的分辨率設(shè)置為300dpi,背景設(shè)置為透明。需要注意的是當(dāng)使用plt.show()后,當(dāng)前工作畫布會(huì)被清除,因此需要保存的圖形不建議調(diào)用plt.show()函數(shù)。#存儲(chǔ)當(dāng)前畫布的圖形>>>plt.savefig('graph.jpeg',dpi=300,transparent=True)統(tǒng)計(jì)圖函數(shù)描述函數(shù)描述scatter(x,y)散點(diǎn)圖hist(x)直方圖bar(x,height)垂直柱狀圖boxplot(X)箱形圖barh(y,width)水平柱狀圖errorbar(x,y,yerr,xerr)誤差線圖stem(x,y)火柴桿圖pie(x)餅圖step(x,y)階梯圖polar(theta,r)極坐標(biāo)圖散點(diǎn)圖在統(tǒng)計(jì)分析,尤其是回歸分析領(lǐng)域,常用到散點(diǎn)圖來直觀地顯示數(shù)據(jù)變量的分布情況,從而判斷數(shù)據(jù)之間是否存在某種關(guān)聯(lián)或總結(jié)分布模式。在pyplot中可以使用scatter()函數(shù)繪制散點(diǎn)圖 matplotlib.pyplot.scatter(x,y,s=None,c=None,data,**kwargs)>>>np.random.seed(42)#隨機(jī)數(shù)生成器種子>>>N=30#散點(diǎn)數(shù)量>>>data={'a':np.arange(N),#隨機(jī)生成散點(diǎn)橫坐標(biāo)
'c':np.random.randint(0,N,N),#隨機(jī)生成散點(diǎn)顏色
'd':np.random.randn(N)}#隨機(jī)生成散點(diǎn)大小序列>>>data['b']=data['a']+70*np.random.randn(N)#散點(diǎn)縱坐標(biāo)>>>data['d']=np.abs(data['d'])*500#散點(diǎn)大小幅度>>>plt.scatter('a','b',c='c',s='d',data=data)#繪制散點(diǎn)圖>>>plt.xlabel('XAxis')>>>plt.ylabel('YAxis')>>>plt.grid()>>>plt.show()垂直柱狀圖在pyplot中可以使用bar()函數(shù)繪制垂直柱狀圖 matplotlib.pyplot.bar(x,height,width=0.8,**kwargs)>>>plt.rcParams['font.family']='SimHei'#設(shè)置中文字體>>>x=['黃燜雞','魚香肉絲','水煮肉片','梅菜扣肉','糖醋里脊']#套餐類別>>>height=[25,41,25,36,19]#套餐銷量>>>plt.bar((x,height,width=0.6))#繪制垂直柱狀圖>>>plt.xlabel('套餐名稱')>>>plt.ylabel('銷量(份)')>>>plt.title('午餐套餐銷量垂直柱狀圖')>>>plt.show()水平柱狀圖在pyplot中可以使用bar()函數(shù)繪制垂直柱狀圖 matplotlib.pyplot.bar(y,width,height=0.8,**kwargs)>>>plt.rcParams['font.family']='SimHei'>>>y=['黃燜雞','魚香肉絲','水煮肉片','梅菜扣肉','糖醋里脊']>>>width=[25,41,25,36,19]>>>plt.barh(y,width,height=0.6)#繪制水平柱狀圖>>>plt.xlabel('套餐名稱')>>>plt.ylabel('銷量(份)')>>>plt.title('午餐套餐銷量水平柱狀圖')>>>plt.show()直方圖不同于柱狀圖,直方圖是一種可視化在連續(xù)間隔,或者是特定時(shí)間段內(nèi)數(shù)據(jù)分布情況的圖形。其描述數(shù)據(jù)的頻次分布,并能夠直觀顯示數(shù)據(jù)的眾數(shù)、中位數(shù)、缺失值與異常值等統(tǒng)計(jì)信息。在pyplot中可以使用hist()函數(shù)繪制垂直柱狀圖,其語法格式如下 matplotlib.pyplot.hist(x,**kwargs)>>>x1=np.random.normal(0,2,1100)#生成正態(tài)分布數(shù)據(jù)>>>x2=np.random.normal(-5,1,900)#生成正態(tài)分布數(shù)據(jù)>>>x3=np.random.normal(4,1,700)#生成正態(tài)分布數(shù)據(jù)>>>kwargs={'bins':30,'alpha':0.5}#將關(guān)鍵字參數(shù)保存至字典中>>>plt.hist(x1,**kwargs)#繪制直方圖>>>plt.hist(x2,**kwargs)#繪制直方圖>>>plt.hist(x3,**kwargs)#繪制直方圖>>>plt.xlabel('Data')>>>plt.ylabel('Amount')>>>plt.show()餅圖餅圖是一種劃分為幾個(gè)扇形的圓形圖標(biāo),常用來可視化描述數(shù)量、頻率或百分比之間的相對(duì)關(guān)系。在pyplot中可以使用pie()函數(shù)繪制餅圖,其語法格式如下 matplotlib.pyplot.hist(x,**kwargs)>>>plt.rcParams['font.family']='SimHei'>>>x=[25,41,25,36,19]>>>labels=['黃燜雞','魚香肉絲','水煮肉片','梅菜扣肉','糖醋里脊']>>>explode=(0,0,0,0,0.15)#設(shè)置分離顯示的扇形>>>plt.pie(x,explode,labels,autopct='%1.1f%%')#繪制餅圖>>>plt.title('午餐套餐銷量水平柱狀圖')>>>plt.show()極坐標(biāo)圖極坐標(biāo)圖是使用值和角度來將信息顯示為極坐標(biāo)的圓形圖,當(dāng)數(shù)據(jù)點(diǎn)之間的關(guān)系可以根據(jù)半徑和角度可視化時(shí),它非常實(shí)用。其常用用于科學(xué)計(jì)算的分析,同時(shí)也可以繪制雷達(dá)圖等可視化圖形。在pyplot中,既可以在plot()函數(shù)中設(shè)置極坐標(biāo),也可以直接使用polar()函數(shù)繪制垂直柱狀圖,其語法格式如下
matplotlib.pyplot.polar(theta,r,**kwargs)>>>rad=np.arange(0,2*np.pi,0.01)#生成數(shù)據(jù)>>>foriinrad:...r=i...plt.polar(i,r,'g.')#繪制極坐標(biāo)圖>>>plt.show()數(shù)組繪制在Matplotlib中,若要顯示二維數(shù)組或特定的三維數(shù)組,可以使用pyplot中的imshow()函數(shù),其通常用于圖像的繪制與顯示。語法格式如下:matplotlib.pyplot.imshow(x,cmap=None,norm=None,**kwargs)其中,x為“array-like”的對(duì)象或者PIL圖像,其支持的形狀有:1.(M,N):標(biāo)量數(shù)據(jù)的圖像,M和N分別定義了圖像的行和列,圖像的值通過‘norm’和‘cmap’的參數(shù)設(shè)置轉(zhuǎn)化為顏色;2.(M,N,3):RGB值的圖像,M和N分別定義了圖像的行和列,支持0-1的浮點(diǎn)數(shù)或0-255的整數(shù),超出范圍的值將被裁剪;3.(M,N,4):RGBA值的圖像,M和N分別定義了圖像的行和列,其中第4維度(即A維度)為透明度,超出范圍的值將被裁剪。cmap為字符串或“Colormap”對(duì)象,用于將標(biāo)量數(shù)據(jù)映射到色彩空間,對(duì)于RGB(A)格式的數(shù)據(jù),此參數(shù)將被忽略;norm用來將數(shù)據(jù)標(biāo)量映射至色彩空間前將數(shù)據(jù)縮放至[0,1]之間的范圍,默認(rèn)采取線性縮放,對(duì)于RGB(A)格式的數(shù)據(jù),此參數(shù)將被忽略;imshow()還有豐富的關(guān)鍵字參數(shù)用來控制圖像顯示的效果,讀者可自行查閱Matplotlib官方文檔。以下通過幾個(gè)案例闡述imshow()函數(shù)的用法:條形碼圖繪制條形碼是典型的二維單色圖像,下列代碼首先將定義一維的NumPy數(shù)組,其中“0”代表白色,“1”代表黑色,接著設(shè)置圖像畫布大小,隨后利用imshow()函數(shù)繪制條形碼圖,這里“aspect=”關(guān)鍵字需要設(shè)置成“auto”,該參數(shù)代表軸的橫縱比,當(dāng)設(shè)置為“auto”時(shí),軸域的長度保持固定并調(diào)整橫縱比以適應(yīng)圖形>>>code=np.array([1,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,1,0,1,0,1,1,1,0,0,1,0,0,0,1,1,0,1,1,1])>>>pixel_per_bar=4#單個(gè)條碼的像素>>>dpi=100>>>plt.figure(figsize=(len(code)*pixel_per_bar/dpi,2))#設(shè)置畫布>>>plt.imshow(code.reshape(1,-1),cmap='binary',aspect='auto')#繪制條形碼>>>plt.axis('off')>>>plt.show()分類熱力圖繪制分類熱力圖通常用來直觀顯示兩組分類變量之間的強(qiáng)度分布關(guān)系。下列代碼用于繪制某村各家戶作物收成的熱力圖。>>>plt.rcParams['font.family']='SimHei'>>>vegetables=["黃瓜","番茄","生菜","蘆筍","馬鈴薯","小麥","大麥"]>>>farmers=["老王家","老李家.","老孫家","老謝家","老劉家","小亮家","大慶家"]>>>harvest=np.array([[0.8,2.4,2.5,3.9,0.0,4.0,0.0],[2.4,0.0,4.0,1.0,2.7,0.0,0.0],[1.1,2.4,0.8,4.3,1.9,4.4,0.0],[0.6,0.0,0.3,0.0,3.1,0.0,0.0],[0.7,1.7,0.6,2.6,2.2,6.2,0.0],[1.3,1.2,0.0,0.0,0.0,3.2,5.1],[0.1,2.0,0.0,1.4,0.0,1.9,6.3]])>>>plt.imshow(harvest)#繪制熱力圖>>>plt.xticks(np.arange(len(farmers)),labels=farmers,rotation=45)>>>plt.yticks(np.arange(len(vegetables)),labels=vegetables)#給每個(gè)單元增加文字注釋>>>foriinrange(len(vegetables)):forjinrange(len(farmers)):text=plt.text(j,i,harvest[i,j],ha="center",va="center",color="w")>>>plt.title("各家戶作物收成(噸/年)")>>>plt.colorbar()#顯示色階的顏色欄>>>plt.show()圖像顯示imshow()另一個(gè)常用的功能是用來顯示圖片,下列代碼首先利用pyplot中的imread()函數(shù)讀取目錄下的“Panda.jpg”圖片為NumPy數(shù)組,使用imshow()函數(shù)將數(shù)組顯示為圖片>>>img=plt.imread('Panda.jpg')#將圖像讀取為NumPy數(shù)組#type(img):numpy.ndarray#img.shape:(480,720,3)>>>plt.imshow(img)#將數(shù)組顯示為圖像>>>plt.show()面向?qū)ο蟮睦L圖模式02圖形對(duì)象在Matplotlib中,每個(gè)繪圖中都有一個(gè)樹狀結(jié)構(gòu)的Matplotlib對(duì)象。具體來說,最外層容器為畫布(Figure)對(duì)象,其可以包含一個(gè)或多個(gè)軸域(Axes)對(duì)象;每個(gè)軸域(Axes)代表一個(gè)實(shí)際的繪圖單元,其層次結(jié)構(gòu)的下方是如刻度線、坐標(biāo)軸、圖例、線條、文字等繪圖中的基礎(chǔ)類對(duì)象。整體的層次結(jié)構(gòu)如圖7-14所示,而這其中每一個(gè)元素都是可以獨(dú)立控制的Python對(duì)象。創(chuàng)建步驟1.創(chuàng)建畫布(Figure)實(shí)例2.在畫布(Figure)上創(chuàng)建軸域(Axes)實(shí)例3.在每個(gè)軸域(Axes)中添加基礎(chǔ)類對(duì)象面向?qū)ο蟮哪J嚼L圖下列代碼以面向?qū)ο蟮哪J嚼L制正弦曲線圖形。首先創(chuàng)建畫布實(shí)例為fig,隨后在fig上使用add_axes()方法構(gòu)建軸域?qū)嵗齛x,并設(shè)置軸域起點(diǎn)在畫布的左下角,寬度和高度與畫布的相等,最后在ax上進(jìn)行圖形繪制和樣式設(shè)置>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y=np.sin(x)>>>fig=plt.figure(dpi=300)#創(chuàng)建畫布實(shí)例fig>>>fig.tight_layout()>>>ax=fig.add_axes([0,0,1,1])#在畫布上添加軸域?qū)嵗齛x>>>ax.plot(x,y)#在軸域中繪圖>>>ax.set(xlabel='x軸',ylabel='y軸',title='正弦曲線圖形')#設(shè)置軸域>>>plt.show()子圖繪制在進(jìn)行可視化分析時(shí),并排比較不同的數(shù)據(jù)視圖有時(shí)會(huì)對(duì)分析起到較大的幫助,為此,可以利用Matplotlib中的子圖,即在單個(gè)畫布中劃分不同的軸域,并在每個(gè)單獨(dú)的軸域上繪制不同的圖形。常用的子圖繪制有subplot()和subplots()兩種常用的方法。基于subplot()的子圖繪制>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>plt.subplot(2,1,1)#設(shè)置索引為1的子圖>>>plt.plot(x,y_sin)#繪制正弦曲線>>>plt.grid()>>>plt.title('正弦曲線圖形')>>>plt.subplot(2,1,2)#設(shè)置索引為2的子圖>>>plt.plot(x,y_cos)#繪制余弦曲線>>>plt.title('余弦曲線圖形')>>>plt.grid()>>>plt.tight_layout()>>>plt.show()基于subplots()的子圖繪制>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>y_tan=np.tan(x)#2行2列4個(gè)子圖,同列共用橫軸>>>fig,ax=plt.subplots(2,2,sharex='col')>>>fig.tight_layout()#第一個(gè)子圖繪制>>>ax[0,0].plot(x,x)>>>ax[0,0].set_title('自變量值')>>>ax[0,0].grid()#第二個(gè)子圖繪制>>>ax[0,1].plot(x,y_sin)>>>ax[0,1].set_title('正弦曲線圖形')>>>ax[0,1].grid()#第三個(gè)子圖繪制>>>ax[1,0].plot(x,y_cos)>>>ax[1,0].set_title('余弦曲線圖形')>>>ax[1,0].grid()#第四個(gè)子圖繪制>>>ax[1,1].plot(x,y_tan)>>>ax[1,1].set_title('正切曲線圖形')>>>ax[1,1].grid()>>>plt.show()文字注釋在可視化分析的過程中,很多情況需要對(duì)圖表中的信息進(jìn)行文字標(biāo)識(shí)和注解,以求更完整地描述圖形。在之前的章節(jié)中已運(yùn)用了標(biāo)題、軸標(biāo)簽、圖例等形式注釋圖形,當(dāng)需要更細(xì)致的文字注釋時(shí),可以運(yùn)用到text()和annotate()等函數(shù)text()函數(shù)>>>fig,ax=plt.subplots(2,2)>>>foriinrange(2):...forjinrange(2):...ax[i,j].text(0.5,0.5,str((i,j)),fontsize=25,ha='center')...ax[i,j].set_xticks([])#隱藏x軸刻度標(biāo)簽...ax[i,j].set_yticks([])#隱藏y軸刻度標(biāo)簽>>>plt.show()annotate()函數(shù)>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>fig,ax=plt.subplots()>>>fig.tight_layout()>>>ax.plot(x,y_sin)>>>ax.annotate('最高點(diǎn)',(0.5*np.pi,1),(4,0.5),fontsize=15,bbox=dict(boxstyle="round",fc="none",arrowprops=dict(arrowstyle="->"))>>>ax.annotate('最低點(diǎn)',(1.5*np.pi,-1),(8,-1),fontsize=15,arrowprops=dict(arrowstyle='fancy'))>>>plt.show()實(shí)例:人口金字塔可視化分析03問題分析在對(duì)某地人口進(jìn)行分析時(shí),人口金字塔是一項(xiàng)十分重要的可視化分析工具。其按男女人口年齡自然順序自下而上在縱軸左右畫成并列的橫條柱,各條柱代表各個(gè)年齡組,用于表現(xiàn)某時(shí)間點(diǎn)上的年齡直方圖,能夠直觀地反映當(dāng)?shù)厝丝跀?shù)據(jù)、老齡化程度、生育年齡人口、人口撫養(yǎng)比、未來的出生率和死亡率等關(guān)鍵數(shù)據(jù),是各類涉及人口發(fā)展或規(guī)劃的基礎(chǔ)。在本節(jié)中,將讀取某地的人口數(shù)據(jù),采用可視化手段對(duì)其分析,并構(gòu)建人口金字塔圖形。數(shù)據(jù)導(dǎo)入和風(fēng)格設(shè)置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.style.use('seaborn-whitegrid')#風(fēng)格設(shè)置>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False人口數(shù)據(jù)提取使用np.loadtext()函數(shù)將數(shù)據(jù)導(dǎo)入為NumPy數(shù)組以便后續(xù)分析。在導(dǎo)入時(shí)需跳過第一行表頭的數(shù)據(jù)。導(dǎo)入后使用索引將代表男性和女性的年齡人口數(shù)據(jù)分別賦值給兩個(gè)新變量。實(shí)際上,使用Pandas(PythonDataAnalysisLibrary)庫可以對(duì)csv格式的數(shù)據(jù)進(jìn)行更便捷的讀取,后續(xù)的章節(jié)將對(duì)Pandas的使用方法進(jìn)行介紹。>>>np.set_printoptions(suppress=True)#設(shè)置不使用科學(xué)計(jì)數(shù)法#導(dǎo)入數(shù)據(jù)>>>data_2020=np.loadtxt("Population2020.csv",delimiter=",",skiprows=1,usecols=(1,2))>>>male_2020=data_2020[:,0]>>>female_2020=data_2020[:,1]人口數(shù)據(jù)提取由于年齡段以5歲為間隔,可以使用列表生成式快速地生成包含年齡段字符串的列表,賦值給age變量,對(duì)于末尾的“大于100歲”,使用列表的append()方法進(jìn)行添加>>>age=['{}至{}歲'.format(5*i,5*(i+1)-1)foriinrange(20)]>>>age.append('大于100歲')>>>print(age)['0至4歲','5至9歲','10至14歲','15至19歲','20至24歲','25至29歲','30至34歲','35至39歲','40至44歲','45至49歲','50至54歲','55至59歲','60至64歲','65至69歲','70至74歲','75至79歲','80至84歲','85至89歲','90至94歲','95至99歲','大于100歲']人口數(shù)據(jù)提取下一步,計(jì)算每個(gè)年齡段、每個(gè)性別的人口數(shù)量占總?cè)丝诘陌俜直取J紫扔?jì)算人口總數(shù),使用NumPy數(shù)組的廣播功能可以快速地計(jì)算百分比,如下列代碼所示#計(jì)算人口總數(shù)>>>sum_pop_2020=np.sum(data_2020)#計(jì)算男性占比>>>male_2020_pct=male_2020/sum_pop_2020#計(jì)算女性占比>>>female_2020_pct=female_2020/sum_pop_2020>>>str_male_2020_pct=','.join(str('{:.2}%').format(i*100)foriinmale_2020_pct).split(',')>>>str_female_2020_pct=','.join(str('{:.2}%').format(i*100)foriinfemale_2020_pct).split(',')人口數(shù)據(jù)提取接下來可以使用print()函數(shù)對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行解讀,以女性數(shù)據(jù)為例>>>print('2020年女性數(shù)據(jù):')...fori,vinenumerate(age):...print('{}占總?cè)丝诘膡}'.format(v,str_female_2020_pct[i]))2020年女性數(shù)據(jù):0至4歲占總?cè)丝诘?.7%5至9歲占總?cè)丝诘?.8%10至14歲占總?cè)丝诘?.7%15至19歲占總?cè)丝诘?.7%20至24歲占總?cè)丝诘?.8%25至29歲占總?cè)丝诘?.2%30至34歲占總?cè)丝诘?.3%35至39歲占總?cè)丝诘?.4%40至44歲占總?cè)丝诘?.3%45至49歲占總?cè)丝诘?.1%50至54歲占總?cè)丝诘?.2%55至59歲占總?cè)丝诘?.4%60至64歲占總?cè)丝诘?.7%65至69歲占總?cè)丝诘?.6%70至74歲占總?cè)丝诘?.6%75至79歲占總?cè)丝诘?.0%80至84歲占總?cè)丝诘?.65%85至89歲占總?cè)丝诘?.33%90至94歲占總?cè)丝诘?.11%95至99歲占總?cè)丝诘?.025%大于100歲占總?cè)丝诘?.0043%可視化人口數(shù)據(jù)以女性數(shù)據(jù)為例,進(jìn)行餅圖的繪制,下列代碼繪首先將畫布尺寸設(shè)置為寬和高分別為7英寸,使用plt.pie()函數(shù)將2020年女性年齡人口數(shù)據(jù)繪制為餅圖,其中注釋采用之前定義的f_pct函數(shù)來隱藏百分比占比在1%以下的數(shù)據(jù),并確定注釋顏色為白色,在餅圖右側(cè)繪制圖例>>>f_pct=lambdapct:('{:.2f}%'.format(pct))ifpct>1else''>>>plt.figure(figsize=(7,7))>>>plt.pie(female_2020,autopct=f_pct,textprops=dict(color="w"))>>>plt.legend(age,title="年齡段",loc="centerleft",bbox_to_anchor=(1,0,0.5,1))>>>plt.title('2020年女性年齡分布餅圖')>>>plt.show()可視化人口數(shù)據(jù)餅圖雖然能展示出數(shù)據(jù)的結(jié)構(gòu)信息,但在數(shù)據(jù)比較時(shí)卻不夠直觀。另一種常用于針對(duì)數(shù)據(jù)分布情況的可視化分析工具是柱狀圖。下列代碼首先制定一行二列包含二幅子圖的畫布,尺寸為寬20英尺、高7英尺。第一幅子圖繪制男性數(shù)據(jù)的柱狀圖,第二幅子圖繪制女性數(shù)據(jù)的柱狀圖,并使用ax.set()函數(shù)對(duì)每幅子圖的軸標(biāo)簽、刻度標(biāo)簽進(jìn)行調(diào)整。每幅子圖的橫軸代表年齡段、縱軸代表人口數(shù),由于圖形的限制,還需要調(diào)整橫軸的軸標(biāo)簽旋轉(zhuǎn)90度以避免混疊>>>fig,ax=plt.subplots(1,2,figsize=(20,7))>>>ax[0].bar(age,male_2020)>>>ax[0].set(xlabel='年齡段',ylabel='人口數(shù)',title='2020年男性年齡分布柱狀圖',yticks=[0,10000000,20000000,30000000,40000000,50000000,60000000,70000000],yticklabels=['0',r'$1\times10^7$',r'$2\times10^7$',r'$3\times10^7$',r'$4\times10^7$',r'$5\times10^7$',r'$6\times10^7$',r'$7\times10^7$'])>>>ax[0].tick_params(axis='x',labelrotation=90)#旋轉(zhuǎn)橫軸標(biāo)簽90度>>>ax[1].bar(age,female_2020,color='#CC6699')>>>ax[1].set(xlabel='年齡段',ylabel='人口數(shù)',title='2020年女性年齡分布柱狀圖',yticks=[0,10000000,20000000,30000000,40000000,50000000,60000000,70000000],yticklabels=['0',r'$1\times10^7$',r'$2\times10^7$',r'$3\times10^7$',r'$4\times10^7$',r'$5\times10^7$',r'$6\times10^7$',r'$7\times10^7$'])>>>ax[1].tick_params(axis='x',labelrotation=90)#旋轉(zhuǎn)橫軸標(biāo)簽90度>>>plt.show()人口金字塔前一節(jié)提到,使用柱狀圖可以較直觀的闡述數(shù)據(jù)中各個(gè)類別之間的關(guān)系,但無法較好地結(jié)合年齡與性別的數(shù)據(jù)。為此,可采取人口金字塔的方式進(jìn)行可視化分析。人口金字塔又被稱為“性別—年齡金字塔”,其按照年齡和性別劃分某階段某一地區(qū)的人口,其由連續(xù)堆疊的水平直方圖構(gòu)成,每個(gè)條的大小可以顯示為總?cè)丝诘陌俜直然蛉丝跀?shù)字,在大部分情況下男性數(shù)據(jù)分布在左側(cè)而女性數(shù)據(jù)分布在右側(cè)。人口金字塔經(jīng)可以清晰地可視化人口性別和年齡分布,從而推導(dǎo)出地區(qū)人口依賴性、生育水平、人口撫養(yǎng)比等關(guān)鍵指標(biāo),能為人口發(fā)展政策的制定提供有效的支撐。通常來說,人口金字塔可分為擴(kuò)張型、穩(wěn)定型和縮減型三種類型:1.擴(kuò)張型:年輕人口比重較大,從最低年齡段到最高年齡段依次逐漸縮小,人口金字塔的塔形下寬上尖,這類地區(qū)有較好的人口增長快速。2.穩(wěn)定型。除最老年齡組外,其余各年齡段大致相差不多,擴(kuò)大或縮小均不明顯,人口金字塔的塔形較直,這類地區(qū)出生人數(shù)和死亡人數(shù)大致平衡,人口保持穩(wěn)定。3.縮減型。年輕人口有規(guī)則的逐漸縮小,中年以上各年齡段比重較大,人口金字塔的塔形下窄上寬,這類地區(qū)死亡率較低,但出生率也較低,可能出現(xiàn)高撫養(yǎng)比。人口金字塔繪制>>>fig,ax=plt.subplots(figsize=(17,12))>>>fig.tight_layout()>>>bar_male=ax.barh(age,-male_2020,label='男',color='#6699FF')>>>bar_female=ax.barh(age,female_2020,label='女',color='#CC6699')>>>ax.bar_label(bar_male,labels=str_male_2020_pct,size=16,label_type='edge',padding=5)>>>ax.bar_label(bar_female,labels=str_female_2020_pct,size=16,label_type='edge',padding=5)>>>ax.legend(prop={'size':20})>>>ax.set_xticks([-60000000,-40000000,-20000000,0,20000000,40000000,60000000])>>>ax.set_xticklabels([r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$','0',r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$'],fontsize=16)>>>ax.set_yticklabels(age,fontsize=16)>>>ax.set_ylabel('年齡段',fontsize=16)>>>ax.set_xlabel('人數(shù)',fontsize=16)>>>ax.set_title('2020年人口金字塔',fontsize=25)>>>plt.show()實(shí)例:電商數(shù)據(jù)可視化分析04問題分析隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,在線購物平臺(tái)使全國乃至全世界各地的人在同一平臺(tái)上瀏覽、購買和銷售數(shù)據(jù)成為可能。為用戶提供良好的用戶體驗(yàn)并提升用戶滿意度是在線購物平臺(tái)最首要的任務(wù),這需要對(duì)用戶進(jìn)行合理且確切的分析,了解用戶群及其偏好,為用戶提供個(gè)性化的服務(wù)。在本節(jié)中,將讀取某電商公司的銷售與用戶信息數(shù)據(jù),采用可視化手段對(duì)其進(jìn)行多維度的分析,以挖掘有價(jià)值的信息。數(shù)據(jù)導(dǎo)入和風(fēng)格設(shè)置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False電商數(shù)據(jù)提取該數(shù)據(jù)集一共由8項(xiàng)特征組成,本案例中需要用“商品編號(hào)”、“性別”、“年齡”、“職業(yè)類型”、“購買金額”共5項(xiàng)特征用于可視化分析。使用np.loadtext()將每項(xiàng)特征導(dǎo)入為NumPy數(shù)組供后續(xù)分析使用,導(dǎo)入時(shí)需跳過第一行表頭內(nèi)容,并注意特征數(shù)據(jù)的格式:前3項(xiàng)特征的數(shù)據(jù)格式為字符串,后2項(xiàng)特征的數(shù)據(jù)格式為浮點(diǎn)數(shù)。#商品編號(hào)數(shù)據(jù)>>>product_id=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(2),dtype=np.str_,encoding='utf_8_sig')#性別數(shù)據(jù)>>>gender=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(3),dtype=np.str_,encoding='utf_8_sig')#年齡數(shù)據(jù)>>>age=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(4),dtype=np.str_,encoding='utf_8_sig')#職業(yè)類型數(shù)據(jù)>>>occupation=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(5),encoding='utf_8_sig')#購買金額數(shù)據(jù)>>>purchase=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(8),encoding='utf_8_sig')銷售量與銷售額前十位的商品>>>defgroupby(x):...x_uniques=np.unique(x)...return{xi:np.where(x==xi)forxiinx_uniques}#根據(jù)商品編號(hào)分組>>>id_index=groupby(product_id)#計(jì)算每種商品編號(hào)的銷售總額并按降序排序>>>purchase_group={key:purchase[id_index[key]].sum()forkeyinid_index.keys()}>>>sorted_purchase=sorted(purchase_group.items(),key=lambdakv:(kv[1],kv[0]),reverse=True)>>>purchase_top_label=[i[0]foriinsorted_purchase[:10]]>>>purchase_top_data=[i[1]foriinsorted_purchase[:10]]#計(jì)算每種商品編號(hào)的數(shù)量并按降序排序>>>product_group={key:id_index[key][0].shape[0]forkeyinid_index.keys()}>>>sorted_product=sorted(product_group.items(),key=lambdakv:(kv[1],kv[0]),reverse=True)>>>purchase_count_top_label=[i[0]foriinsorted_product[:10]]>>>purchase_count_top_data=[i[1]foriinsorted_product[:10]]#對(duì)銷售額和銷售量前十位的商品進(jìn)行可視化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(purchase_top_label,purchase_top_data,'co-')>>>ax[0].grid()>>>ax[0].set_xlabel('商品編號(hào)')>>>ax[0].set_ylabel('商品銷售額')>>>ax[0].set_title('銷售額前十位的商品',fontsize='20')>>>ax[1].plot(purchase_count_top_label,purchase_count_top_data,'yo-')>>>ax[1].grid()>>>ax[1].set_xlabel('商品編號(hào)')>>>ax[1].set_ylabel('商品銷售量')>>>ax[1].set_title('銷售量前十位的商品',fontsize='20')>>>plt.show()銷售量與銷售額后十位的商品#銷售額后十位的商品>>>purchase_last_label=[i[0]foriinsorted_purchase[-10:]]>>>purchase_last_data=[i[1]foriinsorted_purchase[-10:]]#銷售量后十位的商品>>>purchase_count_last_label=[i[0]foriinsorted_product[-10:]]>>>purchase_count_last_data=[i[1]foriinsorted_product[-10:]]#對(duì)銷售額和銷售量后十位的商品進(jìn)行可視化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(purchase_last_label,purchase_last_data,'co-')>>>ax[0].grid()>>>ax[0].set_xlabel('商品編號(hào)')>>>ax[0].set_ylabel('商品銷售額')>>>ax[0].set_title('銷售額后十位的商品',fontsize='20')>>>ax[1].plot(purchase_count_last_label,purchase_count_last_data,'yo-')>>>ax[1].grid()>>>ax[1].set_xlabel('商品編號(hào)')>>>ax[1].set_ylabel('商品銷售量')>>>ax[1].set_title('銷售量后十位的商品',fontsize='20')>>>plt.show()各年齡段消費(fèi)水平統(tǒng)計(jì)圖#根據(jù)年齡分組>>>age_index=groupby(age)#計(jì)算消費(fèi)者中每個(gè)年齡段消費(fèi)額的平均值>>>ages_purchase_mean={key:purchase[age_index[key]].mean()forkeyinage_index.keys()}>>>ages_purchase_mean_label=[iforiinages_purchase_mean.keys()]>>>ages_purchase_mean_data=[iforiinages_purchase_mean.values()]#計(jì)算消費(fèi)者中每個(gè)年齡的總消費(fèi)額>>>ages_purchase_sum={key:purchase[age_index[key]].sum()forkeyinage_index.keys()}>>>ages_purchase_sum_label=[iforiinages_purchase_sum.keys()]>>>ages_purchase_sum_data=[iforiinages_purchase_sum.values()]#對(duì)年齡段與消費(fèi)水平的關(guān)系進(jìn)行可視化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].plot(ages_purchase_mean_label,ages_purchase_mean_data,'gs-')>>>ax[0].grid();>>>ax[0].set_xlabel('年齡段')>>>ax[0].set_ylabel('平均消費(fèi)額(元)')>>>ax[0].set_title('各年齡段平均消費(fèi)額',fontsize='20')>>>ax[1].plot(ages_purchase_sum_label,ages_purchase_sum_data,'rs-')>>>ax[1].grid()>>>ax[1].set_xlabel('年齡段')>>>ax[1].set_ylabel('總消費(fèi)額(元)')>>>ax[1].set_title('各年齡段總消費(fèi)額',fontsize='20')>>>plt.show()消費(fèi)者年齡與性別分布圖#計(jì)算消費(fèi)者中每個(gè)年齡段的人數(shù)>>>age_group={key:age_index[key][0].shape[0]forkeyinage_index.keys()}>>>ages_group_label=[iforiinage_group.keys()]>>>ages_group_data=[iforiinage_group.values()]#計(jì)算消費(fèi)者中男性與女性的占比>>>gender_label,gender_data=np.unique(gender,return_counts=True)>>>gender_label=np.array(['女性','男性'])#對(duì)消費(fèi)者的年齡與性別分布進(jìn)行可視化分析>>>fig,ax=plt.subplots(1,2,figsize=(16,8),dpi=300)>>>ax[0].pie(ages_group_data,labels=ages_group_label,autopct='%d%%',colors=['orange','salmon','lightgreen','gold','yellowgreen','turquoise','darkorange','y'])>>>ax[0].axis('equal')>>>ax[0].set_title("消費(fèi)者年齡分布圖",fontsize='20')>>>ax[1].pie(gender_data,labels=gender_label,autopct='%d%%',colors=['yellowgreen','darkorange'])>>>ax[1].axis('equal')>>>ax[1].set_title("消費(fèi)者性別分布圖",fontsize='20')>>>plt.show()消費(fèi)者職業(yè)類型分布與消費(fèi)水平關(guān)系圖#計(jì)算消費(fèi)者中每種職業(yè)類別的人數(shù)>>>occupation_label,occupation_data=np.unique(occupation,return_counts=True)#按照職業(yè)類型進(jìn)行分組>>>occupation_index=groupby(occupation)#計(jì)算每種職業(yè)類型的平均消費(fèi)額>>>occupation_purchase_group={key:purchase[occupation_index[key]].mean()forkeyinoccupation_index.keys()}>>>occupation_purchase_label=[iforiinoccupation_purchase_group.keys()]>>>occupation_purchase_data=[iforiinoccupation_purchase_group.values()]#對(duì)職業(yè)類型和消費(fèi)水平的關(guān)系進(jìn)行可視化分析>>>fig,ax=plt.subplots(2,1,figsize=(16,12),dpi=300)>>>ax[0].bar(occupation_label,occupation_data,color='purple')>>>ax[0].set_xticks(occupation_label)>>>ax[0].set_xlabel('職業(yè)類型')>>>ax[0].set_ylabel('人數(shù)')>>>ax[0].set_title('消費(fèi)者中的職業(yè)類型分布',fontsize='20')>>>ax[1].plot(occupation_purchase_label,occupation_purchase_data,'ro-')>>>ax[1].grid();>>>ax[1].set_xlabel('職業(yè)類型');>>>ax[1].set_ylabel('平均消費(fèi)額(元)');>>>ax[1].set_title('各職業(yè)的平均消費(fèi)額',fontsize='20');>>>ax[1].set_xticks(occupation_purchase_label)>>>plt.show()實(shí)例:氣象數(shù)據(jù)可視化分析05問題分析氣象信息數(shù)據(jù)與民生息息相關(guān),尤其是在指導(dǎo)生產(chǎn)與生活中起著舉足輕重的作用。如人們每天都習(xí)慣查看氣象軟件或氣象新聞,了解當(dāng)?shù)氐臏囟?、降雨情況,安排出行計(jì)劃。隨著獲取氣象數(shù)據(jù)的手段逐漸增加,合理地對(duì)氣象數(shù)據(jù)進(jìn)行探索與可視化分析能夠?yàn)闅庀蟊O(jiān)測、氣象預(yù)報(bào)與災(zāi)害預(yù)警提供有效的科學(xué)支撐。在本節(jié)中,將讀取上海2021年全年的氣象數(shù)據(jù),使用可視化手段對(duì)溫度、降雨、氣候、風(fēng)向等信息開展全面的分析。數(shù)據(jù)導(dǎo)入和風(fēng)格設(shè)置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromscipy.statsimportnorm>>>plt.style.use('s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024消毒毛巾配送合同書
- 2024年香薰文具項(xiàng)目可行性研究報(bào)告
- 2024煤氣管道安裝工程合同
- 建筑工程清包人工費(fèi)承包合同
- 2024木工承包合同內(nèi)腳手架
- 2024服裝購銷合同范本簡單
- 2024廣州事業(yè)單位勞動(dòng)合同范本
- 2024燕窩購銷合同書
- 腦卒中康復(fù)實(shí)訓(xùn)課程設(shè)計(jì)
- 統(tǒng)考版2025屆高考英語一輪復(fù)習(xí)板塊4第1講對(duì)點(diǎn)沖關(guān)訓(xùn)練課時(shí)提能練含解析北師大版
- 小班美術(shù)教案:小兔家的新門簾教案及教學(xué)反思
- 人工智能在體育運(yùn)動(dòng)中的運(yùn)用
- 心電監(jiān)護(hù)技術(shù)操作并發(fā)癥的預(yù)防與處理
- 殘聯(lián)交流經(jīng)驗(yàn)發(fā)言模板
- 儲(chǔ)運(yùn)部主管競聘報(bào)告培訓(xùn)課件
- 2024再生鋼鐵原料
- 新媒體視聽節(jié)目制作 第七章 作品的編輯構(gòu)思
- 2023年康復(fù)醫(yī)學(xué)治療技術(shù)(士)考試題庫匯總500道含解析836
- 后進(jìn)生會(huì)議:揚(yáng)起風(fēng)帆向前進(jìn)
- 挖掘機(jī)使用管理安全技術(shù)措施
- 機(jī)動(dòng)車強(qiáng)制報(bào)廢標(biāo)準(zhǔn)規(guī)定細(xì)則范本
評(píng)論
0/150
提交評(píng)論