久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    5 種快速易用的 Python Matplotlib 數(shù)據(jù)可視化方法

     風(fēng)聲之家 2021-09-26

    Python編程學(xué)習(xí)圈 2021-09-26

    數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)家工作的重要部分。在項(xiàng)目的早期階段,我們通常需要進(jìn)行探索性數(shù)據(jù)分析來(lái)獲得對(duì)數(shù)據(jù)的洞察。通過(guò)數(shù)據(jù)可視化可以讓該過(guò)程變得更加清晰易懂,尤其是在處理大規(guī)模、高維度數(shù)據(jù)集時(shí)。在本文中,我們介紹了最基本的 5 種數(shù)據(jù)可視化圖表,在展示了它們的優(yōu)劣點(diǎn)后,我們還提供了繪制對(duì)應(yīng)圖表的 Matplotlib 代碼。

    Matplotlib 是一個(gè)很流行的 Python 庫(kù),可以幫助你快速方便地構(gòu)建數(shù)據(jù)可視化圖表。然而,每次啟動(dòng)一個(gè)新項(xiàng)目時(shí)都需要重新設(shè)置數(shù)據(jù)、參數(shù)、圖形和繪圖方式是非常枯燥無(wú)聊的。本文將介紹 5 種數(shù)據(jù)可視化方法,并用 Python 和 Matplotlib 寫一些快速易用的可視化函數(shù)。下圖展示了選擇正確可視化方法的導(dǎo)向圖。

    圖片

    選擇正確可視化方法的導(dǎo)向圖。

    散點(diǎn)圖

    由于可以直接看到原始數(shù)據(jù)的分布,散點(diǎn)圖對(duì)于展示兩個(gè)變量之間的關(guān)系非常有用。你還可以通過(guò)用顏色將數(shù)據(jù)分組來(lái)觀察不同組數(shù)據(jù)之間的關(guān)系,如下圖所示。你還可以添加另一個(gè)參數(shù),如數(shù)據(jù)點(diǎn)的半徑來(lái)編碼第三個(gè)變量,從而可視化三個(gè)變量之間的關(guān)系,如下方第二個(gè)圖所示。

    圖片

    用顏色分組的散點(diǎn)圖。

    圖片

    用顏色分組的散點(diǎn)圖,點(diǎn)半徑作為第三個(gè)變量表示國(guó)家規(guī)模。

    接下來(lái)是代碼部分。我們首先將 Matplotlib 的 pyplot 導(dǎo)入為 plt,并調(diào)用函數(shù) plt.subplots() 來(lái)創(chuàng)建新的圖。我們將 x 軸和 y 軸的數(shù)據(jù)傳遞給該函數(shù),然后將其傳遞給 ax.scatter() 來(lái)畫出散點(diǎn)圖。我們還可以設(shè)置點(diǎn)半徑、點(diǎn)顏色和 alpha 透明度,甚至將 y 軸設(shè)置為對(duì)數(shù)尺寸,最后為圖指定標(biāo)題和坐標(biāo)軸標(biāo)簽。

    import matplotlib.pyplot as plt
    import numpy as np

    def scatterplot(x_data, y_data, x_label="", y_label="", title="", color = "r", yscale_log=False):

        # Create the plot object
        _, ax = plt.subplots()

        # Plot the data, set the size (s), color and transparency (alpha)
        # of the points
        ax.scatter(x_data, y_data, s = 10, color = color, alpha = 0.75)

        if yscale_log == True:
            ax.set_yscale('log')

        # Label the axes and provide a title
        ax.set_title(title)
        ax.set_xlabel(x_label)
        ax.set_ylabel(y_label)

    線圖

    當(dāng)一個(gè)變量隨另一個(gè)變量的變化而變化的幅度很大時(shí),即它們有很高的協(xié)方差時(shí),線圖非常好用。如下圖所示,我們可以看到,所有專業(yè)課程的相對(duì)百分?jǐn)?shù)隨年代的變化的幅度都很大。用散點(diǎn)圖來(lái)畫這些數(shù)據(jù)將變得非常雜亂無(wú)章,而難以看清其本質(zhì)。線圖非常適合這種情況,因?yàn)樗梢钥焖俚乜偨Y(jié)出兩個(gè)變量的協(xié)方差。在這里,我們也可以用顏色將數(shù)據(jù)分組。

    圖片

    線圖示例。

    以下是線圖的實(shí)現(xiàn)代碼,和散點(diǎn)圖的代碼結(jié)構(gòu)很相似,只在變量設(shè)置上有少許變化。

    def lineplot(x_data, y_data, x_label="", y_label="", title=""):
        # Create the plot object
        _, ax = plt.subplots()

        # Plot the best fit line, set the linewidth (lw), color and
        # transparency (alpha) of the line
        ax.plot(x_data, y_data, lw = 2, color = '#539caf', alpha = 1)

        # Label the axes and provide a title
        ax.set_title(title)
        ax.set_xlabel(x_label)
        ax.set_ylabel(y_label)

    直方圖

    直方圖對(duì)于觀察或真正了解數(shù)據(jù)點(diǎn)的分布十分有用。以下為我們繪制的頻率與 IQ 的直方圖,我們可以直觀地了解分布的集中度(方差)與中位數(shù),也可以了解到該分布的形狀近似服從于高斯分布。使用這種柱形(而不是散點(diǎn)圖等)可以清楚地可視化每一個(gè)箱體(X 軸的一個(gè)等距區(qū)間)間頻率的變化。使用箱體(離散化)確實(shí)能幫助我們觀察到「更完整的圖像」,因?yàn)槭褂盟袛?shù)據(jù)點(diǎn)而不采用離散化會(huì)觀察不到近似的數(shù)據(jù)分布,可能在可視化中存在許多噪聲,使其只能近似地而不能描述真正的數(shù)據(jù)分布。

    圖片

    直方圖案例

    下面展示了 Matplotlib 中繪制直方圖的代碼。這里有兩個(gè)步驟需要注意,首先,n_bins 參數(shù)控制直方圖的箱體數(shù)量或離散化程度。更多的箱體或柱體能給我們提供更多的信息,但同樣也會(huì)引入噪聲并使我們觀察到的全局分布圖像變得不太規(guī)則。而更少的箱體將給我們更多的全局信息,我們可以在缺少細(xì)節(jié)信息的情況下觀察到整體分布的形狀。其次,cumulative 參數(shù)是一個(gè)布爾值,它允許我們選擇直方圖是不是累積的,即選擇概率密度函數(shù)(PDF)或累積密度函數(shù)(CDF)。

    def histogram(data, n_bins, cumulative=False, x_label = "", y_label = "", title = ""):
        _, ax = plt.subplots()
        ax.hist(data, n_bins = n_bins, cumulative = cumulative, color = '#539caf')
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)

    如果我們希望比較數(shù)據(jù)中兩個(gè)變量的分布,有人可能會(huì)認(rèn)為我們需要制作兩個(gè)獨(dú)立的直方圖,并將它們拼接在一起而進(jìn)行比較。但實(shí)際上 Matplotlib 有更好的方法,我們可以用不同的透明度疊加多個(gè)直方圖。如下圖所示,均勻分布設(shè)置透明度為 0.5,因此我們就能將其疊加在高斯分布上,這允許用戶在同一圖表上繪制并比較兩個(gè)分布。

    圖片

    疊加直方圖

    在疊加直方圖的代碼中,我們需要注意幾個(gè)問(wèn)題。首先,我們?cè)O(shè)定的水平區(qū)間要同時(shí)滿足兩個(gè)變量的分布。根據(jù)水平區(qū)間的范圍和箱體數(shù),我們可以計(jì)算每個(gè)箱體的寬度。其次,我們?cè)谝粋€(gè)圖表上繪制兩個(gè)直方圖,需要保證一個(gè)直方圖存在更大的透明度。

    # Overlay 2 histograms to compare them
    def overlaid_histogram(data1, data2, n_bins = 0, data1_name="", data1_color="#539caf", data2_name="", data2_color="#7663b0", x_label="", y_label="", title=""):
        # Set the bounds for the bins so that the two distributions are fairly compared
        max_nbins = 10
        data_range = [min(min(data1), min(data2)), max(max(data1), max(data2))]
        binwidth = (data_range[1] - data_range[0]) / max_nbins


        if n_bins == 0
            bins = np.arange(data_range[0], data_range[1] + binwidth, binwidth)
        else
            bins = n_bins

        # Create the plot
        _, ax = plt.subplots()
        ax.hist(data1, bins = bins, color = data1_color, alpha = 1, label = data1_name)
        ax.hist(data2, bins = bins, color = data2_color, alpha = 0.75, label = data2_name)
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)
        ax.legend(loc = 'best')

    條形圖

    當(dāng)對(duì)類別數(shù)很少(<10)的分類數(shù)據(jù)進(jìn)行可視化時(shí),條形圖是最有效的。當(dāng)類別數(shù)太多時(shí),條形圖將變得很雜亂,難以理解。你可以基于條形的數(shù)量觀察不同類別之間的區(qū)別,不同的類別可以輕易地分離以及用顏色分組。我們將介紹三種類型的條形圖:常規(guī)、分組和堆疊條形圖。

    常規(guī)條形圖如圖 1 所示。在 barplot() 函數(shù)中,x_data 表示 x 軸上的不同類別,y_data 表示 y 軸上的條形高度。誤差條形是額外添加在每個(gè)條形中心上的線,可用于表示標(biāo)準(zhǔn)差。

    圖片

    常規(guī)條形圖

    分組條形圖允許我們比較多個(gè)類別變量。如下圖所示,我們第一個(gè)變量會(huì)隨不同的分組(G1、G2 等)而變化,我們?cè)诿恳唤M上比較不同的性別。正如代碼所示,y_data_list 變量現(xiàn)在實(shí)際上是一組列表,其中每個(gè)子列表代表了一個(gè)不同的組。然后我們循環(huán)地遍歷每一個(gè)組,并在 X 軸上繪制柱體和對(duì)應(yīng)的值,每一個(gè)分組的不同類別將使用不同的顏色表示。

    圖片

    分組條形圖

    堆疊條形圖非常適合于可視化不同變量的分類構(gòu)成。在下面的堆疊條形圖中,我們比較了工作日的服務(wù)器負(fù)載。通過(guò)使用不同顏色的方塊堆疊在同一條形圖上,我們可以輕松查看并了解哪臺(tái)服務(wù)器每天的工作效率最高,和同一服務(wù)器在不同天數(shù)的負(fù)載大小。繪制該圖的代碼與分組條形圖有相同的風(fēng)格,我們循環(huán)地遍歷每一組,但我們這次在舊的柱體之上而不是旁邊繪制新的柱體。

    圖片

    堆疊條形圖

    def barplot(x_data, y_data, error_data, x_label="", y_label="", title=""):
        _, ax = plt.subplots()
        # Draw bars, position them in the center of the tick mark on the x-axis
        ax.bar(x_data, y_data, color = '#539caf', align = 'center')
        # Draw error bars to show standard deviation, set ls to 'none'
        # to remove line between points
        ax.errorbar(x_data, y_data, yerr = error_data, color = '#297083', ls = 'none', lw = 2, capthick = 2)
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)



    def stackedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
        _, ax = plt.subplots()
        # Draw bars, one category at a time
        for i in range(0, len(y_data_list)):
            if i == 0:
                ax.bar(x_data, y_data_list[i], color = colors[i], align = 'center', label = y_data_names[i])
            else:
                # For each category after the first, the bottom of the
                # bar will be the top of the last category
                ax.bar(x_data, y_data_list[i], color = colors[i], bottom = y_data_list[i - 1], align = 'center', label = y_data_names[i])
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)
        ax.legend(loc = 'upper right')



    def groupedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
        _, ax = plt.subplots()
        # Total width for all bars at one x location
        total_width = 0.8
        # Width of each individual bar
        ind_width = total_width / len(y_data_list)
        # This centers each cluster of bars about the x tick mark
        alteration = np.arange(-(total_width/2), total_width/2, ind_width)


        # Draw bars, one category at a time
        for i in range(0, len(y_data_list)):
            # Move the bar to the right on the x-axis so it doesn't
            # overlap with previously drawn ones
            ax.bar(x_data + alteration[i], y_data_list[i], color = colors[i], label = y_data_names[i], width = ind_width)
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)
        ax.legend(loc = 'upper right')

    箱線圖

    上述的直方圖對(duì)于可視化變量分布非常有用,但當(dāng)我們需要更多信息時(shí),怎么辦?我們可能需要清晰地可視化標(biāo)準(zhǔn)差,也可能出現(xiàn)中位數(shù)和平均值差值很大的情況(有很多異常值),因此需要更細(xì)致的信息。還可能出現(xiàn)數(shù)據(jù)分布非常不均勻的情況等等。

    箱線圖可以給我們以上需要的所有信息。實(shí)線箱的底部表示第一個(gè)四分位數(shù),頂部表示第三個(gè)四分位數(shù),箱內(nèi)的線表示第二個(gè)四分位數(shù)(中位數(shù))。虛線表示數(shù)據(jù)的分布范圍。

    由于箱線圖是對(duì)單個(gè)變量的可視化,其設(shè)置很簡(jiǎn)單。x_data 是變量的列表。Matplotlib 函數(shù) boxplot() 為 y_data 的每一列或 y_data 序列中的每個(gè)向量繪制一個(gè)箱線圖,因此 x_data 中的每個(gè)值對(duì)應(yīng) y_data 中的一列/一個(gè)向量。

    圖片

    箱線圖示例。

    def boxplot(x_data, y_data, base_color="#539caf", median_color="#297083", x_label="", y_label="", title=""):
        _, ax = plt.subplots()

        # Draw boxplots, specifying desired style
        ax.boxplot(y_data
                   # patch_artist must be True to control box fill
                   , patch_artist = True
                   # Properties of median line
                   , medianprops = {'color': median_color}
                   # Properties of box
                   , boxprops = {'color': base_color, 'facecolor': base_color}
                   # Properties of whiskers
                   , whiskerprops = {'color': base_color}
                   # Properties of whisker caps
                   , capprops = {'color': base_color})

        # By default, the tick label starts at 1 and increments by 1 for
        # each box drawn. This sets the labels to the ones we want
        ax.set_xticklabels(x_data)
        ax.set_ylabel(y_label)
        ax.set_xlabel(x_label)
        ax.set_title(title)

    結(jié)論

    本文介紹了 5 種方便易用的 Matplotlib 數(shù)據(jù)可視化方法。將可視化過(guò)程抽象為函數(shù)可以令代碼變得易讀和易用。

    原文地址:https:///5-quick-and-easy-data-visualizations-in-python-with-code-a2284bae952f

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲色欲色欲WWW成人网| 久久精品国产亚洲AV瑜伽| 精品国偷自产在线视频99| 国内精品一区二区三区| 国产成人午夜福利院| 日韩免费无码一区二区三区| 国产免费一区二区视频| 不卡乱辈伦在线看中文字幕| 精品久久久久久无码人妻热| 国产精品成人午夜福利| 免费无码又爽又刺激高潮| 亚洲国模精品一区二区| 亚洲国产精品久久电影欧美| 91中文字幕一区二区| 成人欧美一区二区三区的电影| 四虎成人在线观看免费| 免费国产黄线在线观看| 精品国产精品中文字幕| 无码人妻丰满熟妇区毛片18| 日本一区不卡高清更新二区| 亚洲国产无套无码AV电影| 亚洲理论在线A中文字幕| 亚洲AV无码专区在线播放中文| 男人猛进出女人下面视频| 3D动漫精品啪啪一区二区免费| 乱码视频午夜在线观看| 亚洲色婷婷综合开心网| 又爽又黄又无遮挡的视频| 亚洲色大成网站WWW永久麻豆| 国产丝袜视频一区二区三区| 67194熟妇在线观看线路 | 蜜桃视频一区二区在线观看| 亚洲AV无一区二区三区| 国产欧美日韩高清在线不卡| 久久精品国产蜜臀av| 免费人成在线观看| 隔壁人妻被水电工征服| 免费无码又爽又刺激高潮虎虎视频| 国产精品美女乱子伦高潮| 国产精品无码一区二区三区电影| 377P欧洲日本亚洲大胆|