Уведомления

Группа в Telegram: присоединиться

#1 Июнь 2, 2010 20:55:26

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

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

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

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

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

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

Обновление.
Возникает вопрос, как с помощью Python построить 3d surface по данным из текстового файла, 3d график(вместо plot_surface используется plot) строится, а поверхность нет, как строить поверхность по данным из текстового файла? Вот конкретно проблемная часть кода:

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')
plt.savefig('grafik\T0_3D.png', dpi=80)
Весь код на всякий случай:
#!/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 = 'grafik\gr3D.txt'
data_out3D = open(datafile3D, 'a')
datafile2D = 'grafik\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')
plt.savefig('grafik\T0_3D.png', dpi=80)

fig = plt.figure(2)
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.savefig('grafik\T0_2D.png', dpi=80)

fig = plt.figure(3)
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)
plt.savefig('grafik\T1_2D.png', dpi=80)


fig = plt.figure(4)
ax = Axes3D(fig)
ax.plot3D(X, Y, V1, label='T1')
plt.savefig('grafik\T1_3D.png', dpi=80)
Подскажите, если не сложно.
P.S. Почему на форуме при постинге сообщений нет кнопок BB-code, каждый раз теги вручную вводить приходится.



Отредактировано (Июнь 7, 2010 15:34:01)

Офлайн

#2 Июнь 2, 2010 21:28:04

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Ты себе даже представить не можешь насколько это просто, нужно лишь попробовать взяться.



Офлайн

#3 Июнь 2, 2010 21:34:47

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Уже понял, сам нарвался на курс Python для науных вычислений и нашел ответ на свой вопрос)



Офлайн

#4 Июнь 2, 2010 21:50:27

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Я вообще для таких вот задач использую gnuplot.
Зачем изобретать велосипед…?



Офлайн

#5 Июнь 2, 2010 21:52:45

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Я новичек))) gnuplot входит в стандартную установку python 2.6?



Офлайн

#6 Июнь 2, 2010 22:00:31

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

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

AleksSR
gnuplot входит в стандартную установку python 2.6?
Честно говоря он не имеет к питону отношения:
http://ru.wikipedia.org/wiki/Gnuplot
http://www.gnuplot.info/
Но задачу подобную этой решит на раз. Разве что нужно именно в питоне… Т е важен инструмент и процесс, а не результат.



Офлайн

#7 Июнь 3, 2010 10:53:51

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

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

Одна их самых простых библиотек для 3d это vpython.
Вот здесь немного обсуждали http://python.su/forum/viewtopic.php?pid=23663#p23663



Офлайн

#8 Июнь 3, 2010 12:11:27

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Возникла проблемка - читаются не все данные из dat файла, читается примерно 300 строк, всего в файле с данными 40401 строка. Вот код:

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


from numpy import *

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



Офлайн

#9 Июнь 3, 2010 12:23:38

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Попробуйте вот так, для начала:

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

from numpy import *

# Not used variable
data = []

for line in open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r'):
coords = line.split()
ksi_x = float(coords[0])
ksi_y = float(coords[1])
N = float(coords[2])
print ksi_x



Отредактировано (Июнь 3, 2010 12:24:19)

Офлайн

#10 Июнь 3, 2010 12:28:03

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Alex2ndr, попробовал, не помогло, эффект тот же.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version