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