pandas實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼
在pandas 基礎(chǔ)操作大全之?dāng)?shù)據(jù)讀取&清洗&分析 以及 pandas基礎(chǔ)操作大全之?dāng)?shù)據(jù)合并 中介紹了pandas常見的數(shù)據(jù)處理操作以及常用的數(shù)據(jù)合并操作,本文繼續(xù)對(duì)pandas數(shù)據(jù)可視化操作做下介紹,便于大家快速了解,也方便后續(xù)需要時(shí)快速查詢。
一、概述
1.1 plot函數(shù)參數(shù)
數(shù)據(jù)可視化,一般用Matplotlib庫(kù),該庫(kù)可與MATLAB作圖相媲美,允許完全按照自己的意愿自定義圖表的展示方式,但相較于日??焖龠M(jìn)行數(shù)據(jù)分析和可視化,用起來(lái)相對(duì)繁瑣,故pandas基于該庫(kù),重新封裝了plot方法,該方法還對(duì)Series和DataFrame數(shù)據(jù)格式進(jìn)行了特定的優(yōu)化,本文主要講解pandas的數(shù)據(jù)可視化工具,首先講解plot函數(shù)常用參數(shù)的含義。
#pandas主要使用plot函數(shù)進(jìn)行數(shù)據(jù)可視化繪圖,完整表達(dá)式如下,本文僅羅列常見的參數(shù),其他參數(shù)待用到時(shí),可自行學(xué)習(xí) df.plot( x='A',#即繪圖x軸用的數(shù)據(jù)列標(biāo)簽,如果不指定,則默認(rèn)為index y='B',#即繪圖y軸用的數(shù)據(jù)列標(biāo)簽,可指定一個(gè),也可指定多個(gè),指定多個(gè)使用列表格式['A', 'B'] use_index=True,#設(shè)置是否用DF的index行索引作為x軸,默認(rèn)是True,當(dāng)x不傳入值時(shí),便用index kind='line',#即繪圖用的圖表類型,枚舉有l(wèi)ine(折線)、bar(條形圖)、barh(橫向條形圖)、hist(柱狀圖)、box(箱線圖或蠟燭圖)、area(面積圖)、pie(餅圖)、scatter(散點(diǎn)圖)等 subplots=True,#子圖,即如果y指定的是多列,則將每列分為一個(gè)子圖,與layout一起使用 layout=(2,2),#2*2布局,即4個(gè)子圖 sharex=True,#如果有子圖,子圖共x軸刻度,標(biāo)簽,默認(rèn)True sharey=False,#如果有子圖,子圖共y軸刻度,標(biāo)簽,默認(rèn)False,即不共享 figsize=(12,8),#設(shè)置圖表大小,橫縱方向,單位英尺 title='title',#設(shè)置圖表的標(biāo)題 grid=True,#設(shè)置圖表的格子,默認(rèn)False,即不添加格子 legend=True,#即設(shè)置是否添加圖例,默認(rèn)True color=['r', 'g', 'b'],#設(shè)置不同序列或不同組對(duì)應(yīng)展示的圖表顏色,序列格式(列表或元組),默認(rèn)none,一般不需要顯示指定,系統(tǒng)會(huì)自動(dòng)分配 xticks=[],#設(shè)置x軸刻度,序列形式(列表或元組),可自定義橫軸的刻度,默認(rèn)none,一般不需要 yticks=[],#設(shè)置y軸刻度,序列形式(列表或元組),可自定義縱軸的刻度,默認(rèn)none,一般不需要 rot=0,#設(shè)置軸刻度旋轉(zhuǎn)角度,默認(rèn)是0,即水平展示 fontsize=12,#設(shè)置橫縱坐標(biāo)刻度字體大小 xlim=[0,100],#設(shè)置x軸刻度區(qū)間,序列形式(列表或元素),默認(rèn)不設(shè)置,由系統(tǒng)自動(dòng)判斷 ylim=(0,100),#設(shè)置y軸刻度區(qū)間,序列形式(列表或元素),默認(rèn)不設(shè)置,由系統(tǒng)自動(dòng)判斷 ax,#設(shè)置此次繪圖的目標(biāo)axes(坐標(biāo)系),在本文最后會(huì)詳細(xì)展開,可以理解為,其是pandas暴露的與matplotlib無(wú)縫銜接的接口 ) #df.plot()函數(shù)返回值為此次繪圖所生成的坐標(biāo)系,可以是1個(gè),也可以是多個(gè),視subplots是True或False而定 #pandas的plot繪圖后,還可結(jié)合Matplotlib,對(duì)生成的圖表的屬性進(jìn)一步定制和設(shè)置 plt.grid(linewidth=0.2, alpha=0.5)
1.2 本文用到的數(shù)據(jù)源說(shuō)明
#為了讓該篇文章更加易懂,這次會(huì)使用真實(shí)數(shù)據(jù)進(jìn)行數(shù)據(jù)分析及可視化的演示 #網(wǎng)上獲取公開數(shù)據(jù)源的平臺(tái)比較多,比如AkShare、Tushare、BaoStock等 #其中Tushare使用時(shí)較為便捷,但使用接口獲取數(shù)據(jù)時(shí)還需要積分達(dá)到一定的值,而AkShare數(shù)據(jù)則完全公開,調(diào)用時(shí)沒有任何限制,故本文內(nèi)均會(huì)使用AKShare的數(shù)據(jù) #獲取數(shù)據(jù)方法如下: import akshare as ak #如果沒有安裝akshare,請(qǐng)自行pip安裝 df=ak.macro_cnbs() #每一個(gè)接口獲取的數(shù)據(jù)不一樣,此處只使用歷年中國(guó)宏觀杠桿率數(shù)據(jù) #AKShare詳細(xì)教程和數(shù)據(jù)可訪問(wèn)以下鏈接 https://www.akshare.xyz/zh_CN/latest/index.html
二、折線圖--kind='line'
#折線圖,一般用來(lái)分析某數(shù)據(jù)指標(biāo)(列)隨著index或另外一個(gè)數(shù)據(jù)序列的變化趨勢(shì),也是最常見的圖表 #數(shù)據(jù)源,以下使用AkShare 數(shù)據(jù)平臺(tái)的 中國(guó)宏觀杠桿率 作為數(shù)據(jù)源 import akshare as ak import pandas as pd import matplotlib.pyplot as plt df=ak.macro_cnbs() #獲取中國(guó)歷史各部門的杠桿率 #df.head() 年份 居民部門 非金融企業(yè)部門 政府部門 中央政府 地方政府 實(shí)體經(jīng)濟(jì)部門 金融部門資產(chǎn)方 金融部門負(fù)債方 0 1993-12 8.311222 91.658000 4.249689 3.572548 7.822237 107.791459 8.896441 7.128428 1 1994-12 7.808230 82.411703 4.989987 3.144351 8.134338 98.354271 9.808787 6.796868 2 1995-12 8.200000 81.000000 5.700000 3.000000 8.700000 97.900000 10.000000 7.000000 3 1996-03 8.400000 81.700000 6.100000 3.000000 9.100000 99.200000 10.200000 7.200000 4 1996-06 8.600000 82.100000 6.000000 3.000000 9.000000 99.700000 10.400000 7.400000 df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='line', figsize=(10,8),fontsize=12,title='金融杠桿率') #運(yùn)行后,生成圖表如下,可見基本來(lái)說(shuō),杠桿率在逐年增加,其中居民部門的杠桿率,在2008年以后出現(xiàn)驟增的趨勢(shì),可能與房?jī)r(jià)快速上漲有關(guān)
#如果使用子圖,對(duì)各個(gè)經(jīng)濟(jì)部門的杠桿率分開展示,則如下 df.plot(x='年份',y=['居民部門','政府部門','地方政府'], subplots=True, layout=(1,3),kind='line', figsize=(10,8),fontsize=12,title='金融杠桿率') #運(yùn)行后圖表如下,可見如果拆成子圖之后,會(huì)更加清晰些
三、柱狀圖--kind='bar'
3.1 各組數(shù)據(jù)(列)分開展示
#柱狀圖(條形圖)一般用來(lái)分析某指定時(shí)間段內(nèi),不同指標(biāo)之間的對(duì)比,同時(shí)還可以分析變化趨勢(shì) #相較于折線圖,會(huì)表現(xiàn)的更加直觀,條形圖,或者叫柱狀圖,一般用于分析不同時(shí)間段不同指標(biāo)或組別的表現(xiàn)對(duì)比,但如果要判斷趨勢(shì),最好還是用折線圖會(huì)更加直觀 #數(shù)據(jù)源,仍然以中國(guó)各經(jīng)濟(jì)部門宏觀杠桿率為準(zhǔn),但是只取前20行數(shù)據(jù),因數(shù)據(jù)量太大 df.iloc[range(20)].plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='bar',figsize=(10,8),fontsize=12,title='金融杠桿率')#運(yùn)算后,生成的圖標(biāo)如下
3.2 各組(列)數(shù)據(jù)合并展示--stacked
#柱狀圖還有一種變種,即堆疊柱狀圖,相當(dāng)于將需要對(duì)比的不同組別的指標(biāo)值加和,并展示在一個(gè)柱內(nèi),用不同顏色區(qū)分 #該種圖表既可以體現(xiàn)同一時(shí)期或區(qū)間不同組別的指標(biāo)占比大小(根據(jù)數(shù)值),還可以觀察不同時(shí)期對(duì)應(yīng)組別累加值的變化趨勢(shì) #比如不同季度4個(gè)銷售團(tuán)隊(duì)的銷售業(yè)績(jī),那么堆疊柱狀圖即可以對(duì)比不同季度各個(gè)銷售團(tuán)隊(duì)的業(yè)績(jī),還可以觀察4個(gè)銷售團(tuán)隊(duì)在不同季度業(yè)績(jī)總和的變化趨勢(shì) df.iloc[range(20)].plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='bar', stacked=True,figsize=(10,8),fontsize=12,title='金融杠桿率') #運(yùn)行后圖表如下
3.3 橫向柱狀圖--kind='barh'
#橫向柱狀圖,基本就是將bar圖給橫過(guò)來(lái),沒有其他區(qū)別,有橫向柱狀圖的原因,主要是長(zhǎng)短相較于高低會(huì)更加直觀些,大概可能是因?yàn)槿祟惖囊曈X習(xí)慣吧 #還是以中國(guó)宏觀杠桿率數(shù)據(jù)為數(shù)據(jù)源 df.iloc[range(20)].plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='barh', stacked=True,figsize=(10,8),fontsize=12,title='金融杠桿率') #運(yùn)行后圖表如下,為疊加效果
#以下為不疊加數(shù)據(jù)的效果 df.iloc[range(20)].plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='barh',figsize=(10,8),fontsize=12,title='金融杠桿率') #運(yùn)行后圖表如下
四、直方圖--kind='hist'
4.1 概述
#直方圖一般用在統(tǒng)計(jì)數(shù)據(jù)可視化領(lǐng)域,類似概率分布,即數(shù)據(jù)序列在不同值區(qū)間內(nèi)分布的情況 #默認(rèn)情況下,plot會(huì)將序列數(shù)據(jù)值分為10個(gè)數(shù)值區(qū)間并統(tǒng)計(jì)數(shù)值在不同區(qū)間的個(gè)數(shù),即頻數(shù)圖,如果要展示的是頻率圖,則設(shè)置density = True即可。 #仍以中央宏觀杠桿率數(shù)據(jù)為例,我們想看下不同經(jīng)濟(jì)部門歷年杠桿率區(qū)間分布情況 df.plot(y=['居民部門','地方政府'],kind='hist',figsize=(10,8),fontsize=12,title='金融杠桿率區(qū)間分布情況') #運(yùn)行后,圖表如左圖,為頻數(shù)圖 df.plot(y=['居民部門','地方政府'],kind='hist',density = True, figsize=(10,8),fontsize=12,title='金融杠桿率區(qū)間分布情況') #運(yùn)行后,圖表如中圖,為頻率圖 df.plot(y=['居民部門','地方政府'],kind='hist',density = True, figsize=(10,8),fontsize=12,title='金融杠桿率區(qū)間分布情況') #運(yùn)行后,圖表如右圖,為頻率圖,且設(shè)置透明度
4.2 自定義直方圖橫向區(qū)間數(shù)量
#如果對(duì)系統(tǒng)自動(dòng)劃分的10個(gè)區(qū)間不太滿意,比如感覺太多或者太少,也可以自定義區(qū)間值,一般有兩種方式 #1、使用bins參數(shù),直接指定需要?jiǎng)澐值膮^(qū)間數(shù)量,默認(rèn)是10,可設(shè)置比如15或5等 #2、使用xticks參數(shù),直接指定橫軸的坐標(biāo)刻度值 #1、使用bins參數(shù) df.plot(y=['居民部門','地方政府','中央政府'],kind='hist',figsize=(10,6),fontsize=12,title='金融杠桿率區(qū)間分布圖',bins=15) #指定將區(qū)間劃分為15個(gè),如下左圖所示 #2、使用xticks參數(shù) xtick=[5,10,15,20,25,30,35,40,45,50,55,60] colormap=('r','g','b') df.plot(y=['居民部門','地方政府','中央政府'],kind='hist',figsize=(10,6),fontsize=12,title='金融杠桿率區(qū)間分布圖',xticks=xtick)#指定將區(qū)間按照指定刻度劃分,如下右圖所示
4.3 多子圖展示多序列數(shù)據(jù)
#也可將不同序列數(shù)據(jù)在不同的子圖上進(jìn)行展示,這個(gè)是一個(gè)通用方法,所有的繪圖方法均可對(duì)多序列數(shù)據(jù)分幾個(gè)子圖進(jìn)行繪圖展示 #以下使用3個(gè)子圖,對(duì)不同的序列數(shù)據(jù)直方圖進(jìn)行繪制 df.plot(y=['居民部門','地方政府','中央政府'],kind='hist',figsize=(18,6),subplots=True,layout=(1,3),fontsize=12,title='金融杠桿率區(qū)間分布圖')#運(yùn)行后效果如下
4.4 一維數(shù)據(jù)密度圖--kind='kde'
#kde是直方圖的另外一種變種,相對(duì)于直方圖,可以認(rèn)為其區(qū)間數(shù)量不限,是連續(xù)性的,可以更加直觀的觀察序列數(shù)據(jù)在不同數(shù)值下的概率分布圖,看數(shù)值主要集中于哪個(gè)數(shù)值區(qū)間范圍內(nèi) df.plot(y=['居民部門','地方政府','中央政府'],kind='kde',figsize=(18,6),fontsize=12,title='金融杠桿率區(qū)間分布圖',subplots=True,layout=(1,3))#運(yùn)行后圖表如下
4.5 累積直方圖--cumulative = True
#如果希望幾個(gè)數(shù)據(jù)序列,在同一區(qū)間內(nèi)的頻次或者頻率相加,則可以使用累積直方圖,相當(dāng)于將頻數(shù)或頻率在同一區(qū)間內(nèi)疊加展示 df.plot(y=['居民部門','地方政府'],kind='hist',cumulative = True,figsize=(10,8),alpha=0.5,fontsize=12,title='金融杠桿率區(qū)間分布情況') #運(yùn)行后如下圖所示
五、箱線圖--kind='box'
5.1 默認(rèn)用法--垂直箱線圖
#box箱線圖一般用來(lái)直觀研究一組或多組數(shù)據(jù)分布特征的統(tǒng)計(jì)圖,要求所分析的列數(shù)據(jù)必須是數(shù)值格式 #box圖會(huì)計(jì)算出每一組數(shù)據(jù)的上四分位數(shù)、下四分位數(shù)、上邊緣、下邊緣、中位數(shù)以及異常值等6個(gè)值,并以箱狀繪制出來(lái) #箱線圖還有其他較多變體 #仍以中國(guó)宏觀杠桿率數(shù)據(jù)為例,我們分析下幾個(gè)關(guān)鍵的部門歷年杠桿率數(shù)據(jù)的分布情況 df.plot(y=['地方政府','中央政府', '實(shí)體經(jīng)濟(jì)部門','非金融企業(yè)部門'],kind='box') #運(yùn)行后如下圖所示,可見地方政府和中央政府的杠桿率整體偏低,而實(shí)體經(jīng)濟(jì)的杠桿率則最高,但中國(guó)整體實(shí)體經(jīng)濟(jì)又整年缺乏現(xiàn)金流,數(shù)據(jù)表現(xiàn)比較奇怪
5.2 水平箱線圖--vert = False
#如果希望箱線圖水平展示,則直接設(shè)置 vert=False即可 df.plot(y=['地方政府','中央政府', '實(shí)體經(jīng)濟(jì)部門','非金融企業(yè)部門'], vert=False, kind='box')#運(yùn)行后效果如下
六、餅圖--kind='pie'
6.1 概述
#餅圖一般研究在同一時(shí)期或數(shù)據(jù)點(diǎn)下,不同指標(biāo)列數(shù)值的百分比占比情況,比如同一個(gè)月內(nèi),不同銷售團(tuán)隊(duì)銷售額占比情況 #還是以中國(guó)宏觀杠桿率數(shù)據(jù),我們?nèi)?020年9月份的數(shù)據(jù),研究下不同經(jīng)濟(jì)部門杠桿率占比情況,看哪個(gè)部門占比最多,即杠桿率最高,以及其占比情況 #以下s,為從df中抽出2020年9月份數(shù)據(jù),然后去掉月份列,并轉(zhuǎn)為Series格式,因?yàn)閜ie一般使用Series格式的數(shù)據(jù)進(jìn)行繪圖 s.plot(kind='pie',autopct='%1.1f%%',figsize=(10,8),fontsize=12,title='2020年9月各經(jīng)濟(jì)部門杠桿率占比') #繪圖效果如下,可見實(shí)體經(jīng)濟(jì)部門的杠桿率占比最大
6.2 設(shè)置陰影--shadow=True
#為了增強(qiáng)生成的圖表的可讀性,可對(duì)pie圖的每個(gè)slice添加陰影,不過(guò)本人不太喜歡陰影 s.plot(kind='pie',autopct='%1.1f%%',startangle=90, figsize=(10,8), fontsize=12,title='2020年9月各經(jīng)濟(jì)部門杠桿率占比') #運(yùn)行生成的圖表如下所示
6.3 設(shè)置不同餅區(qū)域偏離中心區(qū)域的距離--explode
#有時(shí)候?yàn)榱送怀稣故灸硯讉€(gè)slice,希望這些slice可以脫離出餅圖圓心一定距離,這樣就從餅圖分離出一部分,可以通過(guò)設(shè)置explode參數(shù)實(shí)現(xiàn) explode_list = [0, 0, 0, 0, 0, 0.2,0.1,0.1] #此處按照數(shù)據(jù)序列順序,指定對(duì)應(yīng)silce偏離餅圖中心的距離,以半徑為單位1,如果是0,則代表不批那里 s.plot(kind='pie',autopct='%1.1f%%',figsize=(10,15),startangle=90,explode=explode_list, shadow=True,fontsize=12,title='2020年9月各經(jīng)濟(jì)部門杠桿率占比') #運(yùn)行后,效果如下,突出體現(xiàn)了最小的三個(gè)部門杠桿率占比
6.4 設(shè)置自動(dòng)產(chǎn)生的百分比文案偏離中心區(qū)域的距離--pctdistance
#可能pie圖自動(dòng)生成的百分比文案位置不太滿意,此時(shí)可以通過(guò)pctdistance參數(shù)設(shè)置其位置偏差 #默認(rèn)是在餅圖半徑的一半位置,即pctdistance=0.5,如果設(shè)置為1,則會(huì)在餅圖外邊緣位置 #以下將百分比文案位置設(shè)置在半徑的0.8位置 explode_list = [0, 0, 0, 0, 0, 0.1,0.1,0.1] s.plot(kind='pie',autopct='%1.1f%%',figsize=(10,15),startangle=90,pctdistance=0.8,explode=explode_list, shadow=True,fontsize=12,title='2020年9月各經(jīng)濟(jì)部門杠桿率占比') #運(yùn)行后效果如下
6.5 去掉列標(biāo)簽,用圖例展示
#如果覺得將對(duì)應(yīng)slice的數(shù)據(jù)名稱直接展示在pie圖內(nèi),整體會(huì)顯得擁擠,則可以去掉,并添加圖例 explode_list = [0, 0, 0, 0, 0, 0.1,0.1,0.1] s.plot(kind='pie',autopct='%1.1f%%',figsize=(10,15),startangle=90,labels=None,pctdistance=0.8,explode=explode_list, shadow=True,fontsize=12,title='2020年9月各經(jīng)濟(jì)部門杠桿率占比') plt.legend(labels=s.index, loc='upper left') #添加圖例
七、散點(diǎn)圖--kind='scatter'
7.1 概述
#散點(diǎn)圖,一般用于分析兩列(組)二維數(shù)據(jù)的相關(guān)性規(guī)律,折線圖的x軸一般是線性變化,所以折線圖一般只能研究某一指標(biāo)列的變化趨勢(shì),而散點(diǎn)圖則可以研究?jī)闪袛?shù)據(jù)的相關(guān)性,比如是否有線性變化關(guān)系等,且兩列數(shù)據(jù)本身已經(jīng)相對(duì)于同一個(gè)線性數(shù)據(jù)進(jìn)行了對(duì)齊(以下例子中即均與年份對(duì)齊) #一般用法 df.plot( x='', #設(shè)置x軸的數(shù)據(jù)序列 y='',#設(shè)置y周的數(shù)據(jù)序列 s=100,#設(shè)置散點(diǎn)的大小 c='r',#設(shè)置散點(diǎn)的顏色,也可傳入列名,傳入的列名必須是數(shù)值化的,那么散點(diǎn)會(huì)根據(jù)列名的數(shù)值大小自動(dòng)著色 marker='*',#設(shè)置散點(diǎn)的形狀 ) #數(shù)據(jù)源還是中國(guó)各個(gè)經(jīng)濟(jì)部分宏觀杠桿率,現(xiàn)在想觀察下中央政府和地方政府杠桿率是否有相關(guān)性,則 df.plot(x='中央政府',y='地方政府',kind='scatter',figsize=(10,8),fontsize=12,title='中央政府和地方政府杠桿率相關(guān)性分析') #繪圖結(jié)果如下,可發(fā)現(xiàn)中央政府和地方政府杠桿率呈現(xiàn)一定程度的正相關(guān)
7.2 分類散點(diǎn)圖--增加另一個(gè)維度的數(shù)據(jù)變量
#一般散點(diǎn)圖是分析二維碼數(shù)據(jù)(兩個(gè)數(shù)據(jù)序列)之間的關(guān)系,也是數(shù)據(jù)分析最主要的任務(wù),但是如果希望分析三維數(shù)據(jù),即三個(gè)數(shù)據(jù)序列之間的變化關(guān)系,也可以用散點(diǎn)圖實(shí)現(xiàn) #此時(shí)將第三個(gè)數(shù)據(jù)序列(必須是數(shù)值化的)傳給c參數(shù),用第三個(gè)數(shù)據(jù)序列的大小,對(duì)散點(diǎn)進(jìn)行自動(dòng)著色,顏色越黑,代表第三個(gè)數(shù)據(jù)序列越大 #還是以中國(guó)宏觀杠桿率數(shù)據(jù)為例,我們不僅希望知道中央政府和地方政府之間杠桿率變化規(guī)則,還希望知道實(shí)體經(jīng)濟(jì)部門與這兩者數(shù)據(jù)的關(guān)系(用顏色深淺代表數(shù)值大?。瑒t可以使用分類散點(diǎn)圖 df.plot(x='中央政府',y='地方政府',kind='scatter',figsize=(10,8),fontsize=12,c='實(shí)體經(jīng)濟(jì)部門' ,title='中央政府、地方政府即實(shí)體經(jīng)濟(jì)部門杠桿率相關(guān)性分析') #運(yùn)行后如下圖所示,可見中央政府和地方政府杠桿率越大,實(shí)體經(jīng)濟(jì)部門杠桿率也越大(因?yàn)閷?duì)應(yīng)的顏色越深)
7.3 氣泡圖--散點(diǎn)圖變種--以氣泡大小代表數(shù)值大小
#分類散點(diǎn)圖是以顏色深淺來(lái)判斷第三個(gè)數(shù)據(jù)序列與指定的x和y數(shù)據(jù)序列之間的數(shù)值變化關(guān)系 #氣泡圖則是用氣泡的大小,來(lái)判斷,氣泡圖較為適用于數(shù)據(jù)點(diǎn)不太多的情況,因?yàn)閿?shù)據(jù)太多的話,各個(gè)氣泡重疊在一起,可視化效果范圍不好 df.plot(x='中央政府',y='地方政府',kind='scatter',figsize=(10,8),fontsize=12,c='c' ,alpha=0.5,s=2*df['實(shí)體經(jīng)濟(jì)部門'], title='中央政府、地方政府即實(shí)體經(jīng)濟(jì)部門杠桿率相關(guān)性分析') #運(yùn)行后,效果如下,還是分析實(shí)體經(jīng)濟(jì)部門與中央政府、地方政府杠桿率數(shù)值變化的趨勢(shì)關(guān)系 #其中s為三點(diǎn)的大小,大小直接使用實(shí)體經(jīng)濟(jì)部門杠桿率數(shù)值設(shè)置
八、面積圖--kind='area'
8.1 默認(rèn)用法--不同序列數(shù)據(jù)不疊加值
#面積圖,融合了折線圖和柱狀圖的優(yōu)點(diǎn),既可以分析不同指標(biāo)(列標(biāo)簽)隨同一個(gè)列或index的變化趨勢(shì),同時(shí)也可以直觀的看到大小。如果單純只是想對(duì)比不同指標(biāo)在同一列下不同大小和變化趨勢(shì),則使用折線圖最理想。 #如果希望即看不同指標(biāo)的變化趨勢(shì),又希望看不同指標(biāo)在同一時(shí)期內(nèi)疊加值的變化趨勢(shì),且數(shù)據(jù)點(diǎn)較多,則使用面積圖最理想,比如希望看5年內(nèi),每個(gè)月不同銷售團(tuán)隊(duì)的銷售額的大小對(duì)比和變化趨勢(shì),又希望看每個(gè)月不同銷售團(tuán)隊(duì)總銷售額的變化趨勢(shì),使用面積圖最理想 df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='area', stacked=False,figsize=(10,8),fontsize=12,title='金融杠桿率')#不同列值不堆疊,繪圖效果如下:
8.2 不同序列數(shù)據(jù)疊加值--stacked
df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='area', stacked=True,figsize=(10,8),fontsize=12,title='金融杠桿率') #堆疊時(shí)繪圖效果如下,可見整體疊加杠桿率,近幾年上升較快
九、六邊圖--kind='hexbin'
9.1 概述
六邊圖又叫六邊箱圖,主要分析二維(即兩個(gè)數(shù)據(jù)序列)數(shù)據(jù)點(diǎn)數(shù)值分布情況,類似二維的直方圖,它展示了每個(gè)小六邊形中觀測(cè)點(diǎn)的數(shù)量,這種圖在大數(shù)據(jù)集上可視化效果最佳。
直方圖針對(duì)每個(gè)數(shù)據(jù)序列,是單獨(dú)展示其沿著x周數(shù)值區(qū)間的頻數(shù)或頻次分布,而六邊圖則展示了x和y兩個(gè)數(shù)據(jù)序列關(guān)聯(lián)起來(lái)后的頻數(shù)分布圖,同時(shí)還可以展示x和y兩個(gè)數(shù)據(jù)序列之間的關(guān)聯(lián)變化關(guān)系
#還是以分析中國(guó)宏觀杠桿率數(shù)據(jù),我們想了解中央政府和地方政府杠桿率數(shù)值的分布情況,且最好還可以體現(xiàn)兩者之間的變化關(guān)系 df.plot(x='中央政府',y='地方政府',kind='hexbin',figsize=(10,8),fontsize=12,title='中央政府、地方政府杠桿率分布和變化趨勢(shì)圖') #運(yùn)行效果如下,其中最右側(cè)的標(biāo)尺,代表分布頻數(shù),即每個(gè)六邊形狀內(nèi)分布的數(shù)據(jù)點(diǎn)數(shù),圖表中用頻數(shù)代表顏色深淺,頻數(shù)越大,顏色越深
9.2 調(diào)整x軸六邊形數(shù)量--類似增加密度--gridsize
如果數(shù)據(jù)點(diǎn)太多時(shí),希望增大統(tǒng)計(jì)的區(qū)間長(zhǎng)度,以更加直觀的觀察分布情況,則可以調(diào)大gridsize的數(shù)值
#gridsize默認(rèn)大小是100,即會(huì)將數(shù)據(jù)歸集到100個(gè)區(qū)間范圍內(nèi),包括x軸和y軸,但是一般情況下,100比較多,設(shè)置個(gè)比如20個(gè)相對(duì)可視化效果會(huì)比較好 df.plot(x='中央政府',y='地方政府',kind='hexbin',figsize=(10,8),fontsize=12, gridsize=20,title='中央政府、地方政府杠桿率分布和變化趨勢(shì)圖') #運(yùn)行后效果如下,可見中央政府和地方政府的杠桿率分布比較不均勻,在最小值、中間值、最大值處分布較多
十、常用繪圖時(shí)設(shè)置參數(shù)
以下演示的方式,對(duì)所有的圖表類型均通用
10.1 將不同數(shù)據(jù),繪制到同一個(gè)圖表的不同子圖內(nèi),且不同子圖單獨(dú)繪圖
#比如上面的面積圖,希望看下stacked參數(shù)不同時(shí),繪圖效果,則可分別將數(shù)據(jù)繪制在指定的子圖內(nèi) fig, (ax1, ax2) = plt.subplots(2) #首先創(chuàng)建2個(gè)子圖 df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='area', ax=ax1,stacked=False,figsize=(10,12),fontsize=12,title='金融杠桿率') #將圖表1繪制到子圖1內(nèi) df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='area',ax=ax2, figsize=(10,12),fontsize=12,title='金融杠桿率')#將圖表1繪制到子圖1內(nèi),數(shù)據(jù)和x軸數(shù)據(jù)也可完全不相同
10.2 設(shè)置數(shù)據(jù)序列顏色
#可通過(guò)color參數(shù)指定在繪制不同數(shù)據(jù)序列時(shí),對(duì)應(yīng)的顏色,或者pie圖中不同slice的顏色,序列格式,一般用列表格式 colors=['r','g','b'] df.plot(x='年份',y=['居民部門','政府部門','地方政府'], color=colors, subplots=True, layout=(1,3),kind='line', figsize=(15,8),fontsize=12,title='金融杠桿率') #運(yùn)行后如下圖所示,指定了居民部門、政府部門、地方政府相應(yīng)的折線的顏色
10.3 設(shè)置x和y坐標(biāo)軸label
#可通過(guò)matplotlib庫(kù)中的xlabel和ylabel設(shè)置x和y坐標(biāo)軸的標(biāo)簽名,一般這些pandas的plot函數(shù)會(huì)根據(jù)實(shí)際情況自動(dòng)添加,不過(guò)也可以根據(jù)自己需要自行設(shè)置 df.plot(x='年份',y=['居民部門','政府部門','地方政府'],kind='line', figsize=(15,8),fontsize=12,title='金融杠桿率') plt.xlabel('年份') plt.ylabel('杠桿率') #運(yùn)行后如下圖所示,指定了居民部門、政府部門、地方政府相應(yīng)的折線的顏色
10.4 其他參數(shù)設(shè)置
參數(shù) | 說(shuō)明 |
---|---|
title | 設(shè)置圖表的標(biāo)題,字符串格式 |
linestyle | 設(shè)置不同折線的線型,序列格式(列表或元組),默認(rèn)實(shí)線 |
legend | 設(shè)置圖表的圖例是否展示,布爾,默認(rèn)True,即展示 |
marker | 設(shè)置散點(diǎn)圖等點(diǎn)的形狀 |
alpha | 數(shù)值,設(shè)置透明度,默認(rèn)為1,即不透明,0.5,即50%透明度 |
secondary_y | 設(shè)置第二個(gè)y軸,只有當(dāng)繪制的數(shù)據(jù)序列大于等于2時(shí),設(shè)置才生效,可設(shè)置為True,或直接指定使用哪個(gè)數(shù)據(jù)序列作為第二個(gè)y軸的刻度 |
linewidth | 設(shè)置線寬,數(shù)值 |
table | 圖下添加表,如果為True,則使用DataFrame中的數(shù)據(jù)繪制表格,并且數(shù)據(jù)將被轉(zhuǎn)置以滿足matplotlib的默認(rèn)布局,一般不要添加,并且添加時(shí)性能較差 |
logx | 設(shè)置x軸坐標(biāo)刻度是否取對(duì)數(shù),布爾,默認(rèn)False,即不取 |
logy | 設(shè)置y軸坐標(biāo)刻度是否取對(duì)數(shù),布爾,默認(rèn)False,即不取 |
loglog | 設(shè)置x軸和y軸坐標(biāo)刻度是否均取對(duì)數(shù),布爾,默認(rèn)False,即不取 |
10.5 ax參數(shù)專門講解
10.5.1 概述
DataFrame.plot()函數(shù)中,ax參數(shù)如果使用得當(dāng),則即可以享受pandas的plot函數(shù)帶來(lái)的便捷性,同時(shí)又可以擁有matplotlib的靈活性,如文章以上介紹,其實(shí)plot函數(shù)給我們提供的參數(shù),只是可以滿足日??焖倮L圖的需求,并可以定義常見的一些繪圖屬性,但是如果需要定制比如x和y坐標(biāo)軸的label,坐標(biāo)軸,或者想隱藏坐標(biāo)軸、指定坐標(biāo)軸標(biāo)簽的字體和顏色等等,便無(wú)能為力。
而ax則是plot函數(shù)暴露出來(lái),直接與matplotlib直接銜接的接口,ax可以認(rèn)為是一個(gè)坐標(biāo)系,每個(gè)圖表的繪制,均需要在指定坐標(biāo)系內(nèi)完成,而ax參數(shù)則指定了此次df.plot調(diào)用,繪圖的坐標(biāo)系對(duì)象。
其實(shí)df.plot()函數(shù)本身,返回的便是此次繪圖生成的坐標(biāo)系,如果希望后續(xù)df.plot函數(shù)也繪制到之前df.plot返回的坐標(biāo)系內(nèi),則可以將ax參數(shù)賦值成之前的坐標(biāo)系值,不過(guò)一般不建議使用df.plot返回的坐標(biāo)系,大部分情況下,一次df.plot即繪制一個(gè)
#可以使用ax參數(shù)指定此次繪圖對(duì)應(yīng)的坐標(biāo)系(axes)對(duì)象 #1、用plt生成的axes賦值給ax #這種方法最為靈活,一般用于希望將多種(kind)圖表拼接展示在一起的時(shí)候,如下左圖所示 fig,axes=plt.subplots(1,2,figsize=(16,8)) #生成一個(gè)1行2列的繪圖區(qū),并返回圖表本身和對(duì)應(yīng)的2個(gè)坐標(biāo)系 df.plot(x='年份',y='居民部門',ax=axes[0],title='居民部門杠桿率') #將圖表繪制到第1個(gè)坐標(biāo)系內(nèi) df.plot(x='年份',y=['非金融企業(yè)部門','政府部門'],ax=axes[1],title='非金&政府部門杠桿率')#將圖表繪制到第2個(gè)坐標(biāo)系內(nèi) #2、用上次plot函數(shù)返回的ax賦值給ax #這種方法,一般不常用,因?yàn)樵瓌t性一次plot調(diào)用,就是一次完整的繪圖動(dòng)作,相當(dāng)于此次在之前的坐標(biāo)系內(nèi)進(jìn)行繪圖,如下右圖所示 ax1=df.plot(x='年份',y='居民部門',title='居民部門杠桿率') #首先繪圖并返回ax1坐標(biāo)系 df.plot(x='年份',y=['非金融企業(yè)部門','政府部門'],ax=ax1)#指定在ax1坐標(biāo)系繼續(xù)繪圖,就是追加繪圖
10.5.2 使用ax參數(shù)設(shè)置具體繪圖對(duì)象--指定坐標(biāo)系繪圖
一般用的最多的,是先使用plt繪制一個(gè)比如3×3的繪圖區(qū)域,包含9個(gè)坐標(biāo)系,然后使用df.plot()分別在對(duì)應(yīng)坐標(biāo)系內(nèi)進(jìn)行繪圖,以達(dá)到將不同類型的圖表拼接到一起的效果
#使用時(shí),原則性,一次df.plot()就是一次完整的繪圖動(dòng)作,如果希望將多次df.plot繪圖動(dòng)作生成的圖表集中展示,則使用下面的方法 fig,axes=plt.subplots(3,3,figsize=(24,24)) #首先生成一個(gè)3×3的繪圖區(qū),共9個(gè)坐標(biāo)系 df.plot(x='年份',y=['中央政府','地方政府','居民部門'],kind='line',ax=axes[0,0],title='各部門杠桿率') #將圖繪制到第1行第1列的坐標(biāo)系 df.iloc[range(10)].plot(x='年份',y=['居民部門','地方政府'],kind='bar',ax=axes[0,1] ,stacked=True,title='金融杠桿率') #將圖繪制到第1行第2列的坐標(biāo)系 df.plot(y=['居民部門','地方政府'],kind='hist',density = True,ax=axes[0,2] ,title='金融杠桿率區(qū)間分布情況') #將圖繪制到第1行第3列的坐標(biāo)系 df.plot(y=['居民部門','地方政府','中央政府'],kind='kde',ax=axes[1,0],title='金融杠桿率區(qū)間分布圖') #將圖繪制到第2行第1列的坐標(biāo)系 df.plot(y=['地方政府','中央政府', '實(shí)體經(jīng)濟(jì)部門'],kind='box',ax=axes[1,1],title='各部門杠桿率箱線圖')#將圖繪制到第2行第2列的坐標(biāo)系 df.plot(x='中央政府',y='地方政府',kind='scatter',ax=axes[1,2] ,title='中央政府和地方政府杠桿率相關(guān)性分析')#將圖繪制到第2行第3列的坐標(biāo)系 df.plot(x='中央政府',y='地方政府',kind='scatter',ax=axes[2,0] ,c='c' ,alpha=0.5,s=2*df['實(shí)體經(jīng)濟(jì)部門'], title='中央政府、地方政府即實(shí)體經(jīng)濟(jì)部門杠桿率相關(guān)性分析')#將圖繪制到第3行第1列的坐標(biāo)系 df.plot(x='中央政府',y='地方政府',kind='hexbin', ax=axes[2,1], gridsize=20,title='中央政府、地方政府杠桿率分布和變化趨勢(shì)圖') #將圖繪制到第3行第2列的坐標(biāo)系 df.plot(x='中央政府',y='地方政府',kind='scatter',ax=axes[2,2] ,c='實(shí)體經(jīng)濟(jì)部門' ,title='中央政府、地方政府即實(shí)體經(jīng)濟(jì)部門杠桿率相關(guān)性分析')#將圖繪制到第3行第3列的坐標(biāo)系
10.5.3 設(shè)置x和y坐標(biāo)軸標(biāo)簽
可以根據(jù)df.plot返回的ax來(lái)設(shè)置坐標(biāo)軸標(biāo)簽,也可以根據(jù)plt生成的坐標(biāo)系下標(biāo)來(lái)設(shè)置坐標(biāo)軸標(biāo)簽
#1、根據(jù)df.plot函數(shù)返回的ax直接設(shè)置x和y坐標(biāo)軸label,效果如下左圖所示 ax=df.plot(x='年份',y=['中央政府','地方政府','居民部門'],kind='line',title='各部門杠桿率') ax.set_xlabel('年月') ax.set_ylabel('各部門杠桿率') #2、先由plt生成坐標(biāo)系,然后使用plt生成的坐標(biāo)系設(shè)置x和y坐標(biāo)軸label,效果如下右圖所示 fig,axes=plt.subplots(1,2,figsize=(10,5)) #生成一個(gè)1×2的2個(gè)坐標(biāo)系繪圖區(qū) df.plot(x='年份' ,y='居民部門',ax=axes[0],title='居民部門杠桿率') #繪制到第1個(gè)坐標(biāo)系 df.plot(x='年份' ,y='政府部門',ax=axes[1],title='政府部門杠桿率')#繪制到第2個(gè)坐標(biāo)系 axes[0].set_xlabel('年月') axes[0].set_ylabel('居民部門杠桿率') axes[1].set_xlabel('年月') axes[1].set_ylabel('政府部門杠桿率')
10.5.4 matplotlib子圖和subplots指定的子圖之前關(guān)系
- 如果對(duì)某次df.plot設(shè)置了ax參數(shù),則該次df.plot返回的ax,即指定的ax,因?yàn)榧热灰呀?jīng)指定了繪圖ax坐標(biāo)系,返回的肯定也是指定的坐標(biāo)系
- df.plot如果將subplots設(shè)置為True,則其返回的ax是一個(gè)矩陣,矩陣的shape即layout指定的shape
- matplotlib中的plt.subplots其實(shí)生成的也是一個(gè)指定shape的繪圖區(qū)域,類似以上的layout
- 如果df.plot設(shè)置了subplots為True,且此時(shí)指定了ax為plt生成的某個(gè)ax,此時(shí)會(huì)將df.plot生成的子圖,分別依次繪制到plt對(duì)應(yīng)的子圖區(qū)域
- 比如df.plot,將subplots設(shè)置為True,且layout=(2,2),而plt生成的也是一個(gè)(2,2)的繪圖區(qū)域,然后把df.plot的ax指定到了plt繪圖區(qū)域內(nèi)的第一個(gè)坐標(biāo)系,則系統(tǒng)會(huì)自動(dòng)將df.plot繪制的4個(gè)子圖,依次繪制到plt生成的四個(gè)繪圖坐標(biāo)系內(nèi)。
#以下演示當(dāng)df.plot設(shè)置subplots=True時(shí)的效果 fig,axes=plt.subplots(1,2) df.plot(x='年份',y=['居民部門','政府部門'],subplots=True,layout=(1,2),ax=axes)
10.5.5 保存圖表
#當(dāng)圖表繪制好之后,一般可能希望將其保存到本地留作他用,需要用fig對(duì)象進(jìn)行保存,fig對(duì)象的獲取一般有以下兩種方式,本質(zhì)道理一樣 #1、使用plt.subplots方法返回的fig并保存 fig,axes=plt.subplots(1,1) df.plot(x='年份',y='居民部門',ax=axes) fig.savefig('filename.png') #2、使用df.plot函數(shù)返回的ax簡(jiǎn)介獲取fig并保存 ax=df.plot(x='年份',y='居民部門') ax.get_figure().savefig('filename.png')
十一、不同圖表類型的區(qū)別
一維數(shù)據(jù)分析
- 即分析一個(gè)數(shù)據(jù)序列的數(shù)值變化趨勢(shì)、分布情況(頻數(shù)、頻率)、占比情況
- 一般line(數(shù)值變化)、bar(數(shù)值變化)、barh(數(shù)值變化)、hist(數(shù)值分布)、kde(數(shù)值分布)、box(數(shù)值分布)、pie(占比)、area(變化趨勢(shì)、占比)適用于進(jìn)行以上一維數(shù)據(jù)分析
二維數(shù)據(jù)分析
- 即分析兩個(gè)數(shù)據(jù)序列之間的數(shù)值關(guān)聯(lián)變化趨勢(shì)、分布情況、占比情況等
- 一般scatter、hexbin適用于進(jìn)行以上二維數(shù)據(jù)分析
其他數(shù)據(jù)分析和可視化工具
- 后續(xù)可學(xué)習(xí)matplotlib庫(kù)以及seaborn庫(kù),而seaborn庫(kù)最為推薦,因?yàn)樽龀鰜?lái)的圖表顏值非常高,并且很容易上手
- Plotly庫(kù)也是強(qiáng)雷建議學(xué)習(xí)的,因?yàn)槠溆泻芏喾浅s@艷的可視化工具
到此這篇關(guān)于pandas實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼的文章就介紹到這了,更多相關(guān)pandas 數(shù)據(jù)可視化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tensorflow限制CPU個(gè)數(shù)實(shí)例
今天小編就為大家分享一篇Tensorflow限制CPU個(gè)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Django 接收Post請(qǐng)求數(shù)據(jù),并保存到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Django 接收Post請(qǐng)求數(shù)據(jù),并保存到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python如何把不同類型數(shù)據(jù)的json序列化
這篇文章主要介紹了Python如何把不同類型數(shù)據(jù)的json序列化,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04Python 如何給圖像分類(圖像識(shí)別模型構(gòu)建)
這篇文章主要介紹了Python 教你如何給圖像分類,今天的文章主要是講圖像識(shí)別模型如何構(gòu)建,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06解決numpy和torch數(shù)據(jù)類型轉(zhuǎn)化的問(wèn)題
這篇文章主要介紹了解決numpy和torch數(shù)據(jù)類型轉(zhuǎn)化的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python編譯成.so文件進(jìn)行加密后調(diào)用的實(shí)現(xiàn)
今天小編就為大家分享一篇Python編譯成.so文件進(jìn)行加密后調(diào)用的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python爬蟲利器之requests庫(kù)的用法(超全面的爬取網(wǎng)頁(yè)案例)
這篇文章主要介紹了python爬蟲利器之requests庫(kù)的用法(超全面的爬取網(wǎng)頁(yè)案例),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Python基于遞歸和非遞歸算法求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù)示例
這篇文章主要介紹了Python基于遞歸和非遞歸算法求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù),涉及Python遞歸算法、流程循環(huán)控制進(jìn)行數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-05-05Python一行代碼識(shí)別增值稅發(fā)票實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Python一行代碼識(shí)別增值稅發(fā)票實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03PyQt5實(shí)現(xiàn)仿QQ貼邊隱藏功能的實(shí)例代碼
這篇文章主要介紹了PyQt5實(shí)現(xiàn)仿QQ貼邊隱藏功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05