matplotlib之pyplot模块——获取/设置对象属性值(setp()、getp/get())

当前有效matplotlib版本为:3.4.1

概述

pyplot模块提供了获取/设置对象属性值的接口。功能类似于Python内置函数getattrsetattr。从源码上来看,get()getp()的别名,两者是等价的。setp()getp()的底层实现是基于Python内置函数getattrsetattr

getp()函数:获取对象属性

getp()函数的签名为matplotlib.pyplot.getp(obj, *args, **kwargs)
常用参数为:

  • obj :需要查询属性的对象。类型为 Artist对象,即matplotlib所有可见对象。必备参数。
  • property:需要查询的属性。类型为字符串或None, 默认值为 None
    • 当值为None时,返回对象的所有属性。
    • 当值为某属性名时,则会返回obj.get_属性名()的值。

返回值为查询对象的某个属性或为None,此时打印输出全部属性。

案例:演示getp()函数

import matplotlib.pyplot as plt

# 获得Line2D对象line
line,=plt.plot([2,1])
# 获取line的color属性值
# 通过Python内置函数getattr和_color属性获取
c1=getattr(line,"_color")
# 通过Python内置函数getattr和get_color方法获取
c2=getattr(line,"get_color")()
# 通过getp函数获取
c3=plt.getp(line,"color")
print(c1,c2,c3)
# 输出line对象的所有属性
plt.getp(line)



plt.show()

控制台输出为:

# color属性值
#1f77b4 #1f77b4 #1f77b4
# line对象所有属性列表
    agg_filter = None
    alpha = None
    animated = False
    antialiased or aa = True
    children = []
    clip_box = TransformedBbox(     Bbox(x0=0.0, y0=0.0, x1=1.0, ...
    clip_on = True
    clip_path = None
    color or c = #1f77b4
......

matplotlib之pyplot模块——获取/设置对象属性值(setp()、getp/get())_第1张图片

setp()函数:设置对象属性或属性的取值要求

setp()函数的签名为matplotlib.pyplot.setp(obj, *args, **kwargs)
常用参数为:

  • obj :需要设置属性的对象或对象列表。类型为 Artist对象或 Artist对象列表,即matplotlib所有可见对象。必备参数。
  • file :当查询属性取值要求时输出文件的位置。类文件对象。默认值为 sys.stdout
  • *args**kwargs:需要设置的属性值。

setp()函数的调用方式有很多种:

  • 设置一个对象的一个属性。

    line, = plot([1, 2, 3])
    setp(line, linestyle='--')
    
  • 设置多个对象的一个属性。

    lines = plot([1, 2, 3],[1, 2, 3],[4, 5, 6],[4, 5, 6])
    setp(lines, linestyle='--')
    
  • 设置一个对象的多个个属性。
    setp(line, linewidth=2, color='r')

  • 输出该属性的取值要求。
    setp(line, 'linestyle')
    输出为: linestyle: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}

  • 输出所有可设置的属性及其取值要求。
    setp(line)
    输出为:
    agg_filter: a filter function, ...

  • setp 还支持 MATLAB 式的键值对。
    setp(lines, 'linewidth', 2, 'color', 'r')

案例:演示 setp()函数

import matplotlib.pyplot as plt

line,=plt.plot([2,1])
# 利用键值对设置属性
plt.setp(line,color='b')
# matlab式键值对
plt.setp(line,"color","g")
# 利用内置哈数setattr设置属性值
setattr(line,"_color",'red')
# 将color属性取值要求输出到标准输出
plt.setp(line,"color")
# 将line对象所有属性取值要求输出到标准输出
plt.setp(line)
# 设置多个对象的属性
lines = plt.plot([1, 2, 3],[1, 2, 3],[4, 5, 6],[4, 5, 6])
plt.setp(lines, linestyle='--')
# 将获取到的color属性取值要求输出到setp.log中
with open("setp.log","a+") as f:
    plt.setp(line,"color",file =f)
plt.show()

控制台输出为:

# color属性取值要求
color: color
# 所有属性取值要求
agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array
alpha: scalar or None
animated: bool
antialiased or aa: bool
clip_box: `.Bbox`
clip_on: bool
clip_path: Patch or (Path, Transform) or None
color or c: color
contains: unknown
dash_capstyle: `.CapStyle` or {
     'butt', 'projecting', 'round'}
dash_joinstyle: `.JoinStyle` or {
     'miter', 'round', 'bevel'}
......

matplotlib之pyplot模块——获取/设置对象属性值(setp()、getp/get())_第2张图片

总结

matplotlib当中,所有可见对象都继承自Artist类,因此,这些对象被称为Artist。

pyplot模块的setp()getp/get()等函数底层其实都是调用的Artist类的相关方法。

属性操作中属性名称可能是一个令人疑惑的地方。
matplotlib当中,实际的属性值存储在_开头的属性中,然后对外提供setter 、getter方法调用。

例如Line2D对象,其颜色属性为_color,对外接口为get_color()set_color()。通过内置函数dir()即可列出对象的属性。

源码

matplotlib.pyplot模块

def getp(obj, *args, **kwargs):
    return matplotlib.artist.getp(obj, *args, **kwargs)

def get(obj, *args, **kwargs):
    return matplotlib.artist.get(obj, *args, **kwargs)

def setp(obj, *args, **kwargs):
    return matplotlib.artist.setp(obj, *args, **kwargs)
    

matplotlib.artist模块

def getp(obj, property=None):
    if property is None:
        insp = ArtistInspector(obj)
        ret = insp.pprint_getters()
        print('\n'.join(ret))
        return
    return getattr(obj, 'get_' + property)()


# alias
get = getp

def setp(obj, *args, file=None, **kwargs):
    if isinstance(obj, Artist):
        objs = [obj]
    else:
        objs = list(cbook.flatten(obj))

    if not objs:
        return

    insp = ArtistInspector(objs[0])

    if not kwargs and len(args) < 2:
        if args:
            print(insp.pprint_setters(prop=args[0]), file=file)
        else:
            print('\n'.join(insp.pprint_setters()), file=file)
        return

    if len(args) % 2:
        raise ValueError('The set args must be string, value pairs')

    # put args into ordereddict to maintain order
    funcvals = OrderedDict((k, v) for k, v in zip(args[::2], args[1::2]))
    ret = [o.update(funcvals) for o in objs] + [o.set(**kwargs) for o in objs]
    return list(cbook.flatten(ret))

你可能感兴趣的:(Matplotlib,matplotlib,pyplot,artist,属性,设置)