关于matplotlib

  • 采用面向对象技术来实现,组成图标的各个元素都是对象。

快速绘图

  • matplotlib的pyplot模块:绘图模块
  • matplotlib——pyplot和pylab区别

对Pyplot的解说:“方便快速绘图matplotlib通过pyplot模块提供了一套和MATLAB类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。”

对pylab的解说:“matplotlib还提供了一个名为pylab的模块,其中包括了许多NumPy和pyplot模块中常用的函数,方便用户快速进行计算和绘图,十分适合在IPython交互式环境中使用。”

(pylab combines pyplot with numpy into a single namespace. This is convenient for interactive work, but for programming it is recommended that the namespaces be kept separate)

  • 以面向对象的方式绘图

plt.gcf():得到当前的图表(Figure对象)

plt.gca():得到当前的子图(Axes对象)

  • 配置属性

根据返回的对象获取或者设置对应的属性。

getp()和setp(),get_*()和set_*()

面向对象的绘图库。

  • 绘制多个子图()
import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)
plt.figure(2)

ax1 = plt.subplot(211)
ax2 = plt.subplot(212)

x = np.linspace(0,3,100)
for i in xrange(5):
    #切换图表
    plt.figure(1)
    plt.plot(x,np.sin(i*x/3))
    #切换子图
    plt.sca(ax1)
    plt.plot(x,np.sin(i*x))
    plt.sca(ax2)
    plt.plot(x,np.cos(i*x))
    
plt.show()
  • 配置文件

修改默认样式。(matplotlibrc文件)

将文件中的默认配置保持到rcParams变量,之后使用rcParams变量中的配置进行绘图。可以直接修改rcParams变量。

  • 图表中显示中文

1.程序中直接指定字体

2.程序开头修改配置字典rcParams

3.修改配置文件

Artist对象

  • Artist对象的属性

Artist对象氛围简单对象和容器对象

  • Figure容器(最上层)

AxesSubplot 是Axes的派生类

  • Axes对象

  • Axis对象
  • Axis对象的关系

坐标变换和注释

  • 了解matplotlib中坐标转换的原理
  • 4种坐标系

数据坐标系

如:Axes对象的transData属性

子图坐标系

如:Axes对象的transAxes属性

图表坐标系

如:Figure对象的transFigure属性

窗口坐标系

上述坐标变换对象的transform()方法,可以将此坐标系下的坐标转换为窗口坐标系中的坐标。

  • 坐标变换的步骤
  • 图表坐标的变换对象transFigure

仿射变换

>>fig.transFigure
>>
BboxTransformTo( #将矩形区域(0,0)-(1,1)变换为(0,0)-(480,320)的坐标变换
    TransformedBbox(
        Bbox([[0.0, 0.0], 
            [6.0, 4.0]]), 
        Affine2D(array([[ 80.,   0.,   0.],
                        [  0.,  80.,   0.],
                        [  0.,   0.,   1.]]))
    )
)
  • 子图坐标变换对象
>>ax.transAxes
>>
BboxTransformTo(#将矩形区域(0,0)-(1,1)变换为(0,0)-(480,320)的坐标变换
    TransformedBbox(
        Bbox([[0.125, 0.125], 
              [0.9, 0.88]]), 
        BboxTransformTo(
        #将矩形区域(0.125,0.125)-(0.9,0.88)变换为...的坐标变换
            TransformedBbox(
                Bbox([[0.0, 0.0], 
                      [6.0, 4.0]]), 
                Affine2D(array([[ 72.,   0.,   0.],
                               [  0.,  72.,   0.],
                               [  0.,   0.,   1.]])
                )
            )
        )
    )
)
  • 数据坐标系ax.transData

由ax.transScal(尺度变换,对数坐标系,线性坐标系等),ax.transLimits,ax.transAxes组成。

>>ax.transLimits
>>
BboxTransformFrom(#将矩形区域变换为(0,0)-(1,1)
    TransformedBbox(
        Bbox([[-0.105848707599, -0.223782293619], 
              [3.1478975575, 6.29637058541]]),    
        TransformWrapper(
            BlendedAffine2D(IdentityTransform(),
                            IdentityTransform())
        )
    )
)
  • 制作阴影效果

连续绘制多条透明度和偏移量逐渐变化的的曲线。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms

x = np.arange(0,2,0.01)
y = np.sin(2*np.pi*x)

N = 7
for i in xrange(N,0,-1):
    offset = transforms.ScaledTranslation(i,-i,transforms.IdentityTransform())
    shadow_trans = plt.gca().transData+offset
    plt.plot(x,y,linewidth = 4,
            color = "black",
            transform = shadow_trans,
            alpha = (N-i)/2.0/N)

plt.plot(x,y,linewidth = 4,color="black")
plt.ylim(-1.5,1.5)
plt.show()
  • 添加注释

在数据坐标系,子图坐标系和图标坐标系添加文字

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import fontManager

x = np.linspace(-1,1,10)
y = x**2

fig = plt.figure(figsize = (8,4))
ax = plt.subplot(111)

plt.rcParams['font.family'] = "SimHei"
plt.plot(x,y)

for i,(_x,_y) in enumerate(zip(x,y)):#数据坐标系
    plt.text(_x,_y,str(i),color = 'red',fontsize = 1+10)

plt.text(0.5,0.8,u"子图坐标系文字",color = 'blue',ha = 'center',
        transform=ax.transAxes)#子图坐标系

plt.figtext(0.1,0.9,u'图标坐标系文字',color = 'green')#图表坐标系

plt.show()

绘图函数

  • 对数坐标系

semilogx(), semilogy(), loglog()。分别绘制x轴为对数坐标系,y轴为对数坐标系,两轴都为对数坐标系的图表。

import numpy as np
import matplotlib.pyplot as plt

w = np.linspace(0.1,1000,1000)
p = np.abs(1/(1+0.1j*w))

plt.subplot(221)
plt.plot(w,p,linewidth = 2)
plt.ylim(0,1.5)

plt.subplot(222)
plt.semilogx(w,p,linewidth = 2)
plt.ylim(0,1.5)

plt.subplot(223)
plt.semilogy(w,p,linewidth = 2)
plt.ylim(0,1.5)

plt.subplot(224)
plt.loglog(w,p,linewidth = 2)
plt.ylim(0,1.5)

plt.show()
  • 极坐标

通过设置polar参数创建极坐标子图,或者使用polar()直接创建极坐标子图并绘制曲线。

  • 柱状图

bar()来绘制。

  • 散列图

scatter()函数

  • 图像
  • 等值线图
  • contour()和contourf()(带填充效果)
import numpy as np
import matplotlib.pyplot as plt

y,x = np.ogrid[-2:2:200j,-3:3:300j]
z = x*np.exp(-x**2-y**2)

extent = [np.min(x),np.max(x),np.min(y),np.max(y)]

plt.figure(figsize=(10,4))
plt.subplot(121)
cs = plt.contour(z,10,extent = extent)#10个区间
plt.clabel(cs)#为等值线标上对应的值
plt.subplot(122)
plt.contourf(x.reshape(-1),y.reshape(-1),z,20)
plt.show()
  • 绘制隐函数
import numpy as np
import matplotlib.pyplot as plt

y,x = np.ogrid[-1.5:1.5:200j,-1.5:1.5:200j]
f = (x**2+y**2)**4-(x**2-y**2)**2

extent = [np.min(x),np.max(x),np.min(y),np.max(y)]

plt.figure(figsize=(9,4))
plt.subplot(121)
cs = plt.contour(f,extent = extent,level = [0,0.1],
                colors = ["b","r"],linestyles = ["solid","dashed"],linewidth = [2,2])#两条等高线以及对应的属性

plt.clabel(cs)#为等值线标上对应的值

plt.subplot(122)
for c in cs.collections:
    data = c.get_paths()[0].vertices
    plt.plot(data[:,0],data[:,1],
            color = c.get_color()[0],linewidth = c.get_linewidth()[0])
plt.show()
  • 三维曲线

使用matplotlib的二维绘图的功能来实现三维图形的绘制,作业绘图速度有限。

猜你喜欢

转载自blog.csdn.net/m0_38019841/article/details/81105591