Skip to content

Matplotlib

Starslayerx edited this page Mar 26, 2021 · 19 revisions

本文档介绍Python中数据可视化,不仅仅包含Matplotlib这个库 Matplotlib

import matplotlib.pyplot as plt
%matplotlib inline    # %matplotlib widget 交互式

简单介绍

Matplotlib有四类基础类型的对象容器:Figure、Axes、Axis、Tick。figure即图片本身,负责图形大小、位置;Axes负责坐标轴位置、绘图;Axis负责坐标轴的设�置等;Tick负责格式化样式等。下面是Matplotlib figure的组成 matplotlib_figure

pyplot介绍

matplotlib绘制的图都位于figure对象中,可以使用figure方法生成一个新的图片

fig = plt.figure()

此时的图为一个空白图,可以在该图上添加一个或多个子图

  • 使用add_subplot添加子图
# 创建2*2个子图的1~3图
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

agg_subplot返回Axes Subplot对象,使用这些对象可以直接在子图上调用对象的方法进行绘图,若此时直接使用plt.plot进行绘图,则会在最后创建的子图上进行绘图。

ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.4)
ax2.scatter(np.arange(30), np.arange(30) + 3*np.random.randn(30))
plt.plot(np.random.randn(50).cumsum(), 'k--')    # 直接绘制在最后一个子图上

subfigures

  • subplots函数
    subplots函数可以绘制x*y个子图,返回一个figure对象和一个Axes对象:

    fig, axes = subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True,subplot_kw=None, 
    gridspec_kw=None, **fig_kw)
    • fig为figure对象,可以用来保存图片使用`fig.savefig('name')
    • axes可以通过二维数组的方法来访问子图,例如axes[0,1]这样
    • nrows and ncols:行和列的个数。
    • sharex and sharey: 是否共享x y 轴。
    • subplot_kw: 传入add_subplot的关键字参数字典,用于生成子图。
    • **fig_kw:生成图片时使用的figure参数,如 figsize、facecolor等。
  • 调整子图间距

    subplots_adjust(left=None, bootm=None, right=None, top=None, wspace=None, hspce=None)
    • left: 子图左边缘的位置
    • right: 子图右边缘的位置
    • bottom: 子图底部边缘的位置
    • top: 子图顶端边缘的位置
    • wspace: 子图只之间的宽度
    • hspace: 每行子图之间padding的高度

    子图之间若出现遮挡,也可以使用tight_layout方法自动调整,也支持使用参数自行调整

    plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

颜色、标记和线类型

下面是plot函数的详细介绍

plot(x, y, linestyle, linewidth, color, marker, markersize, markeredgecolor, markerfacecolor, markeredgewidth, label, alpha)

其中x为x轴数值,y为y轴数值,此外也可以传入多个x1, y1, x2, y2同时绘制多个图,下面为其他参数解释:

  • linestyle: 折线类型,实线、虚线和点画线等
  • linewidth: 折线宽度
  • marker: 为折线图添加点,并设置形状
  • markersize: 点的大小
  • markeredgecolor: 点的边框颜色
  • markerfacecolor: 点的填充颜色
  • markeredgewidth: 点的边框宽度
  • label: 折线图标签(用于标签)
  • alpha: 折线图透明度

还有绘制其他形状图形的常用函数

函数 说明
pie 绘制饼状图
bar 绘制柱状图
hist 绘制二维直方图
scatter 绘制散点图

下面是调整绘图样式的详细参数选项

符号参数 可选类型 说明
color 线条颜色 b 蓝色
c 青色
g 绿色
k 黑色
m 洋红色
r 红色
w 白色
y 黄色
linestyle 线条样式 - 实线
-- 虚线
-. 点画线
: 点线
marker 数据点形状 .
o 圆圈
* 星形
x 十字
s 正方形
p 五角星
d 钻石
h 六角形
+ 加号
^ < > 各种三角形
1234 Tropod向上下左右各个方向

特殊属性 drawstyle='steps-post'绘制梯形图形

刻度、标签和图例

  • 设置标题、轴标签、刻度和刻度标签
    设置标题使用set_title方法

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.set_title('My first matplotlib plot')

    使用xlim函数不加参数返回当前x轴范围,加上参数后可以设置x轴范围

    plt.xlim([0,10]) # 设置x轴范围从0到10

    使用set_xticksset_xticklabels分别设置x轴刻度和标签(指出要显示的刻度,并在下面写个标签,可以为数据也可以为字符串)

    对于y轴同理,将x换成y即可

    还可以使用set方法批量设置绘图属性

    props = {
        'title': 'My first matplotlib plot',
        'xlabel': 'Stages'
    }
    ax.set(**props)
  • 添加图例

    plt.plot(np.random.randn(1000).cumsum(), 'k', label = 'one')
    plt.legend(loc='best')

    legend函数显示标签,与之前绘图添加的label对应,参数loc可以使用'best'会自动将图例放在合适的地方。

  • 注释与子图加工 使用text方法在图中位置添加注释

    plt.text(x, y, 'string', family='font', fontsize=n)
    • x y: 分别为注释的位置
    • 'string': 注释内容
    • family: 注释字体
    • fontsize: 字体大小
      使用arrow函数可以添加箭头,和注释搭配起来很好用
    matplotlib.pyplot.arrow(x, y, dx, dy, hold=None, **kwargs)

    参数

    • x, y: 箭头起点做I报
    • dx, dy: 箭头在xy轴上的长度
    • width: 箭头宽度,默认0.001
    • length_includes_head: 头是否包含在长度之中,默认False
    • head_width: 箭"头"的宽度,默认 3*width
    • head_length: 箭"头"的长度,默认 1.5*head_width
    • shape: [‘full’, ‘left’, ‘right’],箭头形状,默认‘full’
      annotate方法用于直接添加带箭头的注解
    Axes.annotate(s, xy, *args, **kwargs)
    ``
    - s: 注解文本
    - xy: (float, float) 注解的点(箭头指向)的坐标
    - xytext:(float,float) 注释内容的坐标位置
    - xycoords被注释点的坐标系属性
    - color: 设置字体颜色
  • 添加图像
    添加图像需要生成patch(补丁)对象,并使用ax.add_patch(shp)将其加入子图中

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

rect = plt.Rectangle((0.2, 0.75), 0.4, 0.25, color='k', alpha=0.3)
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]], color='g', alpha=0.5)

ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

figure

等高线图

plt.contour()函数可以绘制等高线图,x y z为绘制点,后面为等高线密度
plt.clabel()用于对等高线加上数值标记,并设置字体大小

x = np.arange(-2.0,2.0,0.01)
y = np.arange(-2.0,2.0,0.01)
X,Y = np.meshgrid(x,y)
def f(x,y):
    return (1-y**5+x**5)*np.exp(-x**2-y**2)

C = plt.contour(X,Y,f(X,Y),8)
plt.clabel(C,inline=1,fontsize=10)
plt.show()

contour_origional
此外,还可以通过contour函数的参数,给图片自定义颜色color='black',或使用颜色库中的渐变色cmap=plt.cm.hot
使用这两个参数后的图片:
contour_black contour_cmap
最后,我们还可以使用函数plt.colorbar()给图片添加颜色值

x = np.arange(-2.0,2.0,0.01)
y = np.arange(-2.0,2.0,0.01)
X,Y = np.meshgrid(x,y)
def f(x,y):
    return (1-y**5+x**5)*np.exp(-x**2-y**2)

C = plt.contour(X,Y,f(X,Y), 10)
plt.clabel(C,inline=1,fontsize=10)
plt.colorbar()    # 显示颜色值
plt.show()

contour_toolbar

极区图

极区图呈放射延伸状,每块会占一定的角度。其半径大小表示它代表的某一类数据的大小。其角度大小表示它所占总类别的比例。

plt.bar(角度, 半径, width=宽度, bottom= , color=颜色)

例如下面的例子

theta = np.arange(0.,2*np.pi,2*np.pi/8)
radii = np.array([4,7,5,3,1,5,6,7])
plt.axes([0.025,0.025,0.95,0.95],polar=True)
colors = np.array(['#4bb2c5','#c5b47f','#EAA228','#579575','#839557','#958c12','#953579','#4b5de4'])
bars = plt.bar(theta,radii,width=(2*np.pi/8),bottom=0.0,color=colors)
plt.show()

bar

三维绘图

使用projection='3d'来创建一个Axes3D对象

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
  • 绘制曲线和散点图

    # 绘制螺旋线
    zline = np.linspace(0, 15, 1000)
    xline = np.sin(zline)
    yline = np.cos(zline)
    ax.plot3D(xline, yline, zline, 'gray')
    
    # 绘制散点图
    zdata = 15 * np.random.random(100)
    xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
    ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
    ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens') # c为颜色深度渐变方向
    
    plt.show()  
  • 三维轮廓图 coutour3D函数提供绘制三维轮廓图的方法,第四个参数50表示线的密度,set_*label函数为各个轴设置标签

      def f(x, y):
        return np.sin(np.sqrt(x ** 2 + y ** 2))
    x = np.linspace(-6, 6, 30)
    y = np.linspace(-6, 6, 30)
    X, Y = np.meshgrid(x, y)
    Z = f(X, Y)
    
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    
    ax.contour3D(X, Y, Z, 50, cmap='binary')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('z')

    3d_countour
    若视图不直观,可以使用ax.view_init()函数修改视角

    • 表面三角测量
      使用函数plot_wireframe绘制线框图
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    ax.plot_wireframe(X, Y, Z, color='black')
    ax.set_title('wireframe')

    wireframe

Clone this wiki locally