Добро пожаловать в stackoverflow, ваш вопрос можно разделить на несколько этапов:
Шаг 1 - чтение данных
Я сохранил ваши данные в файле с именем data.txt
.
Я не очень хорошо знаю Панд, но это также можно сделать с помощью простой функции Numpy под названием loadtxt
.Ваши данные немного проблематичны из-за значения текста «Расстояние» в первом столбце и первой строке.Но не паникуйте, мы загружаем файл в виде матрицы строк:
raw_data = np.loadtxt('data.txt', delimiter=';', dtype=np.string_)
Шаг 2 - преобразование необработанных данных
Чтобы извлечь нужные данные из необработанных данных, мы можем сделатьследующее:
angle = raw_data[0 , 1:].astype(float)
distance = raw_data[1:, 0 ].astype(float)
data = raw_data[1:, 1:].astype(float)
При индексации необработанных данных мы выбираем нужные данные, а при astype
мы меняем строковые значения на числа.
Промежуточный шаг - сделать данные немного интереснее
Ваши данные были немного скучными, только значение -45, я позволил себе сделать их немного интереснее:
data = (50 + angle[np.newaxis,:]) / (10 + np.sqrt(distance[:,np.newaxis]))
Шаг 4 - создание каркасного графика
Пример на matplotlib.org выглядит достаточно просто:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z)
plt.show()
Но хитрость заключается в том, чтобы получить X, Y, Z
параметры вправо ...
Шаг 3 - сделать данные X
и Y
Данные Z
- это просто наши data
значения:
Z = data
X
и Y
также должны быть двумерными массивами, так что plot_wireframe
может найти x и y для каждого значения Z
в двумерных массивах X
и Y
на одном и том же массиве.лучевые локации.Существует функция Numpy для создания этих двухмерных массивов:
X, Y = np.meshgrid(angle, distance)
Шаг 5 - немного увеличить его
ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')
Собрать все вместе
Все шаги вместе вправильный порядок:
# necessary includes...
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
raw_data = np.loadtxt('data.txt', delimiter=';', dtype=np.string_)
angle = raw_data[0 , 1:].astype(float)
distance = raw_data[1:, 0 ].astype(float)
data = raw_data[1:, 1:].astype(float)
# make the example data a bit more interesting...
data = (50 + angle[np.newaxis,:]) / (10 + np.sqrt(distance[:,np.newaxis]))
# setting up the plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# the trickey part creating the data that plot_wireframe wants
Z = data
X, Y = np.meshgrid(angle, distance)
ax.plot_wireframe(X, Y, Z)
# fancing it up a bit
ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')
# and showing the plot ...
plt.show()