Python绘制三维立体图详解与绘图填充方式

  目录

  利用Python绘制三维图

  目标:

  绘制图像 z^2 = x^2 + y^2 + x/3 + y/3

  1.第一步我们先导入画图所需要的包

  import matplotlib.pyplot as plt

  import numpy as np

  from mpl_toolkits.mplot3d import Axes3D # 用于绘制3D图案

  2.画曲面的第一步是就是

  要创建一个二维平面的网格,我们先创建这个二维平面的x轴和y轴,范围在-1到1之间分为100份

  x = np.linspace(-1,1,100)

  y = np.linspace(-1,1,100)

  再调用numpy中的meshgrid函数,进行网格化操作

  x_,y_ = np.meshgrid(x,y,indexing='ij')

  3.绘制图形

  显示的函数为:

  z_ = x_**2 + y_**2 + x_ / 3 + y_ / 3

  4.完整代码

  import matplotlib.pyplot as plt

  import numpy as np

  from mpl_toolkits.mplot3d import Axes3D #绘制3D图案

  x = np.linspace(-1,1,100)

  y = np.linspace(-1,1,100)

  x_, y_ = np.meshgrid(x,y,indexing='ij')

  z_ = x_**2 + y_**2 + x_ / 3 + y_ / 3 # 画图所要表现出来的主函数

  fig = plt.figure(figsize=(10, 10), facecolor='white') #创建图片

  sub = fig.add_subplot(111, projection='3d')# 添加子图,

  surf = sub.plot_surface(x_, y_, z_, cmap=plt.cm.brg) #绘制曲面,cmap=plt.cm.brg并设置颜色cmap

  cb = fig.colorbar(surf, shrink=0.8, aspect=15) #设置颜色棒

  sub.set_xlabel(r"x axis")

  sub.set_ylabel(r"y axis")

  sub.set_zlabel(r"z axis")

  plt.show()

  运行结果如下:

  外例

  import numpy as np

  import matplotlib.pyplot as plt

  fig,ax = plt.subplots()

  #配置中文显示

  plt.rcParams['font.family'] = ['SimHei'] #用来显示中文标签

  plt.rcParams['axes.unicode_minus'] = False #用来正常显示符号

  def f(t):

  return np.cos(2*np.pi*t)

  x1 = np.arange(0.0,4.0,0.5) # 画出定点图

  x2 = np.arange(0.0,4.0,0.01)

  plt.figure(1)

  plt.subplot(1,2,1)

  plt.plot(x1,f(x1),'bo',x2,f(x2),'k')

  plt.title('子图1')

  plt.subplot(1,2,2)

  plt.plot(x2,f(x2),'r--')

  plt.title('子图2')

  plt.show()

  import matplotlib.pyplot as plt

  import numpy as np

  import matplotlib.cm as cm#matplotlib内置的颜色地图

  from mpl_toolkits.mplot3d import Axes3D#引入3d绘图模块

  X = np.arange(-8, 8, 0.25)

  Y = np.arange(-8, 8, 0.25)

  X, Y = np.meshgrid(X, Y)#生成网格点矩阵,就是对X,Y进行网格化

  R = np.sqrt(X**2 + Y**2 + X + Y)#X**2代表X的二次方

  Z = np.sin(R)

  fig = plt.figure()#Figure(640x480) 生成画布

  ax = Axes3D(fig)#和上一步一起构建一个3d画布

  ax.plot_surface(X, Y, Z, rstride=1#行跨(x)为1

  , cstride=1 #列跨(y)为1

  , cmap=cm.viridis #设置颜色

  )#构造3D图像

  ax.contourf(X,Y,Z,#传入数据

  zdir='z'#设置为z轴为等高线的不变轴

  ,offset=-1#映射位置在z=-1处

  ,cmap=plt.get_cmap('rainbow')#设置颜色为彩虹色

  )#绘制图像的映射,就是等高线图。

  plt.xlabel('x_axis')

  plt.ylabel('y_axis')

  plt.show()

  import matplotlib.pyplot as plt#引入matplotlib的pyplot模块

  import numpy as np

  a=np.arange(0.0,5.0,0.01)#构造一个0起始,5结束,0.01为间隔的numpy数组

  b=5*np.cos(a*np.pi*2)#其中的np.pi是圆周率

  plt.plot(a,b,'r-',label='first')#将a作为x轴,b作为y轴,ro-中的r代表红色,0代表实心点标识,-代表实线,构造一条名为first的曲线。

  #plt.xlabel('x_axis')

  plt.xlabel('时间',fontproperties='SimHei',fontsize=20)#如果名字中有中文的话一定要用fontproperties='SimHei属性,否则会报错

  #plt.ylabel('y_axis')

  plt.title('正弦波',fontproperties='SimHei',fontsize=20)#设置标题

  plt.xlim((0,5))

  plt.ylim((-5,5))

  plt.legend(loc='lower right')#注释的位置

  plt.grid(True)#添加网格,flase就是不添加

  plt.show()#如果先show,之后保存的就是一张空白的图

  绘图的填充

  调用函数fill_between()实现曲线下面部分的填充

  import numpy as np

  import matplotlib.pyplot as plt

  x = np.linspace(0,1,500)

  y = np.sin(3*np.pi*x)*np.exp(-4*x)

  fig,ax = plt.subplots()

  plt.plot(x,y)

  plt.fill_between(x,0,y,facecolor = 'green',alpha = 0.3)

  # plt.fill_between(x[15:300],0,0.4,facecolor = 'green',alpha = 0.3)

  # 调整参数可在部分区间内填充

  plt.show()

  两条曲线之间的区域填充

  import numpy as np

  import matplotlib.pyplot as plt

  import numpy as np

  import matplotlib.pyplot as plt

  x = np.linspace(0,1,500)

  y1 = np.sin(3*np.pi*x)*np.exp(-4*x) + x

  y2 = y1 + 0.2

  plt.plot(x,y1,'b')

  plt.plot(x,y2,'r')

  plt.fill_between(x,y1,y2,facecolor = 'green',alpha = 0.5)

  plt.show()

  直接使用fill进行绘图的填充

  import numpy as np

  import matplotlib.pyplot as plt

  x = np.linspace(0,1,500)

  y = np.sin(3*np.pi*x)*np.exp(-4*x) + 2*x

  fig,ax = plt.subplots()

  ax.fill(x,y)

  plt.show()

  总结

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

  您可能感兴趣的文章: