Трехмерный график поверхности с помощью matplotlib с использованием столбцов данных для ввода данных - PullRequest
1 голос
/ 20 февраля 2020

У меня есть файл электронной таблицы, который я хотел бы ввести для создания трехмерного графика поверхности с помощью Matplotlib в Python.

Я использовал plot_trisurf, и это сработало, но мне нужны проекции контура профили на график, который я могу получить с помощью функции поверхности, , как в этом примере .

Я изо всех сил пытаюсь расположить мои данные Z в двумерном массиве, который я могу использовать для ввода в plot_surface метод. Я много чего перепробовал, но, похоже, ничего не работает.

Вот то, что я работаю, используя plot_trisurf

import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

import numpy as np
import pandas as pd

df=pd.read_excel ("/Users/carolethais/Desktop/Dissertação Carol/Códigos/Resultados/res_02_0.5.xlsx")

fig = plt.figure()
ax = fig.gca(projection='3d')
# I got the graph using trisurf 
graf=ax.plot_trisurf(df["Diametro"],df["Comprimento"], df["temp_out"], cmap=matplotlib.cm.coolwarm)

ax.set_xlim(0, 0.5)
ax.set_ylim(0, 100)
ax.set_zlim(25,40)
fig.colorbar(graf, shrink=0.5, aspect=15)
ax.set_xlabel('Diâmetro (m)')
ax.set_ylabel('Comprimento (m)')
ax.set_zlabel('Temperatura de Saída (ºC)')

plt.show()

enter image description here

Это часть моего df, dataframe:

       Diametro  Comprimento   temp_out
0      0.334294     0.787092  34.801994
1      0.334294     8.187065  32.465551
2      0.334294    26.155976  29.206090
3      0.334294    43.648591  27.792126
4      0.334294    60.768219  27.163233
...         ...          ...        ...
59995  0.437266    14.113660  31.947302
59996  0.437266    25.208851  30.317583
59997  0.437266    33.823035  29.405461
59998  0.437266    57.724209  27.891616
59999  0.437266    62.455890  27.709298

Я пытался этот подход , чтобы использовать импортированные данные с plot_surface, но я получил действительно график, но он не работал, вот как граф выглядел при таком подходе: enter image description here Большое вам спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Другой подход, основанный на перегруппировке данных, который не требует указания исходных данных на регулярной сетке [глубоко вдохновленный этим примером ; -].

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as tri
from mpl_toolkits.mplot3d import Axes3D

np.random.seed(19880808)

# compute the sombrero over a cloud of random points
npts = 10000
x, y = np.random.uniform(-5, 5, npts), np.random.uniform(-5, 5, npts)
z = np.cos(1.5*np.sqrt(x*x + y*y))/(1+0.33*(x*x+y*y))

# prepare the interpolator
triang = tri.Triangulation(x, y)
interpolator = tri.LinearTriInterpolator(triang, z)

# do the interpolation
xi = yi = np.linspace(-5, 5, 101)
Xi, Yi = np.meshgrid(xi, yi)
Zi = interpolator(Xi, Yi)

# plotting
fig = plt.figure()
ax = fig.gca(projection='3d')
norm = plt.Normalize(-1,1)
ax.plot_surface(Xi, Yi, Zi,
                cmap='inferno',
                norm=plt.Normalize(-1,1))
plt.show()

enter image description here

1 голос
/ 21 февраля 2020

plot_trisurf ожидает x, y, z как одномерные массивы, а plot_surface ожидает X, Y, Z как двухмерные массивы или как x, y, Z с x, y как одномерный массив и Z как двумерный массив.

Ваши данные состоят из 3-х мерных массивов, поэтому их нанесение с помощью plot_trisurf выполняется незамедлительно, но вам нужно использовать plot_surface, чтобы можно было проецировать изолинии на координатные плоскости ... Вам необходимо изменить данные.

Кажется, что у вас есть 60000 точек данных, в следующем я предполагаю, что у вас есть регулярная сетка 300 точек в направлении x и 200 точек в y - но важна идея правильной сетки .

Приведенный ниже код показывает

  1. использование plot_trisurf (с более грубым значением sh), аналогичное вашему коду;
  2. правильное использование изменения формы и ее применения в plot_surface;
    обратите внимание, что количество строк в изменении формы соответствует количеству точек в y, а количество столбцов - количеству точек в x;
  3. и 4 неправильное использование изменения формы, получающиеся в результате Возможно, вам просто нужно исправить количество строк и столбцов.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x, y = np.arange(30)/3.-5, np.arange(20)/2.-5
x, y = (arr.flatten() for arr in np.meshgrid(x, y))
z = np.cos(1.5*np.sqrt(x*x + y*y))/(1+0.1*(x*x+y*y))

fig, axes = plt.subplots(2, 2, subplot_kw={"projection" : "3d"})
axes = iter(axes.flatten())

ax = next(axes)
ax.plot_trisurf(x,y,z, cmap='Reds')
ax.set_title('Trisurf')

X, Y, Z = (arr.reshape(20,30) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 20×30')

X, Y, Z = (arr.reshape(30,20) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 30×20')

X, Y, Z = (arr.reshape(40,15) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 40×15')

plt.tight_layout()
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...