99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖
2021-07-09
收藏

來(lái)源:數(shù)據(jù)STUDIO

作者:云朵君

今天給大家?guī)?lái)一篇比較有意思的可視化圖——子彈圖詳細(xì)繪圖教程。對(duì)比Excel與Pyhton,手把手教你繪制高大上的子彈圖。

P.S. 本文使用Excel for Mac作為演示,Windows Excel操作稍有不同,差異大的地方文中有額外解釋,總體繪圖步驟和思想是一致的,不影響理解和閱讀。

1、子彈圖

子彈圖的樣子很像子彈射出后帶出的軌道,所以稱為子彈圖(英文名:Bullet Graph)。子彈圖的發(fā)明是為了取代儀表盤上常見的那種里程表,時(shí)速表等基于圓形的信息表達(dá)方式。

子彈圖的特點(diǎn)如下:

  • 每一個(gè)單元的子彈圖只能顯示單一的數(shù)據(jù)信息源
  • 通過添加合理的度量標(biāo)尺可以顯示更精確的階段性數(shù)據(jù)信息
  • 通過優(yōu)化設(shè)計(jì)還能夠用于表達(dá)多項(xiàng)同類數(shù)據(jù)的對(duì)比
  • 可以表達(dá)一項(xiàng)數(shù)據(jù)與不同目標(biāo)的校對(duì)結(jié)果

子彈圖無(wú)修飾的線性表達(dá)方式使我們能夠在狹小的空間中表達(dá)豐富的數(shù)據(jù)信息,線性的信息表達(dá)方式與我們習(xí)以為常的文字閱讀相似,相對(duì)于圓形構(gòu)圖的信息表達(dá),在信息傳遞上有更大的效能優(yōu)勢(shì)。

2、子彈圖的構(gòu)成

下圖為子彈圖的結(jié)構(gòu),以及與柱形圖的對(duì)比

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

主要數(shù)據(jù)值由圖表中間主條形的長(zhǎng)度所表示,稱為功能度量(Feature Measure);而與圖表方向垂直的直線標(biāo)記則稱為比較度量(Comparative Measure),用來(lái)與功能度量所得數(shù)值進(jìn)行比較。如果主條形長(zhǎng)度超越比較度量標(biāo)記的位置,則代表數(shù)據(jù)達(dá)標(biāo)。

功能度量背后的分段顏色條形用來(lái)顯示定性范圍得分。每種色調(diào)(如上面示例中三種不同深度的灰色)表示不同表現(xiàn)范圍等級(jí),如欠佳、平均和良好。當(dāng)使用子彈圖時(shí),建議最多使用五個(gè)等級(jí)。

3、子彈圖和柱狀圖對(duì)比

柱狀圖主要用于多個(gè)分類間的數(shù)據(jù)(大小、數(shù)值)的對(duì)比。

子彈圖主要用于各個(gè)分類間各自的數(shù)值所處狀態(tài)與測(cè)量標(biāo)記的對(duì)比,突出的是每個(gè)分類自身的情況,沒有分類間的比較,用于展示各個(gè)分類的子彈圖單元相對(duì)獨(dú)立。

一、Excel繪制子彈圖

子彈圖分為橫向子彈圖和縱向子彈圖。兩者繪制方法有所差異!

縱向子彈圖

用Excel繪制縱向子彈圖較為簡(jiǎn)單。選擇需要繪制的數(shù)據(jù),插入簇狀柱形圖,然后更改圖表類型。將"目標(biāo)值"與"銷售額"更改為次坐標(biāo)軸,圖表類型分別為"帶數(shù)據(jù)標(biāo)記的折線圖"和"簇狀柱形圖","合格值"與"挑戰(zhàn)值"為"堆積柱形圖"。

最后更改實(shí)際銷售額"簇狀柱形圖"的柱子寬度(調(diào)整間隙寬度),和目標(biāo)值的"帶數(shù)據(jù)標(biāo)記的折線圖"標(biāo)記類型(-)和大小(18)。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

橫向子彈圖

橫向子彈圖與縱向子彈圖不同,它的繪制方法較為復(fù)雜,下面我們一步步帶你操作。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

1、數(shù)據(jù)準(zhǔn)備

已有字段
地區(qū),目標(biāo)銷售額,實(shí)際銷售額,挑戰(zhàn)銷售額,合格銷售額五個(gè)字段。

添加字段

  • 挑戰(zhàn)=挑戰(zhàn)值-合格值
  • y-次軸,以0.5為開始值,級(jí)差為0.5的等差數(shù)列,用于散點(diǎn)圖的y軸

2、Step01

選擇數(shù)據(jù),繪制橫行堆積條形圖。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

3、Step02

插入一個(gè)銷售額列,并選擇對(duì)應(yīng)x/y軸數(shù)據(jù)。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

選擇上步添加的銷售額堆積條形圖,修改圖表類型為散點(diǎn)圖,設(shè)置坐標(biāo)軸類型為【次要坐標(biāo)軸】

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

4、Step03

選擇合格值數(shù)據(jù)條,設(shè)置【間隙寬度】為50%。并按照銷售額的方法添加目標(biāo)值散點(diǎn)圖

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

5、Step04

實(shí)際銷售額與目標(biāo)銷售額的繪制。這一步上win和mac兩者差異較大,因此在這里分別說明了步驟。

mac方法:

單擊【添加圖表元素】-【誤差線】-【標(biāo)準(zhǔn)誤差線】,點(diǎn)擊并刪除垂直誤差線,選擇“水平誤差線”并設(shè)置誤差線格式,方向?yàn)椤矩?fù)偏差】,末端樣式為【無(wú)線端】,誤差量為【自定義】,【指定值】數(shù)據(jù)來(lái)源為銷售額單元格。如下圖所示。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖


win方法:

單擊【添加圖表元素】-【誤差線】-【其他誤差線選項(xiàng)】,在打開的窗格中選擇“水平誤差線”,方向?yàn)椤矩?fù)偏差】,末端樣式為【無(wú)線端】,誤差量為【自定義】,在打開的【自定義錯(cuò)誤欄】中選【負(fù)錯(cuò)誤值】,數(shù)據(jù)來(lái)源為銷售額單元格。

6、Step05

先選擇銷售額水平誤差線,增加線條的粗細(xì)至合適寬度,標(biāo)記點(diǎn)設(shè)為無(wú)。

再按照上一步方法設(shè)置目標(biāo)值,添加誤差線,方向?yàn)榇怪狈较?,無(wú)線端,誤差量為【固定值】至合適寬度。

對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

二、Python繪制子彈圖

Python繪制子彈圖方法也不復(fù)雜,這里需要借助seaborn調(diào)色板繪制子彈圖的背景顏色。配合使用matplotlib繪制條形圖和豎線條繪制實(shí)際值和目標(biāo)值即可。

1、導(dǎo)入相應(yīng)模塊

import matplotlib.pyplot as plt import seaborn as sns from matplotlib.ticker import FuncFormatter
%matplotlib inline

2、Seaborn調(diào)色板

sns.palplot(sns.light_palette("green", 5))
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

增加調(diào)色板長(zhǎng)度及顏色

sns.palplot(sns.light_palette("purple",8, reverse=True))
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

3、設(shè)置要繪制的數(shù)據(jù)

limits = [80100150] data_to_plot = ("Example 1"105120) palette = sns.color_palette("Blues_r", len(limits))

4、嘗試構(gòu)建第一個(gè)堆疊條形圖

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_yticks([1])
ax.set_yticklabels([data_to_plot[0]])

prev_limit = 0 for idx, lim in enumerate(limits):
    ax.barh([1], lim-prev_limit, left=prev_limit, height=15, color=palette[idx])
    prev_limit = lim
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

增加測(cè)量值

# 畫出我們要測(cè)量的值 ax.barh([1], data_to_plot[1], color='black', height=5)
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

添加目標(biāo)垂直線

ax.axvline(data_to_plot[2], color="blue", 
           ymin=0.10, ymax=0.9)
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

5、定義完整的函數(shù)

函數(shù)參數(shù)

data: 標(biāo)簽、測(cè)量和目標(biāo)的列表
limits: 范圍值列表
labels: 限制范圍的描述列表
axis_label: 描述x軸的字符串
title: 圖標(biāo)題
size: 繪圖尺寸元組
palette: seaborn調(diào)色板
formatter: matplotlib formatter 對(duì)象的x軸
target_color: 目標(biāo)行顏色字符串
bar_color: 小條的顏色字符串
label_color: 限制標(biāo)簽文本的顏色字符串

bulletgraph(data=None, limits=None, labels=None, axis_label=None,
            title=None, size=(53), palette=None, formatter=None,
            target_color="gray", bar_color="black", label_color="gray")

6、子彈圖01

# 數(shù)據(jù)準(zhǔn)備 data_to_plot2 = [("張三", 105, 120),
                 ("李斯", 99, 110),
                 ("王武", 109, 125),
                 ("侯奇", 135, 123),
                 ("巴蜀", 45, 105)] # 繪制圖 bulletgraph(data_to_plot2, limits=[20, 60, 100, 160], 
            labels=["Poor""OK""Good""Excellent"], 
            size=(8,5), axis_label="績(jī)效考核", 
            label_color="black", bar_color="#252525", 
            target_color='#f7f7f7',             title="銷售代表績(jī)效")
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

7、子彈圖02

money_fmt = FuncFormatter(money) # 數(shù)據(jù)準(zhǔn)備 data_to_plot3 = [("Print", 50000, 60000),
                 ("Billboards", 75000, 65000),
                 ("Radio", 125000, 80000),
                 ("Online", 195000, 115000)] # 設(shè)置調(diào)色板 palette = sns.light_palette("grey", 3, reverse=False)
bulletgraph(data_to_plot3, 
            limits=[50000, 125000, 200000], 
            labels=["Below""On Target""Above"], 
            size=(10,5), axis_label="Annual Budget", 
            label_color="black", bar_color="#252525", 
            target_color='#f7f7f7', palette=palette,             title="Marketing Channel Budget Performance", 
            formatter=money_fmt)
對(duì)比學(xué)習(xí),用Excel和Python繪制子彈圖

8、子彈圖特點(diǎn)

總結(jié)一下,子彈圖有以下特點(diǎn):

  1. 有設(shè)置定性的數(shù)據(jù)范圍,采用同一色系中不同深淺的顏色來(lái)表示。比如上圖中有Bad、Good、Excellent三個(gè)定性的數(shù)值范圍(也可以采用更多個(gè),但是不建議過多,一般3~5個(gè)即可)。
  2. 主體數(shù)據(jù)條柱,一般用較深的顏色表示,可以吸引人的眼球,比如我們用來(lái)表達(dá)實(shí)際完成情況。這個(gè)柱子與定性范圍的柱子是重疊在一起的,但是比它們要窄。
  3. 有一個(gè)橫線(豎線)作為主要標(biāo)記標(biāo)識(shí),可以用來(lái)表示目標(biāo),方便直觀地對(duì)比是否達(dá)成目標(biāo)。
  4. 刻度量表,可以清晰地表達(dá)具體的數(shù)值,這里我們就用坐標(biāo)軸表示。
  5. 文本標(biāo)簽,可以用來(lái)表示圖表的信息內(nèi)容。

9、附錄子彈圖完整函數(shù)

def bulletgraph(data=None, limits=None, labels=None, axis_label=None, title=None,
                size=(53), palette=None, formatter=None, target_color="gray",
                bar_color="black", label_color="gray"):     """ Build out a bullet graph image
        Args:
            data = 標(biāo)簽、測(cè)量和目標(biāo)的列表
            limits = 范圍值列表
            labels = 限制范圍的描述列表
            axis_label = 描述x軸的字符串
            title = 圖標(biāo)題
            size = 繪圖尺寸元組
            palette = seaborn調(diào)色板
            formatter = matplotlib formatter 對(duì)象的x軸
            target_color = 目標(biāo)行顏色字符串
            bar_color = 小條的顏色字符串
            label_color = 限制標(biāo)簽文本的顏色字符串
        Returns:
            a matplotlib figure
    """     # 確定調(diào)整工具條高度的最大值     # 除以10似乎很有效     h = limits[-1] / 10     # 使用綠色調(diào)色板作為合理的默認(rèn)設(shè)置     if palette is None:
        palette = sns.light_palette("green", len(limits), reverse=False)

    # 必須能夠通過多個(gè)子圖處理一個(gè)或多個(gè)數(shù)據(jù)集     if len(data) == 1:
        fig, ax = plt.subplots(figsize=size, sharex=True)
    else:
        fig, axarr = plt.subplots(len(data), figsize=size, sharex=True)

    # 將每個(gè)項(xiàng)目符號(hào)圖形條添加到副圖中     for idx, item in enumerate(data):

        # 從創(chuàng)建繪圖時(shí)返回的軸數(shù)組中獲取軸         if len(data) > 1:
            ax = axarr[idx]

        # 格式化以消除額外的標(biāo)記混亂         ax.set_aspect('equal')
        ax.set_yticklabels([item[0]])
        ax.set_yticks([1])
        ax.spines['bottom'].set_visible(False)
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['left'].set_visible(False)

        prev_limit = 0         for idx2, lim in enumerate(limits):
            # 繪制條形圖             ax.barh([1], lim - prev_limit, left=prev_limit, height=h,
                    color=palette[idx2])
            prev_limit = lim
        rects = ax.patches
        # 列表中的最后一項(xiàng)是我們要測(cè)量的值          # 繪制我們正在測(cè)量的值         ax.barh([1], item[1], height=(h / 3), color=bar_color)

        # 需要ymin和max,以確保目標(biāo)標(biāo)記適合         ymin, ymax = ax.get_ylim()
        ax.vlines(
            item[2], ymin * .9, ymax * .9, linewidth=1.5, color=target_color)

    # 現(xiàn)在做一些標(biāo)簽     if labels is not None:
        for rect, label in zip(rects, labels):
            height = rect.get_height()
            ax.text(
                rect.get_x() + rect.get_width() / 2,
                -height * .4,
                label,
                ha='center',
                va='bottom',
                color=label_color)
    if formatter:
        ax.xaxis.set_major_formatter(formatter)
    if axis_label:
        ax.set_xlabel(axis_label)
    if title:
        fig.suptitle(title, fontsize=14)
    fig.subplots_adjust(hspace=0)

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }