Данные для 3-х мерного графика

 
0
 
Python
ava
AleksNR | 02.06.2010, 22:07
Добрый вечер! Подскажите пожалуйста новичку, как построить 3-х мерный график с помощью python. Нужен график, данные для которого содержатся в файле вида:

значениеX1 значениеY1 значениеZ1
значениеX2 значениеY2 значениеZ2
......................................................
значениеXn значениеYn значениеZn

Значения друг от друга отделяются пробелом, следующие значения переменных на новой строке, нужно построить поверхность Z = f(X,Y).

Как извлечь эти данные для построения графика?

Спасибо за помощь!
Kommentare (3)
ava
AleksNR | 03.06.2010, 14:01 #
Как данные извлекать для графика понял, возникла другая проблема. Файл данных .dat содержит40401 строку. Данные же начинают считываться со 105-й строки, а заканчивают считываться на 402-й.

#!/usr/bin/env python
# -*- coding: cp1251 -*-

import math as m
from numpy import *
from scipy.special import erf

math = m

infile = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = infile.readlines()
infile.close()
data = []

for line in lines:
coords = line.split(' ')
ksi_x = float(coords[0])
ksi_y = float(coords[1])
N = float(coords[2])
print ksi_x
ava
shupg | 03.06.2010, 16:16 #
Привет!
Попробуй, может так чего поймаешь..


FILENAME = r'C:\Program Files\Golden Software\Surfer8\out.dat'

infile = open(FILENAME)

data = []
while True:
try:
coords = [float(coord) for coord in infile.readline().strip().split(' ')]
data.append(coords)
print coords[0]
except Exception, e:
print 'LINE%s: An error occured: %s' % (len(data) + 1, e)
break

infile.close()

ava
AleksNR | 07.06.2010, 14:24 #
Предыдущая проблема легко решилась. В данный момент возникла проблема построения 3d поверхности plot_surface. 3-х мерный график plot построить могу, но он отображается одним цветом и на нем сетки нет, хочу построить plot_surface, а также изолинии. Суть проблемы в том, что я извлекаю данные для построения графиков из созданных текстовых файлов, в примера построения поверхностей я видел построение сетки и указание аналитической зависимости Z = f(X, Y), вот например:

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

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)

plt.show()



Вот мой код:


#!/usr/bin/env python
# -*- coding: cp1251 -*-

import math as m
import numpy as np
from numpy import *
from scipy.special import erf
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

math = m
materials = 2
if materials == 1:
comb = "Ti-6Al-4V SiC Al"
k1 = 1.2095
k2 = 183.8
k3 = 235
rho1 = 4429
rho2 = 3210
rho3 = 2700
c1 = 625.30
c2 = 750
c3 = 235
elif materials == 2:
comb = "SiC Ti-6Al-4V Al"
k1 = 183.8
k2 = 1.2095
k3 = 235
rho1 = 3210
rho2 = 4429
rho3 = 2700
c1 = 750
c2 = 625.30
c3 = 235

r1 = 0.3
r2 = 0.33
l = 1
s1 = pi*r1**2
s2 = pi*r2**2 - s1
s3 = l**2 - (s1 + s2)
rho_c = rho1*c1*s1/l**2 + rho2*c2*s2/l**2 + rho3*c3*s3/l**2
rho_c = float(rho_c)


l_razm = 0.2
G_razm = 2
count_l = int(G_razm/l_razm)



T0 = 300
T1 = 900
t = 1500


k_eff_chisl = 123.712
k_eff_teor = 124.023
chi = k_eff_chisl/rho_c


data_in = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = data_in.readlines()
data_in.close()
datafile3D = 'C:\Program Files\Golden Software\Surfer8\gr3D.txt'
data_out3D = open(datafile3D, 'a')
datafile2D = 'C:\Program Files\Golden Software\Surfer8\gr2D.txt'
data_out2D = open(datafile2D, 'a')
i = 0
for c in range(0, count_l):
for line in lines:
coords = line.split()
coordsx = float(coords[0])*l_razm + i*l_razm
coordsy = float(coords[1])*l_razm
coordsN = float(coords[2]) + 0.5
V0 = T1 - (T1 - T0)*erf(coordsx/(2*sqrt(chi*t)))
V1 = coordsN*(T0 - T1)*exp(-coordsx**2/(4*chi*t))/(sqrt(pi*chi*t))
T = float(V0 + V1*l_razm)
kp = str(coordsx) + " " + str(coordsy) + " " + str(coordsN) + " " + str(V0) + " " + str(V1) + " " + str(T) + "\n"
data_out3D.writelines(kp)
i += 1

k = 0
for c in range(0, count_l):
for line in lines[20100 : 20301]:
coords = line.split()
coordsx = float(coords[0])*l_razm + k*l_razm
coordsN = float(coords[2]) + 0.5
V0 = T1 - (T1 - T0)*erf(coordsx/(2*sqrt(chi*t)))
V1 = coordsN*(T0 - T1)*exp(-coordsx**2/(4*chi*t))/(sqrt(pi*chi*t))
T = float(V0 + V1*l_razm)
kp = str(coordsx) + " " + str(coordsN) + " " + str(V0) + " " + str(V1) + " " + str(T) + "\n"
data_out2D.writelines(kp)
k +=1


X, Y, V0, V1, T = np.loadtxt(datafile3D, usecols=[0,1,3,4,5], unpack=True)
X_2D, V0_2D, V1_2D, T_2D = np.loadtxt(datafile2D, usecols=[0,2,3,4], unpack=True)
fig = plt.figure(1)
ax = Axes3D(fig)
ax.plot3D(X, Y, V0, label='V0')

fig = plt.figure(2)
plt.subplot(211)
plt.plot(X_2D, V0_2D, label='V0')
plt.xlabel('X')
plt.ylabel('T0, K')
plt.title('Zero correction to the temperature depending on the coordinates X')
plt.xlim(0,2)
plt.ylim(300,900)
plt.grid(True)

plt.subplot(212)
plt.plot(X_2D, V1_2D, label='V1')
plt.xlabel('X')
plt.ylabel('T1, K')
plt.title('First correction to the temperature depending on the coordinates X')
plt.xlim(0,2)
plt.ylim(-300,300)
plt.grid(True)



fig = plt.figure(3)
ax = Axes3D(fig)
ax.plot3D(X, Y, V1, label='T1')






plt.show()

Смотреть строки 99 - 103 проблема в них, на всякий случай выложил полный код.
Если не затруднит, помогите решить проблему, очень нужны красивые 3d поверхности для диплома.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  shupg   AleksNR
advanced
Absenden