2014-10-08 17 views
1

B.Sc. 논문 유체 주입 우물 주위의 공극 압력 및 응력 분포를 조사해야합니다. Spyder를 사용하여이 부분을 해결하려고 노력합니다. Spyder는 코딩 경험이 거의 없기 때문에 나에게 가장 적합한 인터페이스 인 것 같습니다.컬러 바는 파이썬에서 단 하나의 색상만을 보여줍니다.

필자는 가장 중요한 파이썬 및 matplotlib 문서를 통해 작업했지만 문제는 해결할 수 없습니다.

먼저 여기 내 코드는 지금까지의 :

# -*- coding: utf-8 -*- 
""" 
Created on Wed Oct 01 10:26:29 2014 

@author: Alexander 
""" 

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

q = 6.0/1000          
rhof = 1000          
lameu = 11.2*10**9        
lame = 8.4*10**9        
pi            
alpha = 0.8          
G = 8.4*10**9         
k = 4*10**(-14)         
eta = 0.001             
t = 10*365*24*3600        

kappa = k/eta         
print "kappa ist:",kappa           
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G))) 
print "c ist:",c             

xmin = -10 
xmax = 10 
ymin = -10 
ymax = 10 

X = np.arange(xmin,xmax,0.5) 
Y = np.arange(ymin,ymax,0.5) 
x, y = np.meshgrid(X, Y) 

r=np.sqrt(x**2+y**2)         
P=(q/(rhof*4*pi*kappa))*(expn(1,(r**2)/(4*c*t)))  
print x,y           
print P            
z = P/1000000         

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, 
        antialiased=True) 
fig.colorbar(surf, shrink=0.5, aspect=5) 

ax.set_xlim(xmin,xmax)  
ax.set_ylim(ymin,ymax)  

ax.set_title('Druckverteilung') 
ax.set_xlabel('Distanz zu Well [m]') 
ax.set_ylabel('Distanz zu Well [m]') 
ax.set_zlabel('Druck in [MPa]') 

plt.show() 

나는 두 가지 질문이 있습니다 음모를 꾸미고 후

  1. 을, 내 년 Colorbar은 1 색 (파란색)를 표시하고 그 이유를 모른다 . 이 사이트에서 비슷한 문제를 찾았지만 적절한 해결책을 찾지 못했습니다. 어떻게해야합니까?

  2. 내 주입 지점 (x, y = 0)에서 내 좌표 x=5my=2m의 압력 값을 알고 싶다고 가정 해 봅시다. 이 값을 "잡아라"는 코드가 있습니까?


나는 시추공 주위에 약간의 스트레스 (예를 들어, 수직 응력과 전단 응력)을 플롯하려고합니다. 나는 단순히

z[z == np.inf] = np.nan 

당신의 제안 제안을 사용하고 plot_surface 명령을 수정하여 나는 미래의 플롯의 압력 내에서 발생하는 오류를 방지 할 수 있습니까? 내가 inf 내에 값을 가질 지 확신 할 수 없기 때문에 묻습니다.

+0

inf 값이없는 경우에도 내 솔루션이 작동합니다. – Molly

답변

1

inf의 z 값 중 하나 때문에 파란색으로 표시됩니다. 먼저 유모로 Z의 INF 값을 설정하여이 문제를 해결할 수 있습니다 다음

z[z == np.inf] = np.nan 

그리고를 VMIN과 VMAX 인수를 사용하여 플롯 값을 어떤 범위 plot_surface 이야기 :

surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, 
        antialiased=True, vmin=np.nanmin(z), vmax=np.nanmax(z)) 

surface plot with reasonable color scale

function을 쉽게 작성하여 다음과 같이 x와 y를주는 z를 계산할 수 있습니다.

def calcZ(x,y): 
    r=np.sqrt(x**2+y**2)         
    P=(q/(rhof*4*pi*kappa))*(expn(1,(r**2)/(4*c*t)))                        
    z = P/1000000 
    return z 
+0

Simul-post! 나는 몰리의 해결책이 더 좋다고 생각한다. 내가 제안한 보간 함수를 사용하면 NaN과 Inf가 0에 가깝습니다. Molly의 옵션은 그렇게하지 않습니다. – farenorth

+0

정말 고맙습니다! – Alex

0

첫 번째 질문에 ax.plot_surface 전화에 vmin=0.15, vmax=0.24을 추가하면 색이 그려집니다. plot_surface가 이러한 색상 제한을 자동으로 선택하는 더 좋은 일을하지 않는 이유는 모르겠지만 실제로는 그렇지 않습니다.

두 번째 질문에 대해서는 임의의 점 (그리드의 꼭지점 일 필요는 없음)을 잡고 싶다면 보간 함수를 사용할 수 있습니다. 예를 들어 보간 기 함수를 먼저 작성하십시오.

from scipy.interpolate import interp2d 
intrp = interp2d(X, Y, z) 

그런 다음 원하는 값을 계산할 수 있습니다.당신은 하나의 포인트를 얻을 수 있습니다 :

a_single_point = intrp(2, 4) 

또는 X = -3 -1에서 포인트 라인, Y = 2에 따라 :

vals = intrp(np.arange(-3, -1, .1), 2) 

행운을 빕니다!

+0

제안 해 주신 의견을 보내 주셔서 감사합니다! – Alex

관련 문제