当前位置:   article > 正文

漂亮,超详细的matplotlib画图基础

matplotlib画图

来自 | 逐梦er

https://zhumenger.blog.csdn.net/article/details/106530281

本文仅作技术交流,如有侵权,请联系后台删除。

数据可视化非常重要,因为错误或不充分的数据表示方法可能会毁掉原本很出色的数据分析工作。

matplotlib 库是专门用于开发2D图表(包括3D图表)的,突出优点:

  • 使用起来极为简单。

  • 以渐进、交互式方式实现数据可视化。

  • 表达式和文本使用LaTeX排版。

  • 对图像元素控制力强。

  • 可输出PNG、PDF、SVG和EPS等多种格式。

   目  录

  • 安装

  • matplotlib 架构

  • matplotlib的基本用法

  • 一.线性图

  • 二.柱状图

  • 三.散点图

  • 四.等高线图

  • 五.处理图片

  • 六.3D图


   安  装

conda install matplotlib

或者

pip install matplotlib

   matplotlib 架构

matplotlib 的主要任务之一,就是提供一套表示和操作图形对象(主要对象)以及它的内部对象的函数和工具。其不仅可以处理图形,还提供事件处理工具,具有为图形添加动画效果的能力。有了这些附加功能,matplotlib 就能生成以键盘按键或鼠标移动触发的事件的交互式图表。

从逻辑上来讲,matplotlib 的整体架构为3层,各层之间单向通信:

  • Scripting (脚本)层。

  • Artist (表现)层。

  • Backend (后端)层。

   一、matplotlib的基本用法

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x = np.linspace(-np.pi, np.pi, 30) # 在区间内生成30个等差数
  4. y = np.sin(x)
  5. print('x = ', x)
  6. print('y = ', y)

输出:

  1. x = [-3.14159265 -2.92493109 -2.70826953 -2.49160797 -2.2749464 -2.05828484
  2. -1.84162328 -1.62496172 -1.40830016 -1.19163859 -0.97497703 -0.75831547
  3. -0.54165391 -0.32499234 -0.10833078 0.10833078 0.32499234 0.54165391
  4. 0.75831547 0.97497703 1.19163859 1.40830016 1.62496172 1.84162328
  5. 2.05828484 2.2749464 2.49160797 2.70826953 2.92493109 3.14159265]
  6. y = [-1.22464680e-16 -2.14970440e-01 -4.19889102e-01 -6.05174215e-01
  7. -7.62162055e-01 -8.83512044e-01 -9.63549993e-01 -9.98533414e-01
  8. -9.86826523e-01 -9.28976720e-01 -8.27688998e-01 -6.87699459e-01
  9. -5.15553857e-01 -3.19301530e-01 -1.08119018e-01 1.08119018e-01
  10. 3.19301530e-01 5.15553857e-01 6.87699459e-01 8.27688998e-01
  11. 9.28976720e-01 9.86826523e-01 9.98533414e-01 9.63549993e-01
  12. 8.83512044e-01 7.62162055e-01 6.05174215e-01 4.19889102e-01
  13.   2.14970440e-01  1.22464680e-16]

   一.线性图

画一条曲线

  1. plt.figure() # 创建一个新的窗口
  2. plt.plot(x, y) # 画一个x与y相关的曲线
  3. plt.show()# 显示图像

0ab247245a596c51a8236ab36c1e2c96.png

画多条曲线以及添加坐标轴和标签

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x = np.linspace(-np.pi, np.pi, 100) # 在区间内生成21个等差数
  4. y = np.sin(x)
  5. linear_y = 0.2 * x + 0.1
  6. plt.figure(figsize = (8, 6)) # 自定义窗口的大小
  7. plt.plot(x, y)
  8. plt.plot(x, linear_y, color = "red", linestyle = '--') # 自定义颜色和表示方式
  9. plt.title('y = sin(x) and y = 0.2x + 0.1') # 定义该曲线的标题
  10. plt.xlabel('x') # 定义横轴标签
  11. plt.ylabel('y') # 定义纵轴标签
  12. plt.show()

fe5d6d01bff919250cceae81c7dcf2b3.png

指定坐标范围 and 设置坐标轴刻度

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x = np.linspace(-np.pi, np.pi, 100) # 在区间内生成21个等差数
  4. y = np.sin(x)
  5. linear_y = 0.2 * x + 0.1
  6. plt.figure(figsize = (8, 6)) # 自定义窗口的大小
  7. plt.plot(x, y)
  8. plt.plot(x, linear_y, color = "red", linestyle = '--') # 自定义颜色和表示方式
  9. plt.title('y = sin(x) and y = 0.2x + 0.1') # 定义该曲线的标题
  10. plt.xlabel('x') # 定义横轴标签
  11. plt.ylabel('y') # 定义纵轴标签
  12. plt.xlim(-np.pi, np.pi)
  13. plt.ylim(-1, 1)
  14. # 重新设置x轴的刻度
  15. # plt.xticks(np.linspace(-np.pi, np.pi, 5))
  16. x_value_range = np.linspace(-np.pi, np.pi, 5)
  17. x_value_strs = [r'$\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$']
  18. plt.xticks(x_value_range, x_value_strs)
  19. plt.show() # 显示图像

517e589613f293cfa7c5b4a1ce42f4dc.png

定义原点在中心的坐标轴

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x = np.linspace(-np.pi, np.pi, 100)
  4. y = np.sin(x)
  5. linear_y = 0.2 * x + 0.1
  6. plt.figure(figsize = (8, 6))
  7. plt.plot(x, y)
  8. plt.plot(x, linear_y, color = "red", linestyle = '--')
  9. plt.title('y = sin(x) and y = 0.2x + 0.1')
  10. plt.xlabel('x')
  11. plt.ylabel('y')
  12. plt.xlim(-np.pi, np.pi)
  13. plt.ylim(-1, 1)
  14. # plt.xticks(np.linspace(-np.pi, np.pi, 5))
  15. x_value_range = np.linspace(-np.pi, np.pi, 5)
  16. x_value_strs = [r'$\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$']
  17. plt.xticks(x_value_range, x_value_strs)
  18. ax = plt.gca() # 获取坐标轴
  19. ax.spines['right'].set_color('none') # 隐藏上方和右方的坐标轴
  20. ax.spines['top'].set_color('none')
  21. # 设置左方和下方坐标轴的位置
  22. ax.spines['bottom'].set_position(('data', 0)) # 将下方的坐标轴设置到y = 0的位置
  23. ax.spines['left'].set_position(('data', 0)) # 将左方的坐标轴设置到 x = 0 的位置
  24. plt.show() # 显示图像

a6c11c1ca7614021dce3d49603da45b8.png

legend图例

使用xticks()和yticks()函数替换轴标签,分别为每个函数传入两列数值。第一个列表存储刻度的位置,第二个列表存储刻度的标签。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x = np.linspace(-np.pi, np.pi, 100)
  4. y = np.sin(x)
  5. linear_y = 0.2 * x + 0.1
  6. plt.figure(figsize = (8, 6))
  7. # 为曲线加上标签
  8. plt.plot(x, y, label = "y = sin(x)")
  9. plt.plot(x, linear_y, color = "red", linestyle = '--', label = 'y = 0.2x + 0.1')
  10. plt.title('y = sin(x) and y = 0.2x + 0.1')
  11. plt.xlabel('x')
  12. plt.ylabel('y')
  13. plt.xlim(-np.pi, np.pi)
  14. plt.ylim(-1, 1)
  15. # plt.xticks(np.linspace(-np.pi, np.pi, 5))
  16. x_value_range = np.linspace(-np.pi, np.pi, 5)
  17. x_value_strs = [r'$\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$']
  18. plt.xticks(x_value_range, x_value_strs)
  19. ax = plt.gca()
  20. ax.spines['right'].set_color('none')
  21. ax.spines['top'].set_color('none')
  22. ax.spines['bottom'].set_position(('data', 0))
  23. ax.spines['left'].set_position(('data', 0))
  24. # 将曲线的信息标识出来
  25. plt.legend(loc = 'lower right', fontsize = 12)
  26. plt.show()

8ec2783e1c2772a7a16a82d4d38e3bd9.png

legend方法中的loc 参数可选设置

位置字符串位置编号位置表述
‘best’0最佳位置
‘upper right’1右上角
‘upper left’2左上角
‘lower left’3左下角
‘lower right’4右下角
‘right’5右侧
‘center left’6左侧垂直居中
‘center right’7右侧垂直居中
‘lower center’8下方水平居中
‘upper center’9上方水平居中
‘center’10正中间


   二、柱状图

使用的方法:plt.bar

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. plt.figure(figsize = (16, 12))
  4. x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
  5. y = np.array([3, 5, 7, 6, 2, 6, 10, 15])
  6. plt.plot(x, y, 'r', lw = 5) # 指定线的颜色和宽度
  7. x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
  8. y = np.array([13, 25, 17, 36, 21, 16, 10, 15])
  9. plt.bar(x, y, 0.2, alpha = 1, color='b') # 生成柱状图,指明图的宽度,透明度和颜色
  10. plt.show()

7f9fd7b53c1a62a03d7449d6c639d6d4.png

有的时候柱状图会出现在x轴的俩侧,方便进行比较,代码实现如下:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. plt.figure(figsize = (16, 12))
  4. n = 12
  5. x = np.arange(n) # 按顺序生成从12以内的数字
  6. y1 = (1 - x / float(n)) * np.random.uniform(0.5, 1.0, n)
  7. y2 = (1 - x / float(n)) * np.random.uniform(0.5, 1.0, n)
  8. # 设置柱状图的颜色以及边界颜色
  9. #+y表示在x轴的上方 -y表示在x轴的下方
  10. plt.bar(x, +y1, facecolor = '#9999ff', edgecolor = 'white')
  11. plt.bar(x, -y2, facecolor = '#ff9999', edgecolor = 'white')
  12. plt.xlim(-0.5, n) # 设置x轴的范围,
  13. plt.xticks(()) # 可以通过设置刻度为空,消除刻度
  14. plt.ylim(-1.25, 1.25) # 设置y轴的范围
  15. plt.yticks(())
  16. # plt.text()在图像中写入文本,设置位置,设置文本,ha设置水平方向对其方式,va设置垂直方向对齐方式
  17. for x1, y in zip(x, y2):
  18. plt.text(x1, -y - 0.05, '%.2f' % y, ha = 'center', va = 'top')
  19. for x1, y in zip(x, y1):
  20. plt.text(x1, y + 0.05, '%.2f' % y, ha = 'center', va = 'bottom')
  21. plt.show()

2494f71de6332b5f47de172253f8c60d.png

   三、散点图

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. N = 50
  4. x = np.random.rand(N)
  5. y = np.random.rand(N)
  6. colors = np.random.rand(N)
  7. area = np.pi * (15 * np.random.rand(N))**2
  8. plt.scatter(x, y, s = area,c = colors, alpha = 0.8)
  9. plt.show()

fb8342321c72f8e1ee6940791baa9354.png


   四、等高线图

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. def f(x, y):
  4. return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
  5. n = 256
  6. x = np.linspace(-3, 3, n)
  7. y = np.linspace(-3, 3, n)
  8. X, Y = np.meshgrid(x, y) # 生成网格坐标 将x轴与y轴正方形区域的点全部获取
  9. line_num = 10 # 等高线的数量
  10. plt.figure(figsize = (16, 12))
  11. #contour 生成等高线的函数
  12. #前俩个参数表示点的坐标,第三个参数表示等成等高线的函数,第四个参数表示生成多少个等高线
  13. C = plt.contour(X, Y, f(X, Y), line_num, colors = 'black', linewidths = 0.5) # 设置颜色和线段的宽度
  14. plt.clabel(C, inline = True, fontsize = 12) # 得到每条等高线确切的值
  15. # 填充颜色, cmap 表示以什么方式填充,hot表示填充热量的颜色
  16. plt.contourf(X, Y, f(X, Y), line_num, alpha = 0.75, cmap = plt.cm.hot)
  17. plt.show()

ae12ac6e78e5480daab1b0e94f0110ae.png


   五、处理图片

  1. import matplotlib.pyplot as plt
  2. import matplotlib.image as mpimg # 导入处理图片的库
  3. import matplotlib.cm as cm # 导入处理颜色的库colormap
  4. plt.figure(figsize = (16, 12))
  5. img = mpimg.imread('image/fuli.jpg')# 读取图片
  6. print(img) # numpy数据
  7. print(img.shape) #
  8. plt.imshow(img, cmap = 'hot')
  9. plt.colorbar() # 得到颜色多对应的数值
  10. plt.show()
  1. [[[ 11 23 63]
  2. [ 12 24 64]
  3. [ 1 13 55]
  4. ...
  5. [ 1 12 42]
  6. [ 1 12 42]
  7. [ 1 12 42]]
  8. [[ 19 31 71]
  9. [ 3 15 55]
  10. [ 0 10 52]
  11. ...
  12. [ 0 11 39]
  13. [ 0 11 39]
  14. [ 0 11 39]]
  15. [[ 22 34 74]
  16. [ 3 15 55]
  17. [ 7 19 61]
  18. ...
  19. [ 0 11 39]
  20. [ 0 11 39]
  21. [ 0 11 39]]
  22. ...
  23. [[ 84 125 217]
  24. [ 80 121 213]
  25. [ 78 118 214]
  26. ...
  27. [ 58 90 191]
  28. [ 54 86 187]
  29. [ 53 85 186]]
  30. [[ 84 124 220]
  31. [ 79 119 215]
  32. [ 78 117 218]
  33. ...
  34. [ 55 87 188]
  35. [ 55 87 188]
  36. [ 55 87 188]]
  37. [[ 83 121 220]
  38. [ 80 118 219]
  39. [ 83 120 224]
  40. ...
  41. [ 56 88 189]
  42. [ 58 90 191]
  43. [ 59 91 192]]]
  44. (7285163)

e54908fd5984c96bbfa85e8674c1b876.png

利用numpy矩阵得到图片

  1. import matplotlib.pyplot as plt
  2. import matplotlib.cm as cm # 导入处理颜色的库colormap
  3. import numpy as np
  4. size = 8
  5. # 得到一个8*8数值在(0, 1)之间的矩阵
  6. a = np.linspace(0, 1, size ** 2).reshape(size, size)
  7. plt.figure(figsize = (16, 12))
  8. plt.imshow(a)
  9. plt.show()

bb25dd3ddf79596e8dd22b6cff37f8b6.png


   六、3D图

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D # 导入Axes3D对象
  4. fig = plt.figure(figsize = (16, 12))
  5. ax = fig.add_subplot(111, projection = '3d') # 得到3d图像
  6. x = np.arange(-4, 4, 0.25)
  7. y = np.arange(-4, 4, 0.25)
  8. X, Y = np.meshgrid(x, y) # 生成网格
  9. Z = np.sqrt(X ** 2 + Y ** 2)
  10. # 画曲面图 # 行和列对应的跨度 # 设置颜色
  11. ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = plt.get_cmap('rainbow'))
  12. plt.show()

143de8f013ec68ef52305d5663bd19ab.png

以上是matplotlib基于测试数据的数据可视化,结合实际项目中数据,代码稍加修改,即可有让人印象深刻的效果。

推荐阅读:

我的2022届互联网校招分享

我的2021总结

浅谈算法岗和开发岗的区别

互联网校招研发薪资汇总

2022届互联网求职现状,金9银10快变成铜9铁10!!

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

57ed4a2c885faae9041f0b938a5df190.png

发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)

发送【1222】获取一份不错的leetcode刷题笔记

发送【AI四大名著】获取四本经典AI电子书

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/115628
推荐阅读
相关标签
  

闽ICP备14008679号