Python数据处理之Matplotlib学习

  • A+
所属分类:python数据分析
摘要这一篇文章会介绍一下python数据分析中matplotlib的使用。把一些常用的方法记录在此,方便自己以后的查阅与学习。

Matploylib介绍

数据分析的时候,我们经常需要将数据可视化,这是就需要使用matplotlib模块了。

我们首先将matplotlib.pyplot导入后命名为plt, 在后面的内容中,出现的plt都默认是matplotlib.pyplot

import matplotlib.pyplot as plt

matplotlib基础

matplotlib是面向对象的绘图工具包,绘制的图形中每一个元素都是一个对象,比如线条,文字,刻度等信息,可以通过修改这些对象的属性,从而改变绘图样式。

matplotlib中主要的绘图对象列表如下:

  • Figure对象,可以想象为一张画布;
  • Axes对象,字面理解为坐标轴(因为每一个 Axes 都有一套 X Y轴坐标系,绘制图形时基于此坐标系绘制。) 也可以认为是子图,在一个Figure对象中可以包含多个Axes对象,也就是说一张画布可以包含多个子图;
  • Line2D对象,代表线条;
  • Text对象,代表了文字,比如一张子图需要标题,就可以使用一个Text对象;

下面我们先来看一个简单的例子:

  1. N = 50
  2. x = np.random.random(N) # 横坐标
  3. y = np.random.random(N) # 纵坐标
  4. colors = np.random.random(N) # 每个坐标的颜色
  5. area = np.pi*(10*np.random.random(N))**2 # 每个坐标的颜色
  6. plt.scatter(x,y,s=area,c=colors,alpha=0.5)
  7. plt.show()

我们可以看一下画出来的图像,是一个散点图

Python数据处理之Matplotlib学习

在上面这个例子中,我们没有创建任何Figure对象,这是因为plt会默认创建Figure对象并保存在plt内部。

下面我们通过plt.figure()创建一个新的Figure对象,然后在此Figure对象上创建Axies对象。

  1. fig = plt.figure()
  2. ax1 = fig.add_subplot(2,2,1) #添加一个Axes对象到布局为两行两列的第一个位置
  3. ax2 = fig.add_subplot(2,2,2)
  4. ax3 = fig.add_subplot(2,2,3)
  5. ax1.plot(np.random.randn(50).cumsum(), 'k--')
  6. ax2.hist(np.random.randn(100), bins=20, color='k')
  7. ax3.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
  8. fig.show()

我们首先创建一个Figure对象,接着插入三个Axes对象,接着在Axes对象上绘制累积和线图,直方图以及散点图。

我们要注意的是上面的fig.add_subplot(2,2,1)表示添加一个Axes对象到布局为两行两列的第一个位置。

我们看一下上面代码绘制出图像的样子:

Python数据处理之Matplotlib学习

到这里我们就把matplotlib的基本功能看完了,下面我们看一下常用的属性设置。

常用属性设置

matplotlib绘制的图形可以设置各种属性,比如设置坐标系的刻度,标题,标签等属性。 matplotplib绘制图形时,基于X, Y轴坐标系绘图。我们可以设置X, Y坐标的各种属性,比如刻度,范围,标签等属性。

设置标题,坐标刻度

  1. fig = plt.figure()
  2. ax = fig.add_subplot(1,1,1)
  3. # 设置标题
  4. ax.set_title('Test Title')
  5. major_ticks = np.arange(0, 101, 20)
  6. minor_ticks = np.arange(0, 101, 5)
  7. # 设置刻度
  8. ax.set_xticks(major_ticks)
  9. ax.set_xticks(minor_ticks, minor=True)   # 这个是短线
  10. ax.set_yticks(major_ticks)
  11. ax.set_yticks(minor_ticks, minor=True)
  12. # 设置 X, Y 轴 标签
  13. ax.set_xlabel("X axis")
  14. ax.set_ylabel("Y axis")
  15. # 设置网格                                                                       
  16. ax.grid(which='minor', alpha=0.2)
  17. ax.grid(which='major', alpha=0.5)
  18. # 添加文字
  19. ax.text(42.5, 50, "Hello World")
  20. fig.show()

 

可以看到下面的效果

Python数据处理之Matplotlib学习

设置曲线颜色,图例

  1. # 设置显示中文
  2. from pylab import *
  3. mpl.rcParams['font.sans-serif'] = ['SimHei']
  4. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
  5. x = np.linspace(0, 1,100)
  6. fig = plt.figure()
  7. ax = fig.add_subplot(1,1,1)
  8. ax.set_title(u'设置曲线颜色与图例')
  9. # 四个参数分别表示x,y轴数据,'b--'表示颜色是蓝色样式是虚线,最后一个表示标签,支持LaTex
  10. ax.plot(x, x ** (1/8), 'b--', label=r'$y = x^{1/8}$')
  11. ax.plot(x, x ** 8, 'r--', label=r'$y = x^{8}$')
  12. ax.plot(x, x ** (1/2), 'r.', label=r'$y = x^{1/2}$')
  13. ax.plot(x, x ** 2, 'b.', label=r'$y = x^{2}$')
  14. ax.plot(x, x, 'g-', label=r'$y = x$')
  15. # 自动生成图例
  16. ax.legend()
  17. # 设置图像x,y轴的范围,都是从0-1
  18. ax.axis([0, 1, 0, 1])
  19. fig.show()

上面的代码运行完毕后我们可以看到如下的图像

Python数据处理之Matplotlib学习

关于一些常用的样式,我们记录一下:

线的样式linestyle=

  • '-' 默认实线
  • '--' 虚线
  • '-.' 间断线
  • ':' 点状线

绘制图像的样式

绘制xkcd样式图片

我们可以绘制漫画风格的图片,只需要在初始设定plt.xkcd()即可;

  1. plt.xkcd()
  2. fig = plt.figure()
  3. ax = fig.add_subplot(1, 1, 1)
  4. np.random.seed(7)
  5. x = np.linspace(1, 10, 50)
  6. y = 2*x + 0.5*x**2 + 0.3*x**4 - 0.025*x**5 + 5*np.random.rand(50)
  7. ax.scatter(x, y)

最终的绘制效果如下图所示:

Python数据处理之Matplotlib学习

绘制其他样式

对于绘制其他样式的图片,只需要修改plt.style.use即可,可以看下面的简单的例子

  1. # 生成随机数据
  2. np.random.seed(7)
  3. x = np.linspace(1, 12, 10)
  4. y = 2*x + 0.7*x**2 - 20*np.sin(x) - 20*np.cos(x) + 5*np.random.rand(10)
  5. plt.style.use("ggplot") # 使用美观的样式
  6. plt.scatter(x, y)
Python数据处理之Matplotlib学习

常用图像

我们在数据分析的时候,经常会用到各种各样的图像,我们就在这里总结一下。

线形图

这个就有点类似把一些散点连起来,我们使用Axes.plot进行绘制

  1. fig = plt.figure()
  2. ax = fig.add_subplot(1,1,1)
  3. x = np.arange(10)
  4. y = x**2
  5. ax.plot(x,y)
  6. fig.show()
Python数据处理之Matplotlib学习

柱状图

纵向的柱状图
  1. fig = plt.figure(figsize=(7,5))
  2. ax = fig.add_subplot(1,1,1)
  3. bar_data = [5, 20, 15, 25, 10]
  4. bar_labels = ['Tom', 'Dick', 'Harry', 'Slim', 'Jim']
  5. plt.bar(range(len(bar_data)), bar_data, tick_label=bar_labels)
  6. plt.show()
Python数据处理之Matplotlib学习 将上面的plt.bar替换为plt.barh可以画出横向的柱状图. 一般用在labels比较长,或是比较多的时候,比如说我们可以绘制出下面的图像. Python数据处理之Matplotlib学习 参考链接 : matplotlib绘图——柱状图

直方图

直方图X轴一般是统计的样本,而Y轴一般是样本对应的统计度量。

为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。在 matplotlib 中可以使用Axes.hist方法绘制直方图。

  1. fig = plt.figure()
  2. ax = fig.add_subplot(1,1,1)
  3. data = np.random.normal(0,20,1000) # 在0-20之间产生1000个随机数
  4. bins = np.arange(-100,100,5) # 产生区间刻度
  5. ax.hist(data,bins=bins)
  6. fig.show()
  Python数据处理之Matplotlib学习

散点图

散点图,将所有的数据值在图形中绘制成点,这样有多少数据值在图形中就会有多少个点。通过这些数据点可以看出数据值的分布模式,比如是否有聚类模式,或者相关关系或者发现离群点。在 matplotlib 中可以通过Axes.scatter绘制散点图。

 
  1. fig = plt.figure()
  2. ax = fig.add_subplot(1,1,1)
  3. x = np.arange(1,100,1)
  4. y = x**2+100*x*np.random.random(len(x))
  5. ax.scatter(x,y)
  6. fig.show()
  Python数据处理之Matplotlib学习

绘制多边形(区间的绘制)

我们可以使用plt.fill进行多边形的绘制,我们先看一个简单的例子:
  1. # 绘制一个多边形的区域
  2. test_x = np.array([1,2,3])
  3. test_y = np.array([4,1,2])
  4. fig, axes = plt.subplots(nrows=1, ncols=1,figsize=(13,7))
  5. axes.fill(test_x,test_y)
Python数据处理之Matplotlib学习 我们可以使用这个方法来绘制一个区间的效果;
  1. # 绘制一个多边形的区域
  2. test_x = np.linspace(0.1, 9.9, 200)
  3. test_y = np.sin(test_x)
  4. fig, axes = plt.subplots(nrows=1, ncols=1,figsize=(13,7))
  5. axes.plot(test_x,test_y,c='r')
  6. axes.fill(np.concatenate([test_x,test_x[::-1]]),np.concatenate([test_y + 1, test_y - 1]))
Python数据处理之Matplotlib学习

箱线图

箱线图可以看出数据的分散程度,异常值等信息,箱线图根据一组数据的以下 5 个统计值进行绘制:

  • 最小值;
  • 第1四分位数;
  • 中位数;
  • 第3四分位数;
  • 最大值;

在 matplotlib 中可以使用Axes.boxplot方法绘制箱线图

  1. fig = plt.figure()
  2. ax = fig.add_subplot(1,1,1)
  3. # 产生 50 个小于 100 的随机数
  4. spread = np.random.rand(50) * 100
  5. # 产生 25 个值为 50 的数据
  6. center = np.ones(25) * 50
  7. # 异常值
  8. outlier_high = np.random.rand(10) * 100 + 100
  9. outlier_low = np.random.rand(10) * -100
  10. data = np.concatenate((spread, center, outlier_high, outlier_low), 0)
  11. ax.boxplot(data)
  12. fig.show()
 

上面的代码中,我们特意创建了 data 数据,可以推断出该数据的中位数是 50,还有一些其他异常值,绘制的图形如下:

Python数据处理之Matplotlib学习

绘制动态图

除了能绘制上面的静态图像,我们还可以绘制动态图像,下面我们来举一个小例子来说明matplotlib如何绘制动态图像。

动态图主要是通过animation模块实现。具体就是matplotlib.animation.FuncAnimation(fig, func)。其中fig代表所绘制的图像。而func可以看作是更新函数,它刷新每一帧的值。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib.animation as animation
  4. fig = plt.figure()
  5. ax = fig.add_subplot(1,1,1)
  6. x = np.arange(0,2*np.pi,0.01)
  7. line, = plt.plot(x,np.sin(x))
  8. # 更新函数
  9. def update(i):
  10.     line.set_ydata(np.sin(x+i/10))
  11.     return line
  12. animation = animation.FuncAnimation(fig,update,interval=20)
  13. plt.show()

 

上面的interval表示更新频率,以ms计。(说实话,制作动画还是喜欢使用Mathematica来进行制作)

看一下上面的绘制出的效果

Python数据处理之Matplotlib学习

绘制三维图像

最后,我们来说一下三维图像的绘制。

绘制三维散点图

  1. import numpy as np
  2. # 导入2d,3d的绘图模块
  3. from mpl_toolkits.mplot3d import Axes3D
  4. import matplotlib.pyplot as plt
  5. # x, y, z 均为 0 到 1 之间的 100 个随机数
  6. x = np.random.normal(0, 1, 100)
  7. y = np.random.normal(0, 1, 100)
  8. z = np.random.normal(0, 1, 100)
  9. fig = plt.figure()
  10. ax = Axes3D(fig)
  11. ax.scatter(x,y,z)
  12. plt.show()

 

Python数据处理之Matplotlib学习

绘制三维线形图

  1. # 载入模块
  2. from mpl_toolkits.mplot3d import Axes3D
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. # 生成数据
  6. x = np.linspace(-6 * np.pi, 6 * np.pi, 1000)
  7. y = np.sin(x)
  8. z = np.cos(x)
  9. # 创建 3D 图形对象
  10. fig = plt.figure()
  11. ax = Axes3D(fig)
  12. # 绘制线型图
  13. ax.plot(x, y, z)
  14. # 显示图
  15. plt.show()
  Python数据处理之Matplotlib学习

绘制三维曲面图

  1. # 载入模块
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from mpl_toolkits.mplot3d import Axes3D
  5. # 创建 3D 图形对象
  6. fig = plt.figure()
  7. ax = Axes3D(fig)
  8. # 生成数据
  9. X = np.arange(-2, 2, 0.1)
  10. Y = np.arange(-2, 2, 0.1)
  11. X, Y = np.meshgrid(X, Y) #注意这一步
  12. Z = np.sqrt(X ** 2 + Y ** 2)
  13. # 绘制曲面图,并使用 cmap 着色
  14. ax.plot_surface(X, Y, Z, cmap=plt.cm.winter)
  15. plt.show()
 

这个上面的meshgrid是用来生成底部的网格的,我们可以看一下x,y是什么

Python数据处理之Matplotlib学习

运行上面的代码,于是我们可以得到下面的图像

Python数据处理之Matplotlib学习

子图的绘制

之前绘制二维图像的时候我们是通过.add_subplot()来绘制子图的,其实在三维的时候也是一样的,只是注意 3D 绘图时要添加 projection='3d' 参数,下面我们看一个具体的例子。

  1. # -*- coding: utf-8 -*
  2. # 载入模块
  3. from mpl_toolkits.mplot3d import Axes3D
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. # 创建 1 张画布
  7. fig = plt.figure()
  8. #===============
  9. # 向画布添加子图 1 
  10. ax1 = fig.add_subplot(1, 2, 1, projection='3d')
  11. # 生成子图 1 数据
  12. x = np.linspace(-6 * np.pi, 6 * np.pi, 1000)
  13. y = np.sin(x)
  14. z = np.cos(x)
  15. # 绘制第 1 张图
  16. ax1.plot(x, y, z)
  17. #===============
  18. # 向画布添加子图 2
  19. ax2 = fig.add_subplot(1, 2, 2, projection='3d')
  20. # 生成子图 2 数据
  21. X = np.arange(-2, 2, 0.1)
  22. Y = np.arange(-2, 2, 0.1)
  23. X, Y = np.meshgrid(X, Y)
  24. Z = np.sqrt(X ** 2 + Y ** 2)
  25. # 绘制第 2 张图
  26. ax2.plot_surface(X, Y, Z, cmap=plt.cm.winter)
  27. # 显示图
  28. plt.show()

 

Python数据处理之Matplotlib学习

上面就是matplotlib的一些常用的用法了,记录在此也方便自己的查阅。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: