Python matplotlib 绘制三维图并修改样式
作者:互联网
问题描述
通过Python matplotlib绘制三维函数图,函数内容如下:
为了简化表达,对测试函数的维度做降维表达,从100维降到2维,这样就可以通过三维函数来表达了。样式上需要满足以下要求:
- 数轴可以显示中文字体;
- 数轴上的刻度可以显示负数;
- 数轴上的trik和label需要改为 time new Roman;
- 设置数轴的粗细;
- 绘制三维函数,并赋值颜色;
- 绘制函数的三维投影面;
编码
Ackley
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
X_BOUND = [-5, 5]
Y_BOUND = [-5, 5]
def F(x, y):
return -20 * np.exp(-0.2 * np.sqrt(0.5 * (x**2 + y**2))) - (np.exp(0.5 * (np.cos(2 * np.pi * x) + np.cos(2 * np.pi * y)))) + np.e + 20
#绘制3D图形
#def plot_3d(ax):\
ax = plt.axes(projection='3d')
X = np.linspace(*X_BOUND, 100)#等差数列
Y = np.linspace(*Y_BOUND, 100)
X, Y = np.meshgrid(X, Y)#坐标矩阵,每个交叉点对应网格
Z = F(X, Y)
# 绘制3D图形,X,Y,Z:2D数组形式的数据值
#rstride:数组行距(步长大小)
#cstride:数组列距(步长大小)
#cmap:曲面块颜色映射
#color:曲面块颜色
font2 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 14,
}
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
ax.set_zlim(-5, 20)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z',font2)
ax.set_title('Ackley',font2)
#plt.yticks(fontproperties='Times New Roman', size=14)
#plt.xticks(fontproperties='Times New Roman', size=14)
# 设置横纵坐标的名称以及对应字体格式
#
plt.xlabel('x1', font2)
plt.ylabel('x2', font2)
ax.contourf(X, Y, Z, zdir='z',offset=-5)
plt.savefig('./Ackley.jpg',dpi=150)
plt.show()
if __name__ == "__main__":
#绘制函数三维图像
fig = plt.figure()
ax = Axes3D(fig)
#plot_3d(ax)
Griewank
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
X_BOUND = [-5, 5]
Y_BOUND = [-5, 5]
def F(x, y):
return 2 * 10 + x ** 2 - 10 * np.cos(2 * np.pi * x) + y ** 2 - 10 * np.cos(2 * np.pi * y)
#绘制3D图形
#def plot_3d(ax):
ax = plt.axes(projection='3d')
X = np.linspace(*X_BOUND, 100)#等差数列
Y = np.linspace(*Y_BOUND, 100)
X, Y = np.meshgrid(X, Y)#坐标矩阵,每个交叉点对应网格
Z = F(X, Y)
# 绘制3D图形,X,Y,Z:2D数组形式的数据值
#rstride:数组行距(步长大小)
#cstride:数组列距(步长大小)
#cmap:曲面块颜色映射
#color:曲面块颜色
font2 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 14,
}
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
ax.set_zlim(0, 90)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z',font2)
ax.set_title('Griewank',font2)
#plt.yticks(fontproperties='Times New Roman', size=14)
#plt.xticks(fontproperties='Times New Roman', size=14)
# 设置横纵坐标的名称以及对应字体格式
plt.xlabel('x1', font2)
plt.ylabel('x2', font2)
ax.contourf(X, Y, Z, zdir='z',offset=-5)
plt.savefig('./Griewank.jpg',dpi=150)
plt.show()
if __name__ == "__main__":
#绘制函数三维图像
fig = plt.figure()
ax = Axes3D(fig)
#plot_3d(ax)
Schwefe
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
X_BOUND = [-500, 500]
Y_BOUND = [-500, 500]
def F(x, y):
return 418.9829*2 -(x*np.sin(np.sqrt(np.abs(x)))+y*np.sin(np.sqrt(np.abs(y))))
# 绘制3D图形
#def plot_3d(ax):
ax = plt.axes(projection='3d')
X = np.linspace(*X_BOUND, 100) # 等差数列
Y = np.linspace(*Y_BOUND, 100)
X, Y = np.meshgrid(X, Y) # 坐标矩阵,每个交叉点对应网格
Z = F(X, Y)
# 绘制3D图形,X,Y,Z:2D数组形式的数据值
# rstride:数组行距(步长大小)
# cstride:数组列距(步长大小)
# cmap:曲面块颜色映射
# color:曲面块颜色
font2 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 14,
}
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
ax.set_zlim(0, 1800)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z', font2)
ax.set_title('Schwefel',font2)
#plt.yticks(fontproperties='Times New Roman', size=14)
#plt.xticks(fontproperties='Times New Roman', size=14)
# 设置横纵坐标的名称以及对应字体格式
plt.xlabel('x1', font2)
plt.ylabel('x2', font2)
ax.contourf(X, Y, Z, zdir='z', offset=-5)
plt.savefig('./Schwefel.jpg',dpi=150)
plt.show()
if __name__ == "__main__":
# 绘制函数三维图像
fig = plt.figure()
ax = Axes3D(fig)
#plot_3d(ax)
绘图结果
标签:__,plt,Python,font2,matplotlib,三维图,set,np,ax 来源: https://blog.csdn.net/zhouxinxin111/article/details/113791612