bar函數(shù)在python python bacon函數(shù)

Python畫截斷圖

近日,幫女朋友畫截斷圖時,遇到了一些問題,網(wǎng)上很多資料都是互相粘貼,缺少能夠解決問題的帖子,經(jīng)過查看官方api最終解決了問題。

創(chuàng)新互聯(lián)成立于2013年,我們提供高端網(wǎng)站建設公司、成都網(wǎng)站制作、網(wǎng)站設計、網(wǎng)站定制、成都全網(wǎng)營銷推廣、成都小程序開發(fā)、微信公眾號開發(fā)、seo優(yōu)化排名服務,提供專業(yè)營銷思路、內容策劃、視覺設計、程序開發(fā)來完成項目落地,為成都地磅秤企業(yè)提供源源不斷的流量和訂單咨詢。

在此記錄一下,也希望能夠幫助其他有需要的人。

這個是最方便的一種解決辦法,官網(wǎng)地址為 Pypi ,官網(wǎng)的教程比較簡潔

即可以得到可用的圖:

看著效果好像還不錯,但是如果要畫柱狀圖,則如何解決呢?

仿照官方的程序,我們可以寫出來以下的程序

得到以下圖:

這個圖我們可以發(fā)現(xiàn)存在一定的問題,它的橫坐標不對了,我們的“1”顯示不出來了?。。?/p>

那怎么解決呢?可以知道我們在bar()函數(shù)中使用 tick_label=name_list 是不可行的了,那我們試下 plt.xticks 函數(shù)看看

首先刪除bar函數(shù)中的 tick_label=name_list ,然后在 plt.show() 前面加上 plt.xticksx,name_list) ,得到下圖結果

我們通過對比這兩個圖,可以發(fā)現(xiàn)一個很trick的解決辦法!

第一個圖,沒有自帶的刻度,但是少了一個我們想要的刻度;第二個圖,存在自帶的刻度,但是我們想要的刻度全都有!

我們能不能考慮結合下呢?

我們嘗試在bar中加上一個空的刻度,然后再顯示出來

因此,這個方案在一些簡單的圖上還可以應用,復雜的場景就難以解決了!

matplotlib具有很強的自定義能力,我們可以考慮通過畫兩個子圖,然后拼接成一個,來生成我們的截斷圖!

看著結果似乎還不錯,坐標的刻度也顯示正常啦

只是,由于我們使用subplot畫出來的兩個圖默認大小是一樣的,而前文使用brokenaxes畫出來的截斷上下的長度并不一樣。我們這樣畫出來的圖不好看,還需要調整下!

考慮到matplotlib可以使用grid來畫圖,我們嘗試用它來調整下上下兩圖的比例!

畫出來的結果好看多了!

重新畫一下圖

問題解決了!

我們得到了一個完整的圖!

參考文獻:

如何用python繪制簡單條形圖?

如何用python繪制簡單條形圖呢?這里離不開matplotlib的使用。

條形圖是數(shù)據(jù)可視化圖形中很基礎也很常用的一種圖,簡單解釋下:條形圖也叫長條圖(英語:bar chart),亦稱條圖(英語:bar graph)、條狀圖、棒形圖、柱狀圖、條形圖表,是一種以長方形的長度為變量的統(tǒng)計圖表。長條圖用來比較兩個或以上的價值(不同時間或者不同條件),只有一個變量,通常利用于較小的數(shù)據(jù)集分析。長條圖亦可橫向排列,或用多維方式表達。

那么一個普通的條形圖是長什么樣子的呢?

當!當!當!就是下圖的這個樣子:

圖先亮出來啦,接下來研究這個圖是怎么畫的吧,先看一下原數(shù)據(jù)長什么樣子:

實際畫圖的流程和畫折線圖很相近,只是用到的畫圖函數(shù)不一樣,繪制條形圖的函數(shù)plt.bar():

由于這只是最簡單的一個條形圖,實際上條形圖的函數(shù)plt.bar()還有不少可以探索的參數(shù)設置,和對折線圖函數(shù)plt.plot()的探索差不多,有興趣的孩子可以自己去進行探索哦。

按照條形長短進行排序展示的條形圖

當然也可以有其他的設置,比如說上圖中的線條高低參差不齊,這是因為x軸的數(shù)據(jù)是按照學校名稱進行排序的,那么可不可以按照分數(shù)的高低進行排序呢?也就是讓所有的長方形按照從高到矮或者從矮到高的順序進行排列?

當然可以啦!這里需要強調的是,條的高低排列等信息都是來源于原數(shù)據(jù)的,要想讓條形的順序發(fā)生改變,需要對畫圖的來源數(shù)據(jù)進行更改呢!

把原數(shù)據(jù)逆序排序后截取前十名數(shù)據(jù)賦值給data_yuwen,作為新的數(shù)據(jù)源傳入畫圖函數(shù)plt.bar(),畫出來的圖自然就不一樣了。

先看一眼數(shù)據(jù)長什么樣子:

根據(jù)這個數(shù)據(jù)源繪制出的圖形如下,由于用來畫圖的數(shù)據(jù)進行了降序排序操作,所以生成條形圖的條也會進行降序排序展示:

很多時候,我們常見的條形圖還有另一種展現(xiàn)形式,那就是橫向的條形圖,比較火的那種動態(tài)條形圖絕大多數(shù)也都是橫向的條形圖,那么橫向的條形圖如何繪制呢?

理解plt.bar()主要參數(shù)

其實也不難,只要清楚plt.bar()函數(shù)中主要參數(shù)的作用就可以了!條形圖函數(shù)中有五個主要參數(shù),分別是x,height,width,bottom,orientation。其中x控制的是每個條在x軸上位置,height控制的是每個條的長度,width控制的是每個條的寬度,bottom控制的是每個條在y軸方向的起始位置,orientation控制的是條形的方向,是縱向還是橫向,默認是縱向的。

通過一個小例子理解下這幾個參數(shù)的作用:

上邊的幾行代碼輸出的圖形如下:

對比著代碼和實際輸出的條形圖,各個主要參數(shù)的作用是不是一目了然啦?

橫向條形圖

理解了這幾個參數(shù)作用后,縱向的條形圖轉換成橫向的條形圖就沒什么難度了!

需要設置所有條形在x軸的位置都為0,也就全部從最左側開始畫條形;由于是橫向條形圖,所以實際上條的寬度顯示的是數(shù)據(jù)大小,將width參數(shù)設置成原數(shù)據(jù)中的語文成績;bottom控制每個條在y軸方向的起始位置,設置bottom=range(10)設置每個條形在y軸的起始位置各不相同避免有條形重疊;height控制的是每個條在y軸方向上的長度,條形圖橫向設置后,在y軸上的長度失去了衡量數(shù)據(jù)的意義,所以直接設置一個常數(shù)即可;最后設置條形的方向為橫向,即orientation=“horizontal”。

溫馨提示:數(shù)據(jù)和標簽一定要匹配,即plt.bar()重點的數(shù)據(jù)要和plt.yticks()中提取出來的標簽一一對應,一旦不匹配,整個圖展現(xiàn)的結果就是一個錯誤的結果!

上述代碼生成的條形圖如下:

感覺上邊這種生成橫向條形圖的方式有點點繞,和人們的習慣認知有點不大一樣,難道畫一個橫向條形圖就非得轉變自己的習慣認知這么反人類嗎?

當然不是的,實際上有更簡單的方法繪制一個橫向條形圖,之所以沒有一開始就直接用這種簡單的方法,也是為了讓大家體會下條形圖參數(shù)的靈活設置而已,而且如果比較繞的方法都能理解了,簡單的方法理解和運用起來就更沒有難度了?。?/p>

不賣關子了,我們來認識下和plt.bar()函數(shù)類似的plt.barh()函數(shù)。

plt.barh()函數(shù)是專門繪制水平條形圖的函數(shù),主要的參數(shù)有:

y 控制y軸顯示的標簽來源width 控制橫向條形的長度,即用來進行對比的數(shù)據(jù)源height 條形的寬度需要設置的參數(shù)主要就是這三個,比用plt.bar()函數(shù)繪制水平條形圖簡單了很多,具體代碼如下:

效果圖:

和用plt.bar()函數(shù)繪制的橫向條形圖一毛一樣對不對?以后有需求繪制橫向條形圖,盡量用plt.barh()函數(shù)吧,畢竟它是專門繪制這種類型圖的,簡單好用。

然而實際工作中對于條形圖的需求不只是這些,比如例子中只是對各個學校語文成績的展示,有時候需要各個學科的成績同時展現(xiàn)在一幅條形圖中,有時候也需要繪制堆積條形圖對各學科的成績以及總成績進行展示,這些圖又該如何繪制呢?其實只要理解了各個參數(shù)的含義,繪制這些圖也不在話下,至于具體怎么畫,且看下回分解??!

python裝飾器有什么用

先來個形象比方

內褲可以用來遮羞,但是到了冬天它沒法為我們防風御寒,聰明的人們發(fā)明了長褲,有了長褲后寶寶再也不冷了,裝飾器就像我們這里說的長褲,在不影響內褲作用的前提下,給我們的身子提供了保暖的功效。

再回到我們的主題

裝飾器本質上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象。它經(jīng)常用于有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、權限校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無關的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。

先來看一個簡單例子:

def foo():

print('i am foo')

現(xiàn)在有一個新的需求,希望可以記錄下函數(shù)的執(zhí)行日志,于是在代碼中添加日志代碼:

def foo():

print('i am foo')

logging.info("foo is running")

bar()、bar2()也有類似的需求,怎么做?再寫一個logging在bar函數(shù)里?這樣就造成大量雷同的代碼,為了減少重復寫代碼,我們可以這樣做,重新定義一個函數(shù):專門處理日志 ,日志處理完之后再執(zhí)行真正的業(yè)務代碼

def use_logging(func):

logging.warn("%s is running" % func.__name__)

func()def bar():

print('i am bar')use_logging(bar)

邏輯上不難理解,

但是這樣的話,我們每次都要將一個函數(shù)作為參數(shù)傳遞給use_logging函數(shù)。而且這種方式已經(jīng)破壞了原有的代碼邏輯結構,之前執(zhí)行業(yè)務邏輯時,執(zhí)行運行bar(),但是現(xiàn)在不得不改成use_logging(bar)。那么有沒有更好的方式的呢?當然有,答案就是裝飾器。

簡單裝飾器

def use_logging(func):

def wrapper(*args, **kwargs):

logging.warn("%s is running" % func.__name__)

return func(*args, **kwargs)

return wrapperdef bar():

print('i am bar')bar = use_logging(bar)bar()

函數(shù)use_logging就是裝飾器,它把執(zhí)行真正業(yè)務方法的func包裹在函數(shù)里面,看起來像bar被use_logging裝飾了。在這個例子中,函數(shù)進入和退出時

,被稱為一個橫切面(Aspect),這種編程方式被稱為面向切面的編程(Aspect-Oriented Programming)。

@符號是裝飾器的語法糖,在定義函數(shù)的時候使用,避免再一次賦值操作

def use_logging(func):

def wrapper(*args, **kwargs):

logging.warn("%s is running" % func.__name__)

return func(*args)

return wrapper@use_loggingdef foo():

print("i am foo")@use_loggingdef bar():

print("i am bar")bar()

如上所示,這樣我們就可以省去bar =

use_logging(bar)這一句了,直接調用bar()即可得到想要的結果。如果我們有其他的類似函數(shù),我們可以繼續(xù)調用裝飾器來修飾函數(shù),而不用重復修改函數(shù)或者增加新的封裝。這樣,我們就提高了程序的可重復利用性,并增加了程序的可讀性。

裝飾器在Python使用如此方便都要歸因于Python的函數(shù)能像普通的對象一樣能作為參數(shù)傳遞給其他函數(shù),可以被賦值給其他變量,可以作為返回值,可以被定義在另外一個函數(shù)內。

帶參數(shù)的裝飾器

裝飾器還有更大的靈活性,例如帶參數(shù)的裝飾器:在上面的裝飾器調用中,比如@use_logging,該裝飾器唯一的參數(shù)就是執(zhí)行業(yè)務的函數(shù)。裝飾器的語法允許我們在調用時,提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。

def use_logging(level):

def decorator(func):

def wrapper(*args, **kwargs):

if level == "warn":

logging.warn("%s is running" % func.__name__)

return func(*args)

return wrapper

return decorator@use_logging(level="warn")def foo(name='foo'):

print("i am %s" % name)foo()

上面的use_logging是允許帶參數(shù)的裝飾器。它實際上是對原有裝飾器的一個函數(shù)封裝,并返回一個裝飾器。我們可以將它理解為一個含有參數(shù)的閉包。當我

們使用@use_logging(level="warn")調用的時候,Python能夠發(fā)現(xiàn)這一層的封裝,并把參數(shù)傳遞到裝飾器的環(huán)境中。

類裝飾器

再來看看類裝飾器,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內聚、封裝性等優(yōu)點。使用類裝飾器還可以依靠類內部的\_\_call\_\_方法,當使用 @ 形式將裝飾器附加到函數(shù)上時,就會調用此方法。

class Foo(object):

def __init__(self, func):

self._func = func

def __call__(self):

print ('class decorator runing')

self._func()

print ('class decorator ending')

@Foo

def bar():

print ('bar')

bar()

functools.wraps

使用裝飾器極大地復用了代碼,但是他有一個缺點就是原函數(shù)的元信息不見了,比如函數(shù)的docstring、__name__、參數(shù)列表,先看例子:

裝飾器

def logged(func):

def with_logging(*args, **kwargs):

print func.__name__ + " was called"

return func(*args, **kwargs)

return with_logging

函數(shù)

@loggeddef f(x):

"""does some math"""

return x + x * x

該函數(shù)完成等價于:

def f(x):

"""does some math"""

return x + x * xf = logged(f)

不難發(fā)現(xiàn),函數(shù)f被with_logging取代了,當然它的docstring,__name__就是變成了with_logging函數(shù)的信息了。

print f.__name__ ? ?# prints 'with_logging'print f.__doc__ ? ? # prints None

這個問題就比較嚴重的,好在我們有functools.wraps,wraps本身也是一個裝飾器,它能把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,這使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息了。

from functools import wrapsdef logged(func):

@wraps(func)

def with_logging(*args, **kwargs):

print func.__name__ + " was called"

return func(*args, **kwargs)

return with_logging@loggeddef f(x):

"""does some math"""

return x + x * xprint f.__name__ ?# prints 'f'print f.__doc__ ? # prints 'does some math'

內置裝飾器

@staticmathod、@classmethod、@property

裝飾器的順序

@a@b@cdef f ():

等效于

f = a(b(c(f)))

什么是Python裝飾器

裝飾器(decorator)是Python中的高級語法。裝飾的意思就是動態(tài)擴展被裝飾對象的功能。裝飾器可以用于裝飾函數(shù)、方法和類。

一 嵌套函數(shù)

# 定義一個外層函數(shù)def foo(): # 定義了一個內部函數(shù) def bar(): print("hello world")

函數(shù)bar是一個定義在foo函數(shù)內部的函數(shù)。

Python中的函數(shù)是支持嵌套的,也就是可以在一個函數(shù)內部再定義一個函數(shù)。

然后,我們還知道函數(shù)是可以當作變量的,于是我們就可以在foo函數(shù)中把定義的這個bar函數(shù)返回。就像下面這樣:

# 定義一個外層函數(shù)def foo(): # 定義了一個內層函數(shù) def bar(): print("hello world") return

barfunc = foo()func() # func -- bar,這里執(zhí)行func其實就相當于執(zhí)行了在foo函數(shù)內部定義的bar函數(shù)

二 閉包形態(tài)1

# 閉包形態(tài)1def foo(): name = "Andy" # 外部函數(shù)的局部變量 # 定義了一個內部函數(shù) def bar():

print(name) # 雖然bar函數(shù)中沒有定義name變量,但是它可以訪問外部函數(shù)的局部變量name return barfunc =

foo()func() # func -- bar -- 除了是一個函數(shù),還包含一個值(它外層函數(shù)的局部變量)的引用

三 閉包形態(tài)2

# 閉包形態(tài)2def foo(name): # 給一個函數(shù)傳參也相當于給函數(shù)定義了一個局部變量 # 定義了一個內部函數(shù) def bar():

print(name) # 內部函數(shù)同樣可以獲取到傳到外部函數(shù)的變量(參數(shù)) return barfunc = foo("Andy") #

把“Andy”當成參數(shù)傳入foo函數(shù) -- 其內部定義的bar函數(shù)也能拿到這個“Andy”func() # func -- bar --

除了是一個函數(shù),還包含一個值(它外層函數(shù)的參數(shù))的引用

四 裝飾器形態(tài)1

# 還是定義一個外層函數(shù)def foo(name): # 我接收的參數(shù)是一個函數(shù)名 # 定義了一個內部函數(shù) def bar():

print("這是新功能。。。") # 新功能 name() # 函數(shù)名加()就相當于執(zhí)行-- 我傳進來原函數(shù)的函數(shù)名,這里就相當于執(zhí)行了原函數(shù)

return bar# 定義一個被裝飾的函數(shù)def f1(): print("hello world.") # 用foo函數(shù)裝飾f1函數(shù)f1 =

foo(f1)# 不改變f1的調用方式f1() # -- 此時函數(shù)已經(jīng)擴展了新功能

五 裝飾器形態(tài)2

# 還是定義一個外層函數(shù)def foo(name): # 接收的參數(shù)是一個函數(shù)名 # 定義了一個內部函數(shù) def bar():

print("這是新功能。。。") # 新功能 name() # 函數(shù)名加()就相當于執(zhí)行-- 傳進來原函數(shù)的函數(shù)名,這里就相當于執(zhí)行了原函數(shù)

return bar# 定義一個被裝飾的函數(shù)# 用foo函數(shù)裝飾f1函數(shù)@foo # 使用f1 =

foo(f1)語法裝飾的話稍顯啰嗦,Python就提供了@語法,讓裝飾過程更簡便def f1(): print("hello world.") #

不改變f1的調用方式f1() # -- 此時函數(shù)已經(jīng)擴展了新功能。

網(wǎng)站標題:bar函數(shù)在python python bacon函數(shù)
本文鏈接:http://muchs.cn/article16/doedegg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站維護企業(yè)網(wǎng)站制作、網(wǎng)站排名、定制網(wǎng)站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站制作