Python3D可视化|Python 主题月
1. 背景
在分析大型项目的数据时,常见的二维统计图形可能难以满足多维数据直观分析与展示的需求,这时我们可能需要进行3D可视化来更直观地展示多维数据之间的关系。
本次用到的数据来源于某桥梁的监测数据,为具有4个sheet的Excel文件。不同sheet表示不同监测指标,每个sheet中每一列表示不同的观测点,希望联合展示所有观测点数据的均值以便于后续分析。原数据可通过GitHub获取:Python_3d
2. 代码与思路
首先导入Python库
from xlrd import open_workbook
import pandas as pd
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter,FuncFormatter
2.1 绘图设置
绘图之前先设置坐标
# 设置坐标
X = np.arange(0, 16, step=1) # X轴的坐标
Y = np.arange(0, 4, step=1) # Y轴的坐标
Z = np.array(data)
xx, yy = np.meshgrid(X, Y) # 网格化坐标
X, Y = xx.ravel(), yy.ravel() # 矩阵扁平化
bottom = np.zeros_like(X) # 设置柱状图的底端位值
Z = Z.ravel() # 扁平化矩阵
为使数据的显示与坐标格网匹配,故对数据可视化之后的图形大小进行设置
width = height = 1
最后进行三维绘图设置
# 三维绘图设置
fig = plt.figure()
ax = fig.gca(projection='3d') # 三维坐标轴
ax.bar3d(X, Y, bottom, width, height, Z, shade=True)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(mean)')
plt.setp(ax.get_xminorticklabels(), visible=False)
plt.show()
2.2 数据处理
源数据预处理的过程如下,由于不需知道sheet的名称,故可采用动态循环读取sheet的方法,计算每一列数值的平均数并循环存入列表中;再循环将列表赋值给数组,以此得到整个Excel表格不同观测点数值的均值数组。
由于每个sheet的列数可能是不相同的,故对列数较少的列表进行“补0”,以满足矩阵的构成。
FileName = '剔除去噪插值2020.xlsx'
wb = open_workbook(FileName)
sheets = wb.sheet_names()
m = len(sheets)
n = pd.read_excel(FileName, sheet_name=sheets[0]).shape[1] - 1
arr = np.empty((m, n))
# 循环遍历所有sheet
for i in range(len(sheets)):
df = pd.read_excel(FileName, sheet_name=sheets[i])
d = df.mean()
data = []
for j in range(1, len(d)):
data.append(d.iat[j])
le = n
while(len(data) < le):
data.append(0)
arr[i] = data
2.3 绘图
将绘图功能抽象成函数,以array数组为传入参数
# 3D绘图函数
def zzt(data):
# 设置坐标
X = np.arange(0, 16, step=1) # X轴的坐标
Y = np.arange(0, 4, step=1) # Y轴的坐标
Z = np.array(data)
xx, yy = np.meshgrid(X, Y) # 网格化坐标
X, Y = xx.ravel(), yy.ravel() # 矩阵扁平化
bottom = np.zeros_like(X) # 设置柱状图的底端位值
Z = Z.ravel() # 扁平化矩阵
# 每一个柱子的长和宽
width = height = 1
# 三维绘图设置
fig = plt.figure()
ax = fig.gca(projection='3d') # 三维坐标轴
ax.bar3d(X, Y, bottom, width, height, Z, shade=True)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(mean)')
plt.setp(ax.get_xminorticklabels(), visible=False)
plt.show()
调用绘图函数即可得到3D可视化结果
if __name__ == "__main__":
zzt(arr)
源代码可通过GitHub获取:Python_3d
3. 结果展示
运行结果如下,且生成的3D图可以以任意角度观察。

4. 小结与感想
通过Python数据分析与可视化的学习,我对Python语言和数据可视化方法都有了更深的理解。从绘图函数的抽象,原始数据的预处理以及坐标轴等细节的设置,对我来说都是一次很好的学习机会。世间道法万千,学不可以终。今后我将更加精进Python能力,为专业学习以及往后的应用打好基础。
转载自:https://juejin.cn/post/6988516054410461192