python绘制3D图形,依赖模块matplotlib,但需要安装mpl_toolkits工具包,调用mplot3d类进行3D图形的绘制,mpl_toolkits是mataplotlib里面的工具包
pip install --upgrade matplotlib
# windows系统需进入到python安装目录下的Scripts文件夹下执行
绘制曲面图使用的是plot_surface()方法,这个方法的参数相对而言更简单。且X、Y、Z三者的顺序相对较为容易分辨。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
def three_dimension_curved_surface():
plt.rcParams['axes.facecolor'] = '#cc00ff'
fig = plt.figure(figsize=(10, 8), facecolor='#cc00ff')
ax = Axes3D(fig)
delta = 0.125 # 步长
# 生成代表X轴数据的列表
x = np.arange(-4.0, 4.0, delta)
print(x)
# 生成代表Y轴数据的列表
y = np.arange(-3.0, 4.0, delta)
print(x)
# 对x、y数据执行网格化
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 计算Z轴数据(高度数据)
Z = (Z1 - Z2) * 2
# 绘制3D图形
ax.plot_surface(X, Y, Z,
rstride=1, # rstride(row)指定行的跨度
cstride=1, # cstride(column)指定列的跨度
cmap=plt.get_cmap('rainbow')) # 设置颜色映射
plt.xlabel('X轴', fontsize=15)
plt.ylabel('Y轴', fontsize=15)
ax.set_zlabel('Z轴', fontsize=15)
ax.set_title('three_dimension_curved_surface', y=1.02, fontsize=25, color='gold')
# 设置Z轴范围
ax.set_zlim(-2, 2)
plt.savefig("three_dimension_curved_surface.jpg")
plt.show()
three_dimension_curved_surface()
绘制3D柱状图使用的是bar()方法。在调用相关方法的时候,比如设置轴标签时,left对应的是y轴,zs对应的是x轴。使用plt.xticks()方法,操作的是zs;plt.yticks()方法操作的是left轴;height对应着z轴。
bar(left, height, zs=0, zdir=‘z’, *args, **kwargs)
"""
left表示指向侧边的轴,
zs表示指向我们的方向的轴,
height即表示高度的轴。
这三者都需要是一维的序列对象。
"""
def example_bar():
# 创建画布
fig = plt.figure()
# 创建3D坐标系
axes3d = Axes3D(fig)
# x,y = np.random.rand(2, 10) * 4
x = [3.66321043, 1.29017557, 2.84006691, 3.96170737, 3.57874492, 0.32759713, 3.90725404, 0.94591511, 0.17395628, 3.28341506]
y = [3.66321043, 1.29017557, 2.84006691, 3.96170737, 3.57874492, 0.32759713, 3.90725404, 0.94591511, 0.17395628, 3.28341506]
z = [0, 0, 0, 0, 2, 0, 0, 0, 0, 0]
hist, xedges ,yedges = np.histogram2d(x, y, bins=4,range=[[0,4],[0,4]])
print(hist, xedges ,yedges)
xpos,ypos = np.meshgrid(xedges[:-1] + 0.5,yedges[:-1]+0.15)
xpos = xpos.flatten('F')
ypos = ypos.flatten('F')
zpos = np.zeros_like(xpos)
# print(xpos, ypos, zpos)
dx =0.5 * np.ones_like(zpos)
dy = dx.copy()
dz =hist.flatten()
print(dx, dy, dz)
axes3d.bar3d(
xpos,
ypos,
zpos,
dx,
dy,
dz,
zsort='average')
plt.xlabel('xlabel----zs')
plt.ylabel('ylabel----left')
axes3d.set_zlabel('zlabel----height')
plt.savefig("example_bar.jpg")
plt.show()