阅读 2259
Python3D可视化|Python 主题月

Python3D可视化|Python 主题月

本文正在参加「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能力,为专业学习以及往后的应用打好基础。

文章分类
后端
文章标签