python的bar函数 python bar函数参数

什么是Python装饰器

装饰器(decorator)是Python中的高级语法。装饰的意思就是动态扩展被装饰对象的功能。装饰器可以用于装饰函数、方法和类。

清江浦网站建设公司成都创新互联公司,清江浦网站设计制作,有大型网站制作公司丰富经验。已为清江浦千余家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的清江浦做网站的公司定做!

一 嵌套函数

# 定义一个外层函数def foo(): # 定义了一个内部函数 def bar(): print("hello world")

函数bar是一个定义在foo函数内部的函数。

Python中的函数是支持嵌套的,也就是可以在一个函数内部再定义一个函数。

然后,我们还知道函数是可以当作变量的,于是我们就可以在foo函数中把定义的这个bar函数返回。就像下面这样:

# 定义一个外层函数def foo(): # 定义了一个内层函数 def bar(): print("hello world") return

barfunc = foo()func() # func -- bar,这里执行func其实就相当于执行了在foo函数内部定义的bar函数

二 闭包形态1

# 闭包形态1def foo(): name = "Andy" # 外部函数的局部变量 # 定义了一个内部函数 def bar():

print(name) # 虽然bar函数中没有定义name变量,但是它可以访问外部函数的局部变量name return barfunc =

foo()func() # func -- bar -- 除了是一个函数,还包含一个值(它外层函数的局部变量)的引用

三 闭包形态2

# 闭包形态2def foo(name): # 给一个函数传参也相当于给函数定义了一个局部变量 # 定义了一个内部函数 def bar():

print(name) # 内部函数同样可以获取到传到外部函数的变量(参数) return barfunc = foo("Andy") #

把“Andy”当成参数传入foo函数 -- 其内部定义的bar函数也能拿到这个“Andy”func() # func -- bar --

除了是一个函数,还包含一个值(它外层函数的参数)的引用

四 装饰器形态1

# 还是定义一个外层函数def foo(name): # 我接收的参数是一个函数名 # 定义了一个内部函数 def bar():

print("这是新功能。。。") # 新功能 name() # 函数名加()就相当于执行-- 我传进来原函数的函数名,这里就相当于执行了原函数

return bar# 定义一个被装饰的函数def f1(): print("hello world.") # 用foo函数装饰f1函数f1 =

foo(f1)# 不改变f1的调用方式f1() # -- 此时函数已经扩展了新功能

五 装饰器形态2

# 还是定义一个外层函数def foo(name): # 接收的参数是一个函数名 # 定义了一个内部函数 def bar():

print("这是新功能。。。") # 新功能 name() # 函数名加()就相当于执行-- 传进来原函数的函数名,这里就相当于执行了原函数

return bar# 定义一个被装饰的函数# 用foo函数装饰f1函数@foo # 使用f1 =

foo(f1)语法装饰的话稍显啰嗦,Python就提供了@语法,让装饰过程更简便def f1(): print("hello world.") #

不改变f1的调用方式f1() # -- 此时函数已经扩展了新功能。

Python画截断图

近日,帮女朋友画截断图时,遇到了一些问题,网上很多资料都是互相粘贴,缺少能够解决问题的帖子,经过查看官方api最终解决了问题。

在此记录一下,也希望能够帮助其他有需要的人。

这个是最方便的一种解决办法,官网地址为 Pypi ,官网的教程比较简洁

即可以得到可用的图:

看着效果好像还不错,但是如果要画柱状图,则如何解决呢?

仿照官方的程序,我们可以写出来以下的程序

得到以下图:

这个图我们可以发现存在一定的问题,它的横坐标不对了,我们的“1”显示不出来了!!!

那怎么解决呢?可以知道我们在bar()函数中使用 tick_label=name_list 是不可行的了,那我们试下 plt.xticks 函数看看

首先删除bar函数中的 tick_label=name_list ,然后在 plt.show() 前面加上 plt.xticksx,name_list) ,得到下图结果

我们通过对比这两个图,可以发现一个很trick的解决办法!

第一个图,没有自带的刻度,但是少了一个我们想要的刻度;第二个图,存在自带的刻度,但是我们想要的刻度全都有!

我们能不能考虑结合下呢?

我们尝试在bar中加上一个空的刻度,然后再显示出来

因此,这个方案在一些简单的图上还可以应用,复杂的场景就难以解决了!

matplotlib具有很强的自定义能力,我们可以考虑通过画两个子图,然后拼接成一个,来生成我们的截断图!

看着结果似乎还不错,坐标的刻度也显示正常啦

只是,由于我们使用subplot画出来的两个图默认大小是一样的,而前文使用brokenaxes画出来的截断上下的长度并不一样。我们这样画出来的图不好看,还需要调整下!

考虑到matplotlib可以使用grid来画图,我们尝试用它来调整下上下两图的比例!

画出来的结果好看多了!

重新画一下图

问题解决了!

我们得到了一个完整的图!

参考文献:

如何用python绘制简单条形图?

如何用python绘制简单条形图呢?这里离不开matplotlib的使用。

条形图是数据可视化图形中很基础也很常用的一种图,简单解释下:条形图也叫长条图(英语:bar chart),亦称条图(英语:bar graph)、条状图、棒形图、柱状图、条形图表,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。

那么一个普通的条形图是长什么样子的呢?

当!当!当!就是下图的这个样子:

图先亮出来啦,接下来研究这个图是怎么画的吧,先看一下原数据长什么样子:

实际画图的流程和画折线图很相近,只是用到的画图函数不一样,绘制条形图的函数plt.bar():

由于这只是最简单的一个条形图,实际上条形图的函数plt.bar()还有不少可以探索的参数设置,和对折线图函数plt.plot()的探索差不多,有兴趣的孩子可以自己去进行探索哦。

按照条形长短进行排序展示的条形图

当然也可以有其他的设置,比如说上图中的线条高低参差不齐,这是因为x轴的数据是按照学校名称进行排序的,那么可不可以按照分数的高低进行排序呢?也就是让所有的长方形按照从高到矮或者从矮到高的顺序进行排列?

当然可以啦!这里需要强调的是,条的高低排列等信息都是来源于原数据的,要想让条形的顺序发生改变,需要对画图的来源数据进行更改呢!

把原数据逆序排序后截取前十名数据赋值给data_yuwen,作为新的数据源传入画图函数plt.bar(),画出来的图自然就不一样了。

先看一眼数据长什么样子:

根据这个数据源绘制出的图形如下,由于用来画图的数据进行了降序排序操作,所以生成条形图的条也会进行降序排序展示:

很多时候,我们常见的条形图还有另一种展现形式,那就是横向的条形图,比较火的那种动态条形图绝大多数也都是横向的条形图,那么横向的条形图如何绘制呢?

理解plt.bar()主要参数

其实也不难,只要清楚plt.bar()函数中主要参数的作用就可以了!条形图函数中有五个主要参数,分别是x,height,width,bottom,orientation。其中x控制的是每个条在x轴上位置,height控制的是每个条的长度,width控制的是每个条的宽度,bottom控制的是每个条在y轴方向的起始位置,orientation控制的是条形的方向,是纵向还是横向,默认是纵向的。

通过一个小例子理解下这几个参数的作用:

上边的几行代码输出的图形如下:

对比着代码和实际输出的条形图,各个主要参数的作用是不是一目了然啦?

横向条形图

理解了这几个参数作用后,纵向的条形图转换成横向的条形图就没什么难度了!

需要设置所有条形在x轴的位置都为0,也就全部从最左侧开始画条形;由于是横向条形图,所以实际上条的宽度显示的是数据大小,将width参数设置成原数据中的语文成绩;bottom控制每个条在y轴方向的起始位置,设置bottom=range(10)设置每个条形在y轴的起始位置各不相同避免有条形重叠;height控制的是每个条在y轴方向上的长度,条形图横向设置后,在y轴上的长度失去了衡量数据的意义,所以直接设置一个常数即可;最后设置条形的方向为横向,即orientation=“horizontal”。

温馨提示:数据和标签一定要匹配,即plt.bar()重点的数据要和plt.yticks()中提取出来的标签一一对应,一旦不匹配,整个图展现的结果就是一个错误的结果!

上述代码生成的条形图如下:

感觉上边这种生成横向条形图的方式有点点绕,和人们的习惯认知有点不大一样,难道画一个横向条形图就非得转变自己的习惯认知这么反人类吗?

当然不是的,实际上有更简单的方法绘制一个横向条形图,之所以没有一开始就直接用这种简单的方法,也是为了让大家体会下条形图参数的灵活设置而已,而且如果比较绕的方法都能理解了,简单的方法理解和运用起来就更没有难度了啊!

不卖关子了,我们来认识下和plt.bar()函数类似的plt.barh()函数。

plt.barh()函数是专门绘制水平条形图的函数,主要的参数有:

y 控制y轴显示的标签来源width 控制横向条形的长度,即用来进行对比的数据源height 条形的宽度需要设置的参数主要就是这三个,比用plt.bar()函数绘制水平条形图简单了很多,具体代码如下:

效果图:

和用plt.bar()函数绘制的横向条形图一毛一样对不对?以后有需求绘制横向条形图,尽量用plt.barh()函数吧,毕竟它是专门绘制这种类型图的,简单好用。

然而实际工作中对于条形图的需求不只是这些,比如例子中只是对各个学校语文成绩的展示,有时候需要各个学科的成绩同时展现在一幅条形图中,有时候也需要绘制堆积条形图对各学科的成绩以及总成绩进行展示,这些图又该如何绘制呢?其实只要理解了各个参数的含义,绘制这些图也不在话下,至于具体怎么画,且看下回分解啊!

如何理解 Python

先来看一个简单例子:

def foo():

print('i am foo')

现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:

def foo():

print('i am foo')

logging.info("foo is running")

bar()、bar2()也有类似的需求,怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志 ,日志处理完之后再执行真正的业务代码

def use_logging(func):

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

func()

def bar():

print('i am bar')

use_logging(bar)

逻辑上不难理解, 但是这样的话,我们每次都要将一个函数作为参数传递给use_logging函数。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行bar(),但是现在不得不改成use_logging(bar)。那么有没有更好的方式的呢?当然有,答案就是装饰器。

简单装饰器

def use_logging(func):

def wrapper(*args, **kwargs):

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

return func(*args, **kwargs)

return wrapper

def bar():

print('i am bar')

bar = use_logging(bar)

bar()

函数use_logging就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像bar被use_logging装饰了。在这个例子中,函数进入和退出时 ,被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。

@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作

def use_logging(func):

def wrapper(*args, **kwargs):

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

return func(*args)

return wrapper

@use_logging

def foo():

print("i am foo")

@use_logging

def bar():

print("i am bar")

bar()

如上所示,这样我们就可以省去bar = use_logging(bar)这一句了,直接调用bar()即可得到想要的结果。如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。

装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。

带参数的装饰器

装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如@use_logging,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如@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是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有参数的闭包。当我 们使用@use_logging(level="warn")调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。

类装饰器

再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的\_\_call\_\_方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。

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

使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看例子:

装饰器

def logged(func):

def with_logging(*args, **kwargs):

print func.__name__ + " was called"

return func(*args, **kwargs)

return with_logging

函数

@logged

def f(x):

"""does some math"""

return x + x * x

该函数完成等价于:

def f(x):

"""does some math"""

return x + x * x

f = logged(f)

不难发现,函数f被with_logging取代了,当然它的docstring,__name__就是变成了with_logging函数的信息了。

print f.__name__ # prints 'with_logging'

print f.__doc__ # prints None

这个问题就比较严重的,好在我们有functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,这使得装饰器函数也有和原函数一样的元信息了。

from functools import wraps

def logged(func):

@wraps(func)

def with_logging(*args, **kwargs):

print func.__name__ + " was called"

return func(*args, **kwargs)

return with_logging

@logged

def f(x):

"""does some math"""

return x + x * x

print f.__name__ # prints 'f'

print f.__doc__ # prints 'does some math'

内置装饰器

@staticmathod、@classmethod、@property

装饰器的顺序

@a

@b

@c

def f ():

等效于

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

python matplotlib数据作图

一、使用numpy生成长度为100的等差序列作为自变量,命名为x,并使用三角函数SiNx和cosx**2生成两个因变量,命名为y和Z。

二、设置画布的大小、颜色、宽度、类型和标签。

三、通过plt.figure(figsize=(10,6))的画布。图((10,6))。

四、尝试plt.plot(x,y,color='red',linewidth=2,label='$\sinx$')和plt.plot(x,z,'b--',label='$\cosx^2$')。

五、分通过plt.xlabel('T')和plt.ylabel('V')设置X和Y轴的轴标签;并通过plt.title('V changes by T')为图形设置标题。

六、Y[:,0]=Y[:,0]*888表示修改第一个数据并将其展开888次;之后,使用上述设置时保持不变,发现另一行几乎是一条直线。

文章题目:python的bar函数 python bar函数参数
转载源于:https://www.cdcxhl.com/article16/dooeggg.html

成都网站建设公司_创新互联,为您提供电子商务网站策划虚拟主机外贸网站建设品牌网站制作网站设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发