Python3D-визуализация|Месяц темы Python

задняя часть Python
Python3D-визуализация|Месяц темы Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

1. Предпосылки

При анализе данных крупномасштабных проектов обычная двухмерная статистическая графика может быть затруднена для удовлетворения потребностей интуитивного анализа и отображения многомерных данных.В настоящее время нам может потребоваться выполнить 3D-визуализацию для более интуитивного отображения отношения между многомерными данными.

Данные, используемые на этот раз, взяты из данных мониторинга моста, которые представляют собой файл Excel с 4 листами. На разных листах представлены разные индикаторы мониторинга, и каждый столбец на каждом листе представляет собой отдельную точку наблюдения Ожидается, что среднее значение данных всех точек наблюдения будет отображаться совместно для последующего анализа. Исходные данные можно получить через 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

Окончательные настройки 3D-чертежа

# 三维绘图设置
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 Обработка данных

Процесс предобработки исходных данных заключается в следующем.Поскольку не обязательно знать имя листа, можно использовать метод динамического чтения листа для вычисления среднего значения в каждом столбце и сохранения его в список в цикле.Таким образом получается массив средних значений для разных точек наблюдения во всей таблице Excel.

Поскольку количество столбцов на каждом листе может быть разным, список с меньшим количеством столбцов «заполняется 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 Рисунок

Абстрагируйте функцию рисования в функцию с массивом массивов в качестве входящего параметра.

# 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, чтобы заложить прочную основу для профессионального обучения и будущих приложений.