<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Matplotlib可視化沒那么難:7種常用圖表最全繪制攻略來了!

          共 8302字,需瀏覽 17分鐘

           ·

          2021-05-29 09:10


          導(dǎo)讀:繪圖是數(shù)據(jù)分析工作中的重要一環(huán),是探索過程的一部分。Matplotlib是當(dāng)前用于數(shù)據(jù)可視化的最流行的Python包之一,本文主要介紹數(shù)據(jù)可視化分析工具:Matplotlib。


          作者:楊游云、周健
          來源:數(shù)倉寶貝庫(ID:DataBaby_Family)





          Matplotlib是一個(gè)跨平臺(tái)庫,是根據(jù)數(shù)組中的數(shù)據(jù)制作2D圖的可視化分析工具。Matplotlib提供了一個(gè)面向?qū)ο蟮腁PI,有助于使用Python GUI工具包(如PyQt、WxPythonotTkinter)在應(yīng)用程序中嵌入繪圖。它也可以用于Python、IPython shell、Jupyter筆記本和Web應(yīng)用程序服務(wù)器中。

          Matplotlib提供了豐富的數(shù)據(jù)繪圖工具,主要用于繪制一些統(tǒng)計(jì)圖形,例如散點(diǎn)圖、條形圖、折線圖、餅圖、直方圖、箱形圖等。首先我們簡單介紹一下Matplotlib.pyplot模塊的繪圖基礎(chǔ)語法與常用參數(shù),因?yàn)楹竺嫖覀円榻B的各種圖形基本都是基于這個(gè)模塊來實(shí)現(xiàn)的。pyplot的基礎(chǔ)語法及常用參數(shù)如下。

          • plt.figure:創(chuàng)建空白畫布,在一幅圖中可省略
          • figure.add_subplot:第一個(gè)參數(shù)表示行,第二個(gè)參數(shù)表示列,第三個(gè)參數(shù)表示選中的子圖編號(hào)
          • plt.title:標(biāo)題
          • plt.xlabel:x軸名稱
          • plt.ylabel:y軸名稱
          • plt.xlim:x軸的范圍
          • plt.ylim:y軸范圍
          • plt.xticks:第一個(gè)參數(shù)為范圍,數(shù)組類型;第二個(gè)參數(shù)是標(biāo)簽,第三個(gè)是控制標(biāo)簽
          • plt.yticks:同plt.xticks
          • plt.legend:圖例
          • plt.savafig:保存圖形
          • plt.show:在本機(jī)顯示


          01 散點(diǎn)圖

          散點(diǎn)圖通常用在回歸分析中,描述數(shù)據(jù)點(diǎn)在直角坐標(biāo)系平面上的分布。散點(diǎn)圖表示因變量隨自變量而變化的大致趨勢,據(jù)此可以選擇合適的函數(shù)對(duì)數(shù)據(jù)點(diǎn)進(jìn)行擬合。在廣告數(shù)據(jù)分析中,我們通常會(huì)根據(jù)散點(diǎn)圖來分析兩個(gè)變量之間的數(shù)據(jù)分布關(guān)系。散點(diǎn)圖的主要參數(shù)及其說明如下。

          • x/y:X/Y軸數(shù)據(jù)。兩者都是向量,而且必須長度相等。
          • s:標(biāo)記大小,可自定義
          • c:標(biāo)記顏色,可自定義
          • marker:標(biāo)記樣式,可自定義

          我們通過matplotlib.pyplot模塊畫一個(gè)散點(diǎn)圖,如代碼清單1所示。

          • 代碼清單1 繪制散點(diǎn)圖

          import numpy as np
          import matplotlib.pyplot as plt 
          x = np.arange(30)
          y = np.arange(30)+3*np.random.randn(30)
          plt.scatter(x, y, s=50
          plt.show()

          其可視化結(jié)果如下圖所示。

          ▲圖1 散點(diǎn)圖


          02 條形圖

          條形圖是用寬度相同的條形的高度或長度來表示數(shù)據(jù)多少的圖形。條形圖可以橫置或縱置,縱置時(shí)也稱為柱狀圖。此外,條形圖有簡單條形圖、復(fù)式條形圖等形式。條形圖的主要參數(shù)及各參數(shù)說明如下。

          • x:數(shù)據(jù)源
          • height:bar的高度
          • width:bar的寬度,默認(rèn)0.8
          • bottom:y軸的基準(zhǔn),默認(rèn)0
          • align:x軸的位置,默認(rèn)中間,edge表示將bar的左邊與x對(duì)齊
          • color:bar顏色
          • edgecolor:邊顏色
          • linewidth:邊的寬度,0表示無邊框

          假設(shè)我們拿到了2017年內(nèi)地電影票房前10的電影的片名和票房數(shù)據(jù),如果想直觀比較各電影票房數(shù)據(jù)大小,那么條形圖顯然是最合適的呈現(xiàn)方式,如代碼清單2所示,其可視化結(jié)果如圖2所示。

          • 代碼清單2 繪制條形圖

          a = ['戰(zhàn)狼2''速度與激情8''功夫瑜伽''西游伏妖篇''變形金剛5:最后的騎士''摔跤吧!爸爸''加勒比海盜5:死無對(duì)證','金剛:骷髏島''極限特工:終極回歸''生化危機(jī)6:終章']
          # 單位:億
          b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12]
          # 用來正常顯示中文標(biāo)簽
          plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'
          plt.rcParams['axes.unicode_minus']=False
          # bar要求傳遞兩個(gè)數(shù)字,可以單獨(dú)設(shè)置x軸的顯示
          plt.bar(range(len(a)), b, width=0.3)  
          plt.xticks(range(len(a)), a, rotation=90)  #字體傾斜角度
          plt.grid(False)
          plt.show()

          ▲圖2 條形圖


          03 折線圖

          折線圖是用直線連接排列在工作表的列或行中的數(shù)據(jù)點(diǎn)而繪制成的圖形。折線圖可以顯示隨時(shí)間(根據(jù)常用比例設(shè)置)而變化的連續(xù)數(shù)據(jù),因此非常適用于顯示相等時(shí)間間隔下數(shù)據(jù)的趨勢。折線圖的主要參數(shù)及各參數(shù)說明如下。

          • x/y:數(shù)據(jù)源
          • color:字體顏色:color=‘r’;b、g、r、c、m、y、k、w 或者blue、green、red、cyan、magenta、yellow、black、whtite 或十六進(jìn)制字符串(’#008000’)
          • linewidth:線條粗細(xì),可自定義
          • linestyle:線條形狀:linestyle=’–’(虛線);linestyle=’:’(點(diǎn)線);linestyle=’-.’(短線加點(diǎn));
          • label:數(shù)據(jù)標(biāo)簽內(nèi)容:label=‘?dāng)?shù)據(jù)一’,數(shù)據(jù)標(biāo)簽展示位置需另說明plt.legend(loc=1)數(shù)字為標(biāo)簽位置

          以某廣告平臺(tái)隨日期變化的用戶請(qǐng)求數(shù)為例,我們用折線圖來表現(xiàn)其變化趨勢,如代碼清單3所示,其可視化結(jié)果如圖3所示。

          • 代碼清單3 繪制折線圖

          import matplotlib.dates as mdate
          dateparse = lambda dates:pd.datetime.strptime(dates,'%Y%m%d')
          data = pd.read_csv('req_user.csv',encoding='utf-8',parse_dates=['date'],date_parser=dateparse)
          plt.figure(figsize=(10,7))
          plt.plot(data["date"],data['req_user']) 
          plt.xlabel('date',fontsize=15)
          plt.ylabel('req_user',fontsize=15)  #圖例字體大小
          plt.tick_params(labelsize=10)  #刻度字體大小
          plt.show()

          ▲圖3 折線圖


          04 餅圖

          餅圖常用于統(tǒng)計(jì)學(xué)模塊中。用于顯示一個(gè)數(shù)據(jù)系列中各項(xiàng)的大小與各項(xiàng)總和的比例。餅圖中的數(shù)據(jù)點(diǎn)顯示為整個(gè)餅圖的百分比,餅圖的主要參數(shù)及其說明如下。

          • x:數(shù)據(jù)源
          • labels:(每一塊)餅圖外側(cè)顯示的說明文字
          • explode:(每一塊)離開中心距離
          • startangle:起始繪制角度,默認(rèn)圖是從x軸正方向逆時(shí)針畫起,如設(shè)定=90則從y軸正方向畫起
          • shadow:在餅圖下面畫一個(gè)陰影。默認(rèn)值:False,即不畫陰影
          • labeldistance:label標(biāo)記的繪制位置,相對(duì)于半徑的比例,默認(rèn)值為1.1, 如<1則繪制在餅圖內(nèi)側(cè)
          • autopct:控制餅圖內(nèi)百分比設(shè)置,可以使用format字符串或者format function,'%1.1f'指小數(shù)點(diǎn)前后位數(shù)(沒有則用空格補(bǔ)齊)
          • pctdistance:類似于labeldistance,指定autopct的位置刻度,默認(rèn)值為0.6
          • radius:控制餅圖半徑,默認(rèn)值為1
          • textprops:設(shè)置標(biāo)簽(labels)和比例文字的格式;字典類型,可選參數(shù),默認(rèn)值為:None。傳遞給text對(duì)象的字典參數(shù)
          • center:浮點(diǎn)類型的列表,可選參數(shù),默認(rèn)值:(0,0),圖標(biāo)中心位置。

          以某家庭10月份家庭支出情況為例,我們用餅圖來體現(xiàn)各部分支出占家庭整體支出的情況,如代碼清單4所示,其可視化結(jié)果如圖4所示。

          • 代碼清單4 繪制餅圖

          import matplotlib.pyplot as plt
          plt.rcParams['font.sans-serif']=['SimHei'#用來正常顯示中文標(biāo)簽


          labels = ['娛樂','育兒','飲食','房貸','交通','其他']
          sizes = [4,10,18,60,2,6]
          explode = (0,0,0,0.1,0,0)
          plt.figure(figsize=(10,7))
          plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
          plt.title("餅圖示例-10月份家庭支出")
          plt.show()

          ▲圖4 餅圖


          05 直方圖

          直方圖,又稱質(zhì)量分布圖,是一種統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。一般用橫軸表示數(shù)據(jù)類型,用縱軸表示分布情況。直方圖是數(shù)值數(shù)據(jù)分布的精確圖形表示,是對(duì)連續(xù)變量(定量變量)的概率分布的估計(jì),由卡爾·皮爾遜(Karl Pearson)首先引入,是一種特殊的條形圖。

          在構(gòu)建直方圖時(shí),第一步是將值的范圍分段,即將整個(gè)值的范圍分成一系列間隔,然后計(jì)算每個(gè)間隔中有多少值。這些值通常被指定為連續(xù)的、不重疊的變量間隔,間隔必須相鄰,并且通常是相等的大小。直方圖的主要參數(shù)及說明如下。

          • x:數(shù)據(jù)源
          • bins:分塊數(shù),默認(rèn)10
          • range:畫圖范圍,接收元組
          • cumulative:每一列累加
          • bottom:bin的基線
          • histtype:畫圖的形狀,默認(rèn)是bar
          • align:bar中心位置,默認(rèn)中間
          • orientation:水平或垂直,默認(rèn)垂直
          • rwidth:bar的寬度
          • color:表示bar的顏色
          • label:bar的標(biāo)簽;也可以在圖例中寫plt.legend()
          • edgecolor:直方圖的邊界色

          下面我們以Kaggle經(jīng)典比賽案例泰坦尼克號(hào)數(shù)據(jù)集為例,繪制乘客年齡的頻數(shù)直方圖,查看各年齡段乘客的年齡分布情況,如代碼清單5所示,其可視化結(jié)果如圖5所示。

          • 代碼清單5 繪制直方圖

          # 導(dǎo)入第三方包
          import numpy as np
          import pandas as pd
          import matplotlib.pyplot as plt
          import matplotlib.mlab as mlab
          # 中文和負(fù)號(hào)的正常顯示
          plt.rcParams['font.sans-serif'] = [u'SimHei']
          plt.rcParams['axes.unicode_minus'] = False
          # 讀取Titanic數(shù)據(jù)集
          titanic = pd.read_csv('train.csv')
          # 檢查年齡是否有缺失
          any(titanic.Age.isnull())
          # 刪除含有缺失年齡的樣本
          titanic.dropna(subset=['Age'], inplace=True)
          # 設(shè)置圖形的顯示風(fēng)格
          plt.style.use('ggplot')
          # 繪圖
          plt.hist(titanic.Age, 
                  bins = 20
                  color = 'steelblue'
                  edgecolor = 'k'
                  label = '直方圖' ) 
          # 去除圖形頂部邊界和右邊界的刻度
          plt.tick_params(top='off', right='off')
          # 顯示圖例
          plt.legend()
          # 去除網(wǎng)格線
          plt.grid(False)
          plt.show()

          ▲圖5 直方圖


          06 箱形圖

          箱形圖又稱為盒須圖、盒式圖或箱線圖,是一種用于顯示一組數(shù)據(jù)分散情況的統(tǒng)計(jì)圖,因形狀如箱子而得名。它主要用于反映原始數(shù)據(jù)分布的特征,也可以進(jìn)行多組數(shù)據(jù)分布特征的比較。箱形圖的主要參數(shù)及說明如下。

          • x:指定要繪制箱線圖的數(shù)據(jù)
          • showcaps:是否顯示箱線圖頂端和末端的兩條線
          • notch:是否是凹口的形式展現(xiàn)箱線圖
          • showbox:是否顯示箱線圖的箱體
          • sym:指定異常點(diǎn)的形狀
          • showfliers:是否顯示異常值
          • vert:是否需要將箱線圖垂直擺放
          • boxprops:設(shè)置箱體的屬性,如邊框色,填充色等
          • whis:指定上下須與上下四分位的距離
          • labels:為箱線圖添加標(biāo)簽
          • positions:指定箱線圖的位置
          • filerprops:設(shè)置異常值的屬性
          • widths:指定箱線圖的寬度
          • medianprops:設(shè)置中位數(shù)的屬性
          • patch_artist:是否填充箱體的顏色
          • meanprops:設(shè)置均值的屬性
          • meanline:是否用線的形式表示均值
          • capprops:設(shè)置箱線圖頂端和末端線條的屬性
          • showmeans:是否顯示均值
          • whiskerprops:whiskerprops設(shè)置須的屬性

          下面繪制箱形圖,如代碼清單6所示。

          • 代碼清單6 繪制箱形圖

          import numpy as np
          import pandas as pd
          import matplotlib.pyplot as plt

          df = pd.DataFrame(np.random.rand(10,5),columns=['a','b','c','d','e'])
          # 繪圖
          plt.boxplot(df,patch_artist=True)  #默認(rèn)垂直擺放箱體
          plt.show()

          垂直箱形圖與水平箱形圖分別如圖6、圖7所示。

          ▲圖6 垂直箱形圖

          ▲圖7 水平箱形圖


          07 組合圖

          前面介紹的都是在figure對(duì)象中創(chuàng)建單獨(dú)的圖像,有時(shí)候我們需要在同一個(gè)畫布中創(chuàng)建多個(gè)子圖或者組合圖,此時(shí)可以用add_subplot創(chuàng)建一個(gè)或多個(gè)subplot來創(chuàng)建組合圖,或者通過subplot使用循環(huán)語句來創(chuàng)建多個(gè)子圖。pyplot.subplots的常用參數(shù)及說明如下。

          • nrows:subplot的行數(shù)
          • ncols:subplot的列數(shù)
          • sharex:所有subplot應(yīng)該使用相同的X軸刻度(調(diào)節(jié)xlim將會(huì)影響所有的subplot)
          • sharey:所有subplot應(yīng)該使用相同的Y軸刻度(調(diào)節(jié)ylim將會(huì)影響所有的subplot)
          • subplot_kw:用于創(chuàng)建各subplot的關(guān)鍵字字典
          • **fig_kw:創(chuàng)建figure時(shí)的其他關(guān)鍵字,如plt.subplots(3,3,figsize=(8,6))

          使用add_subplot創(chuàng)建組合圖,如代碼清單7所示,其可視化結(jié)果如圖8所示。

          • 代碼清單7 繪制組合圖

          from numpy.random import randn
          import matplotlib.pyplot as plt
          #在同一個(gè)figure中創(chuàng)建一組2行2列的subplot
          fig = plt.figure()
          ax1 = fig.add_subplot(2,2,1)  #表示4個(gè)subplot中的第一個(gè)
          ax2 = fig.add_subplot(2,2,2)  #表示4個(gè)subplot中的第二個(gè)
          ax3 = fig.add_subplot(2,2,3)  #表示4個(gè)subplot中的第三個(gè)
          ax4 = fig.add_subplot(2,2,4)  #表示4個(gè)subplot中的第四個(gè)
          ax1.scatter(np.arange(30),np.arange(30)+3*randn(30))
          ax2.bar(np.arange(8),[1,2,3,7,8,5,6,4])
          ax3.hist(randn(100),bins=20)
          ax4.plot(randn(60).cumsum()) 
          plt.show()

          ▲圖8 組合圖

          通過subplot使用循環(huán)語句來創(chuàng)建組合圖,如代碼清單8所示,其可視化結(jié)果如圖9所示。

          • 代碼清單8 使用循環(huán)語句繪制組合圖

          fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
          for i in range(2):
              for j in range(2):
                  axes[i,j].plot(randn(100).cumsum())
          plt.subplots_adjust(wspace=0,hspace=0#用于調(diào)整subplot周圍的間距
          plt.show()

          ▲圖9 組合圖

          利用figure的subplot_adjust方法可以輕易地修改間距,其中wspace和hspace分別用于控制寬度和高度的百分比,可以用作subplot之間的間距。

          本文摘編于《Python廣告數(shù)據(jù)挖掘與分析實(shí)戰(zhàn)》,經(jīng)出版方授權(quán)發(fā)布。


          延伸閱讀??

          延伸閱讀《Python廣告數(shù)據(jù)挖掘與分析實(shí)戰(zhàn)

          直播預(yù)告??


          更多精彩??

          在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          PPT | 讀書 | 書單 | 硬核 | 干貨 | 講明白 | 神操作
          大數(shù)據(jù) | 云計(jì)算 | 數(shù)據(jù)庫 | Python | 爬蟲 | 可視化
          AI | 人工智能 | 機(jī)器學(xué)習(xí) | 深度學(xué)習(xí) | NLP
          5G | 中臺(tái) | 用戶畫像 1024 | 數(shù)學(xué) | 算法 數(shù)字孿生

          據(jù)統(tǒng)計(jì),99%的大咖都關(guān)注了這個(gè)公眾號(hào)
          ??
          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操B小视频 | 国产成人三级在线观看视频 | 加勒比国产在线 | 国产影视一区 | 亚洲精品国产精品乱码桃花 |