2013-10-08 4 views
1

Что нужно изменить или добавить в любой из примеров here и here, чтобы создать 3D-поверхность из следующих данных?Как построить 3D-поверхности в Python

[100, 0, 'TF', 0] 
[100, 0, 'DF', 0] 
[100, 50, 'TF', 0] 
[100, 50, 'DF', 0] 
[100, 100, 'TF', 0] 
[100, 100, 'DF', 0] 
[100, 150, 'TF', 0.84496124031007758] 
[100, 150, 'DF', 0.87209302325581395] 
[100, 200, 'TF', 0.88139534883720927] 
[100, 200, 'DF', 0.86201550387596892] 
[100, 250, 'TF', 0.87441860465116272] 
[100, 250, 'DF', 0.889922480620155] 
[100, 300, 'TF', 0.87984496124031009] 
[100, 300, 'DF', 0.89922480620155043] 
[100, 350, 'TF', 0.92015503875968996] 
[100, 350, 'DF', 0.90697674418604657] 

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

+0

Я тонка relavent линия в первом примере, '' 'ax.plot_surface (X, Y, Z, rstride = 1, cstride = 1, cmap = cm.YlGnBu_r) '' '. Вам нужно извлечь данные из x, y и z из ваших списков и использовать эти данные в качестве аргументов X, Y и Z для этой функции. Довольно уверен, что это могут быть списки, а также массивы numpy. – wwii

+0

'plot_surface()' требует, чтобы ваши данные X, Y и Z были регулярно решены в 2D-массивах, например, вы получили бы от 'np.meshgrid()'. Не совсем ясно, как структурированы ваши данные (что такое '' TF'' и '' DF''?), Но похоже, что он не чередуется с сеткой. Вы можете попробовать 'plot_trisurf()', который будет принимать нерегулярные данные X, Y, Z в виде 1D массивов - [см. Мой ответ здесь] (http://stackoverflow.com/questions/17367558/plot-a-3d -поверхности-из-хуга-рассеяния-данных-в-питона? RQ = 1). –

+0

Очевидно, что 3 столбца следует удалить (я не буду углубляться в это). Я уже пробовал вещи, о которых вы говорили, но, как я уже сказал, всегда что-то не хватает. Не могли бы вы дать код для этого? – user2295350

ответ

0

Итак, ваши данные на самом деле не 3D, так как все значения x одинаковы, но вот как я отредактировал приведенный вами пример. По какой-то причине X хочет быть списком списков. Может, кто-то знает почему. enter image description here

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

#step = 0.04 
#maxval = 1.0 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

# create supporting points in polar coordinates 
#r = np.linspace(0,1.25,50) 
#p = np.linspace(0,2*np.pi,50) 
#R,P = np.meshgrid(r,p) 
# transform them to cartesian system 
#X,Y = R*np.cos(P),R*np.sin(P) 

X=[] 
for i in range(0,16): 
    X.append([]) 
    X[i].append(100) 
print(X) 

Y=[] 
for i in range(0,8): 
    Y.append(50*i) 
    Y.append(50*i) 
print(Y) 

Z=[] 
Z.append(0) 
Z.append(0) 
Z.append(0) 
Z.append(0) 
Z.append(0) 
Z.append(0) 
Z.append(0.84496124031007758) 
Z.append(0.87209302325581395) 
Z.append(0.88139534883720927) 
Z.append(0.86201550387596892) 
Z.append(0.87441860465116272) 
Z.append(0.889922480620155) 
Z.append(0.87984496124031009) 
Z.append(0.89922480620155043) 
Z.append(0.92015503875968996) 
Z.append(0.90697674418604657) 
print(Z) 


#Z = ((R**2 - 1)**2) 
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r) 
ax.set_zlim3d(0, 1) 
ax.set_xlabel(r'xlabel') 
ax.set_ylabel(r'ylabel') 
ax.set_zlabel(r'zlabel') 
plt.show() 
0

Небольшое изменение в рентгеновских данных даст вам поверхность:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib 
import numpy as np 
from matplotlib import cm 
from matplotlib import pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

data = [[100, 0, 'TF', 0], 
     [100, 0, 'DF', 0], 
     [100, 50, 'TF', 0], 
     [100, 50, 'DF', 0], 
     [100, 100, 'TF', 0], 
     [100, 100, 'DF', 0], 
     [100, 150, 'TF', 0.84496124031007758], 
     [100, 150, 'DF', 0.87209302325581395], 
     [100, 200, 'TF', 0.88139534883720927], 
     [100, 200, 'DF', 0.86201550387596892], 
     [100, 250, 'TF', 0.87441860465116272], 
     [100, 250, 'DF', 0.889922480620155], 
     [100, 300, 'TF', 0.87984496124031009], 
     [100, 300, 'DF', 0.89922480620155043], 
     [100, 350, 'TF', 0.92015503875968996], 
     [100, 350, 'DF', 0.90697674418604657] 
     ] 
x = [item[0] for item in data] 
# change x here 
x = np.linspace(0, 100, num = 16) 
y = [item[1] for item in data] 
z = [item[3] for item in data] 

X, Y = np.meshgrid(x, y) 
_z, Z = np.meshgrid(x, z) 

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r) 
ax.set_zlim3d(0, 1) 
ax.set_xlabel(r'xlabel') 
ax.set_ylabel(r'ylabel') 
ax.set_zlabel(r'zlabel') 
plt.show() 
plt.close() 

enter image description here

+0

Привет, спасибо за ваш ответ, но у меня есть некоторые сомнения относительно изменения значений оси x? Зачем мне это делать? По-видимому, набор данных выше - всего лишь образец, поскольку реальный будет намного больше. Кроме того, я не хочу посредничества пользователей вообще! сценарий должен запускаться для любого набора данных. Итак, как мне улучшить скрипт? – user2295350

+0

Как упоминал в своем ответе @andy mcevoy, все ваши значения по оси x одинаковы, поэтому график будет строкой - по крайней мере, для данных, которые вы опубликовали. Наверное, я просто пытался проиллюстрировать, что значения х должны меняться, чтобы график выглядел как поверхность (3-й). Вы можете использовать код для любого 3-d набора данных, но график будет выглядеть только как данные. – wwii

 Смежные вопросы

  • Нет связанных вопросов^_^