日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

用 Python 制作子弹图也这么简单,爱了~

發(fā)布時(shí)間:2024/9/16 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 Python 制作子弹图也这么简单,爱了~ 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

眾所周知,Python 的應(yīng)用是非常廣泛的,今天我們就通過(guò) matplotlib 庫(kù)學(xué)習(xí)下如何制作精美的子彈圖

1什么是子彈圖

一個(gè)子彈圖約定俗成的定義

子彈圖使用長(zhǎng)度/高度、位置和顏色對(duì)數(shù)據(jù)進(jìn)行編碼,以顯示與目標(biāo)和性能帶相比的實(shí)際情況

我們先來(lái)看下子彈圖大概長(zhǎng)什么樣子

子彈圖具有單一的主要度量(例如,當(dāng)前年初至今的收入),將該度量與一個(gè)或多個(gè)其他度量進(jìn)行比較以豐富其含義(例如,與目標(biāo)相比),并將其顯示在性能的定性范圍的背景,例如差、滿意和好。定性范圍顯示為單一色調(diào)的不同強(qiáng)度,使色盲者可以辨別它們,并將儀表板上的顏色使用限制在最低限度

好了,差不多這就是子彈圖的應(yīng)用場(chǎng)景和繪制標(biāo)準(zhǔn)了,下面我們就開(kāi)始制作吧

2構(gòu)建圖表

思路大致是,可以使用堆疊條形圖來(lái)表示各種范圍,并使用另一個(gè)較小的條形圖來(lái)表示值,最后,用一條垂直線標(biāo)記目標(biāo)

可以看出,我們需要多個(gè)組件圖層,使用 matplotlib 來(lái)實(shí)現(xiàn)會(huì)比較方便

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

這里我們還導(dǎo)入了 Seaborn,是因?yàn)?Seaborn 有一些非常有用的工具來(lái)管理調(diào)色板,利用這種功能比嘗試以其他方式復(fù)制它更容易

我們需要生成調(diào)色板的主要原因是我們很可能希望為各種定性范圍生成視覺(jué)上吸引人的配色方案,直接使用 seaborn 來(lái)完成會(huì)方便很多

在下面的例子中,我們可以使用 palplot 便利函數(shù)來(lái)顯示 5 種綠色色調(diào)的調(diào)色板

sns.palplot(sns.light_palette("green",?5))

sns.palplot(sns.light_palette("purple",8,?reverse=True))

以相反的順序制作 8 種不同深淺的紫色

我們現(xiàn)在知道了如何設(shè)置調(diào)色板,接下來(lái)讓我們使用 Matplotlib 根據(jù)上面列出的原則創(chuàng)建一個(gè)簡(jiǎn)單的子彈圖

首先,定義我們想要繪制的值

limits?=?[80,?100,?150] data_to_plot?=?("Example?1",?105,?120)

這個(gè)將創(chuàng)建 3 個(gè)范圍:0-80、81-100、101-150 和一個(gè)值為 105 和目標(biāo)線為 120 的“示例”線 接下來(lái),構(gòu)建一個(gè)藍(lán)色調(diào)色板:

palette?=?sns.color_palette("Blues_r",?len(limits))

接下來(lái)是構(gòu)建范圍的堆積條形圖:

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

然后我們可以添加一個(gè)較小的條形圖來(lái)表示 105 的值:

ax.barh([1],?data_to_plot[1],?color='black',?height=5)

已經(jīng)初見(jiàn)雛形了

最后一步是使用 axvline 添加目標(biāo)標(biāo)記:

ax.axvline(data_to_plot[2],?color="gray",?ymin=0.10,?ymax=0.9)

上面我就完成了子彈圖的簡(jiǎn)單制作,但是我們所有的測(cè)試數(shù)值都是寫(xiě)死的,下面我們編寫(xiě)一個(gè)可以填寫(xiě)任意數(shù)值的代碼

3最終代碼

def?bulletgraph(data=None,?limits=None,?labels=None,?axis_label=None,?title=None,size=(5,?3),?palette=None,?formatter=None,?target_color="gray",bar_color="black",?label_color="gray"):#?Determine?the?max?value?for?adjusting?the?bar?height#?Dividing?by?10?seems?to?work?pretty?wellh?=?limits[-1]?/?10#?Use?the?green?palette?as?a?sensible?defaultif?palette?is?None:palette?=?sns.light_palette("green",?len(limits),?reverse=False)#?Must?be?able?to?handle?one?or?many?data?sets?via?multiple?subplotsif?len(data)?==?1:fig,?ax?=?plt.subplots(figsize=size,?sharex=True)else:fig,?axarr?=?plt.subplots(len(data),?figsize=size,?sharex=True)#?Add?each?bullet?graph?bar?to?a?subplotfor?idx,?item?in?enumerate(data):#?Get?the?axis?from?the?array?of?axes?returned?when?the?plot?is?createdif?len(data)?>?1:ax?=?axarr[idx]#?Formatting?to?get?rid?of?extra?marking?clutterax.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?=?0for?idx2,?lim?in?enumerate(limits):#?Draw?the?barax.barh([1],?lim?-?prev_limit,?left=prev_limit,?height=h,color=palette[idx2])prev_limit?=?limrects?=?ax.patches#?The?last?item?in?the?list?is?the?value?we're?measuring#?Draw?the?value?we're?measuringax.barh([1],?item[1],?height=(h?/?3),?color=bar_color)#?Need?the?ymin?and?max?in?order?to?make?sure?the?target?marker#?fitsymin,?ymax?=?ax.get_ylim()ax.vlines(item[2],?ymin?*?.9,?ymax?*?.9,?linewidth=1.5,?color=target_color)#?Now?make?some?labelsif?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)

代碼雖然看起來(lái)有點(diǎn)長(zhǎng),但是其實(shí)都是上面步驟的疊加,都比較簡(jiǎn)單,就不再重復(fù)說(shuō)明了

我們直接調(diào)用一下看看效果

data_to_plot2?=?[("張三",?105,?120),("李四",?99,?110),("王五",?109,?125),("趙六",?135,?123),("錢(qián)七",?45,?105)]bulletgraph(data_to_plot2,?limits=[20,?60,?100,?160],labels=["Poor",?"OK",?"Good",?"Excellent"],?size=(8,5),axis_label="Performance?Measure",?label_color="black",bar_color="#252525",?target_color='#f7f7f7',title="銷售代表表現(xiàn)")

我們還可以進(jìn)行一些優(yōu)化,格式化 x 軸以便更一致地顯示信息

在下面這個(gè)例子中,我們可以衡量一家假設(shè)公司的營(yíng)銷預(yù)算績(jī)效

def?money(x,?pos):'The?two?args?are?the?value?and?tick?position'return?"${:,.0f}".format(x)money_fmt?=?FuncFormatter(money) data_to_plot3?=?[("HR",?50000,?60000),("Marketing",?75000,?65000),("Sales",?125000,?80000),("R&D",?195000,?115000)] 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="營(yíng)銷渠道預(yù)算績(jī)效",formatter=money_fmt)

看起來(lái)效果都不錯(cuò)哦,怎么樣,一起跟著做起來(lái)吧!

END

推薦閱讀牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇) 牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)

總結(jié)

以上是生活随笔為你收集整理的用 Python 制作子弹图也这么简单,爱了~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97超碰碰碰 | 性开放淫合集 | 精品99在线 | 免费观看毛片网站 | 96精品视频在线观看 | 欧美理伦片在线播放 | 国产21区 | 色播在线视频 | 桃色91 | www.17c.com喷水少妇 | 嫩草影院一区 | 99在线免费观看 | 亚洲码视频 | 蜜臀中文字幕 | 我爱我色成人网 | 中文在线视频观看 | 国产精品--色哟哟 | 99精品视频一区二区 | 亚洲av首页在线 | 国内精品视频一区 | 久久久久久久成人 | 中文字幕一区二区在线播放 | 麻豆国产一区二区三区四区 | 亚洲成人生活片 | 2019国产在线 | 一二三区精品视频 | 亚洲h网站 | 国产偷啪 | 99在线观看免费 | 中文精品无码中文字幕无码专区 | 人人干97 | 色综合久久久久无码专区 | 成人av在线一区二区 | 四虎午夜| 天天操好逼 | 嫩草影院国产 | 国产色一区 | 精品人妻在线播放 | 色wwwwww| 免费吸乳羞羞网站视频 | 香蕉视频亚洲一级 | 日本啪啪啪一区二区 | 久久女人网 | 思思99精品视频在线观看 | 日韩中文字幕av | 北条麻妃在线一区二区 | 亚洲免费网址 | 欧美乱色| 李丽珍裸体午夜理伦片 | 国产午夜激情 | 少妇资源 | 色网站免费观看 | 国产尤物av尤物在线看 | 欧美私人情侣网站 | 影视av| 雪花飘电影在线观看免费高清 | 男人草女人 | 久久e热| 琪琪原网址 | 国产在线www | 人人澡人人澡 | 国产传媒视频在线观看 | 欧洲在线视频 | 男人插入女人下面的视频 | 999国内精品永久免费视频 | 国产特黄一级片 | 无码国产精品高潮久久99 | 精品国产一区二区三区四 | 国产无遮挡aaa片爽爽 | 国产成人精品综合 | 99ri国产精品 | 在线免费观看黄色片 | 国产三级观看 | 亚洲精品乱码久久久久久写真 | 日韩av一二三区 | 快灬快灬一下爽69 | 中文文字幕一区二区三三 | 亚洲自拍另类 | 亚洲精品男人天堂 | 成人看片在线 | 亚洲高清在线播放 | 国产日韩欧美视频在线 | 亚洲精品久久久久中文字幕二区 | freesexvideos第一次 | 日韩精品啪啪 | 国精产品一区 | 黄色综合 | 人妻熟女一区 | 学生调教贱奴丨vk | 夜夜嗨一区二区三区 | 日韩人妻无码精品久久免费 | 美女免费毛片 | 黄色国产片 | 免费成人深夜 | 久久久精品国产sm调教网站 | 亚洲精品另类 | 亚洲理论片 | 欧美精品一区二区三区久久 | 成年人免费网 |