Matplotlib Python 画图工具包教程学习笔记4 等高线图以及3D图形的画法


1.等高线图

要想画出一个等高线图,主要分为以下三个步骤

  1. 铺盖出平面
  2. 在平面上赋值
  3. 在分界处画出等高线
  4. 为等高线添加标签

1.1 meshgrid

主要用于铺盖出一个二维平面

  • 其参数主要传进去两个linspace函数生成的向量
  • 如果传进去的两个向量的维度分别为m维度和n维度,则可以生成一个m*n的一个网格平面
  • 在这m*n个网格数据中附上对应的数值,则相当于在三维的的空间中做出了图像,第三个维度在二维平面中表现为颜色的深浅
#定义网格
X,Y = np.meshgrid(x,y)

1.2 plt.contourf

f对应的意思是fill,这个函数的功能主要可以将二维的图片依据传进去的参数Z涂上相应的颜色

  • 参数1和2传进去刚才生成的二维网格的平面坐标
  • 参数3传进去网格对应生成的Z轴数据
  • 参数4输入一个整数,表示图片中将被分成的色块的数量
  • alpha:透明度
  • cmap:图片的整体色系
#把颜色放上去
# 数字8 表示将等高线分成多少部分,如果这里填8的话就是10个部分
plt.contourf(X, Y, f(X,Y), 8, alpha = 0.75, cmap=plt.cm.hot)

1.3 plt.contour

相比于上面一个函数,少了个f,这个函数主要用于在不同的色块交界的地方绘制等高线

  • 其传进去的前几个参数的含义与上一部分的函数大致相同
  • colors:线的颜色
  • linewidths:线宽
#画等高线的线
#注意线的宽度是 linewidths,后面有s
C = plt.contour(X,Y,f(X,Y),8,colors = 'black',linewidths=.5)


1.4 plt.clabe

为等高线加上标注

  • 第一个参数传进去刚才等高线绘制函数返回的句柄
  • inline:等高线是否穿过字体
  • fontsize:文字大小
#添加线对应的标签
#改为False的话就会使得线穿过数字本身
plt.clabel(C,inline=True,fontsize = 10)

1.5 测试代码

# -*- coding:utf-8 -8-
"""
Author: Leung
Date: 2021--08--23
"""

import matplotlib.pyplot as plt
import numpy as np


def f(x, y):
    # the height function
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)

#定义网格
X,Y = np.meshgrid(x,y)

#把颜色放上去
# 数字8 表示将等高线分成多少部分,如果这里填8的话就是10个部分
plt.contourf(X, Y, f(X,Y), 8, alpha = 0.75, cmap=plt.cm.hot)

#画等高线的线
#注意线的宽度是 linewidths,后面有s
C = plt.contour(X,Y,f(X,Y),8,colors = 'black',linewidths=.5)

#添加线对应的标签
#改为False的话就会使得线穿过数字本身
plt.clabel(C,inline=True,fontsize = 10)

plt.xticks(())
plt.yticks(())
plt.show()

1.6 最终效果

11


2. 3D图形的绘制

3D图像与等高线的绘制方法绘制,都是几大步骤

  1. 指定网格
  2. 在网格上写下对应的数值
  3. 绘制图像 ,主要使用plot_surface函数

不过需要注意的是,我们在绘制3D图像的时候需要在前面加上加粗样式一个3D图像的定义句柄

#加上一个3D的坐标轴
ax = Axes3D(fig)

这个功能类似于我们画2D图像时候定义的figure

2.1 plot_surface

与前面等高线的绘制函数类似

  • 前三参数传进去X,Y,Z
  • rstride=1 表示行跨度 与列跨度,跨度越大,其小正方形面积越大
  • cmap=plt.get_cmap(‘rainbow’):设置图形的色系为彩虹色
# rstride=1 表示行跨度 与列跨度
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

2.2 测试代码

# -*- coding:utf-8 -8-
"""
Author: Leung
Date: 2021--08--23
"""
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

#加上一个3D的坐标轴
ax = Axes3D(fig)

#生成向量
X = np.arange(-4,4,0.25)
Y = np.arange(-4,4,0.25)
X,Y = np.meshgrid(X,Y)
R = np.sqrt(X**2+Y**2)

#高度数值
Z = np.sin(R)

# rstride=1 表示行跨度 与列跨度
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

# 从z轴压下去,投影到xoy平面上
ax.contourf(X,Y,Z,zdir='z',offset=-1,cmap='rainbow')
ax.set_xlim(-4,4)

plt.show()

2.3 测试结果

13


写在最后

本文章为【莫烦Python】Matplotlib Python 画图教程课程对应的一些课堂笔记,并参考了Matplotlib的开发者文档,仅为各位同志学习参考之用

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值