Python 科学计算学习三:matplotlib-绘制精美的图表(2)

4 Artist对象

Artist则处理所有的高层结构,例如处理图表、文字和曲线等的绘制和布局。
直接使用Artists创建图表的标准流程如下:

  1. 创建Figure对象
  2. 用Figure对象创建一个或者多个Axes或者Subplot对象
  3. 调用Axies等对象的方法创建各种简单类型的Artists

下面首先调用pyplot.figure辅助函数创建Figure对象,然后调用Figure对象的add_axes方法在其中创 建一个Axes对象,add_axes的参数是一个形如[left, bottom, width, height]的列表,这些数值分别指 定所创建的Axes对象相对于fig的位置和大小,取值范围都在0到1之间:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])

然后调用ax的plot方法绘图,创建一条曲线,并且返回此曲线对象(Line2D):

>>>line, = ax.plot([1,2,3],[1,2,1]
>>>ax.lines #包含ax的所有曲线的列表
[<matplotlib.lines.Line2D at 0x2292bd89d68>]
>>>line
<matplotlib.lines.Line2D at 0x2292bd89d68>

Axes对象还包括许多其它的Artists对象,例如我们可以通过调用set_xlabel设置其X轴上的标题:

ax.set_xlabel("time")

4.1 Artist的属性

Artists分为简单类型容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整 体,例如Axis、 Axes、Figure等。
图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性,下面的例子将图表的背景颜 色设置为红色:

fig = plt.figure() 
fig.show() 
fig.patch.set_color(r") 
fig.canvas.draw()

patch的color属性通过set_color函数进行设置,属性修改之后并不会立即反映到图表的显示上,还需 要调用fig.canvas.draw()函数才能够更新显示。
下面是Artist对象都具有的一些属性:

  • alpha : 透明度,值在0到1之间,0为完全透明,1为完全不透明
  • animated : 布尔值,在绘制动画效果时使用
  • axes : 此Artist对象所在的Axes对象,可能为None
  • clip_box : 对象的裁剪框
  • clip_on : 是否裁剪
  • clip_path : 裁剪的路径
  • contains : 判断指定点是否在对象上的函数
  • figure : 所在的Figure对象,可能为None
  • label : 文本标签
  • picker : 控制Artist对象选取
  • transform : 控制偏移旋转
  • visible : 是否可见
  • zorder : 控制绘图顺序

4.2 Figure容器

4.1开头已经介绍了什么是容器,最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴 (子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象, 注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。

>>>fig = plt.figure() 
>>>ax1 = fig.add_subplot(211) 
>>>ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3])
>>>ax1
<matplotlib.axes._subplots.AxesSubplot at 0x2292bd96358>
>>>ax2
<matplotlib.axes._axes.Axes at 0x2292be054a8>
>>>fig.axes
[<matplotlib.axes._subplots.AxesSubplot at 0x2292bd96358>,
 <matplotlib.axes._axes.Axes at 0x2292be054a8>]

下面的程序创建并添加两条直线到fig中:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
fig = plt.figure()
line1 = Line2D([0,1],[0,1], transform=fig.transFigure, figure=fig, color="r")
line2 = Line2D([0,1],[1,0], transform=fig.transFigure, figure=fig, color="g")
fig.lines.extend([line1, line2])
fig.show()

这里写图片描述
注意:为了让所创建的Line2D对象使用fig的坐标,我们将fig.TransFigure赋给Line2D对象的transform 属性;为了让Line2D对象知道它是在fig对象中,我们还设置其figure属性为fig;最后还需要将创建的 两个Line2D对象添加到fig.lines属性中去。
Figure对象有如下属性包含其它的Artist对象:

  • axes : Axes对象列表
  • patch : 作为背景的Rectangle对象
  • images : FigureImage对象列表,用来显示图片
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : patch对象列表
  • texts : Text对象列表,用来显示文字

4.3 Axes容器

Axes容器包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。下面是绘制散列图示例。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111) 
t = ax.scatter(np.random.rand(20), np.random.rand(20))
t # 返回值为CircleCollection对象 
ax.collections # 返回的对象已经添加进了collections列表中 
fig.show() 
t.get_sizes() # 获得Collection的点数

这里写图片描述
Axes包含各种Artist对象的属性:

  • artists : Artist对象列表
  • patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
  • collections : Collection对象列表
  • images : AxesImage对象列表
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : Patch对象列表
  • texts : Text对象列表
  • xaxis : XAxis对象
  • yaxis : YAxis对象

4.4 Axis容器

Axis容器包括坐标轴上的刻度线、刻度文本、坐标网格以及坐标轴标题等内容。刻度包括主刻度副刻度,分别通过Axis.get_major_ticks和Axis.get_minor_ticks方法获得。每个刻度线都是一个XTick 或者YTick对象,它包括实际的刻度线和刻度文本。为了方便访问刻度线和文本,Axis对象提供了 get_ticklabels和get_ticklines方法分别直接获得刻度线和刻度文本。

>>> pl.plot([1,2,3],[4,5,6]) 
[<matplotlib.lines.Line2D object at 0x0AD3B670>] 
>>> pl.show() 
>>> axis = pl.gca().xaxi

>>> axis.get_ticklocs() # 获得刻度的位置列表 array([ 1. , 1.5, 2. , 2.5, 3. ]

>>> axis.get_ticklabels() # 获得刻度标签列表 
<a list of 5 Text major ticklabel objects> 
>>> [x.get_text() for x in axis.get_ticklabels()] # 获得刻度的文本字符串 
[u'1.0', u'1.5', u'2.0', u'2.5', u'3.0']

>>> axis.get_ticklines() # 获得主刻度线列表,图的上下刻度线共10条 
<a list of 10 Line2D ticklines objects>

>>> axis.get_ticklines(minor=True) # 获得副刻度线列表 
<a list of 0 Line2D ticklines objects>

下面的程序设置X轴的主刻度为pi/4,副刻度为pi/20,并且主刻度上的 文本以pi为单位:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as pl
from matplotlib.ticker import MultipleLocator, FuncFormatter 
x = np.arange(0, 4*np.pi, 0.01) 
y = np.sin(x) 
pl.figure(figsize=(8,4)) 
pl.plot(x, y) 
ax = pl.gca()
def pi_formatter(x, pos): 
    #比较罗嗦地将数值转换为以pi/4为单位的刻度文本 
    m = np.round(x / (np.pi/4)) 
    n=4
    if m%2==0: m, n = m/2, n/2 
    if m%2==0: m, n = m/2, n/2 
    if m == 0: 
        return "0" 
    if m == 1 and n == 1: 
        return "$\pi$" 
    if n == 1: 
        return r"$%d \pi$" % m 
    if m == 1: 
        return r"$\frac{\pi}{%d}$" % n 
    return r"$\frac{%d \pi}{%d}$" % (m,n)
# 设置两个坐标轴的范围 
pl.ylim(-1.5,1.5) 
pl.xlim(0, np.max(x))
# 设置图的底边距 
pl.subplots_adjust(bottom = 0.15)
pl.grid() #开启网格
# 主刻度为pi/4 ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )
# 主刻度文本用pi_formatter函数计算 
ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) )
# 副刻度为pi/20
ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )
# 设置刻度文本的大小 
for tick in ax.xaxis.get_major_ticks(): 
    tick.label1.set_fontsize(16)
pl.show()

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Yangchenju/article/details/81322598
今日推荐