2014-10-08 11 views
1

在我的B.Sc.我必须研究流体注入井周围的孔隙压力和应力分布。我试图通过使用Spyder来解决这部分,这对我来说似乎是最好的界面,因为我几乎没有编码经验。Colorbar只在Python中显示一种颜色

虽然我通过最重要的Python和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. 密谋后,我的彩条只显示1种颜色(蓝色),我不知道为什么。我在这个网站上查找类似的问题,但无法找到合适的解决方案。我怎样才能做到这一点?

  2. 假设我想从我的注入点(x,y = 0)知道坐标x=5my=2m中的压力值。有没有代码来“抢”这个值?


我将设法绘制绕钻孔一些应力(例如正应力和剪切应力)。我能避免简单地使用你建议的

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

命题和修改plot_surface命令我在未来地块的压力中遇到的错误?我问,因为我不确定我的价值是否在inf之内。

+0

即使没有inf值,我的解决方案也能正常工作。 – Molly 2014-10-09 20:11:34

回答

1

颜色比例全是蓝色,因为你们中的一个z值在inf中。你可以先通过Z设置INF值楠纠正这一点,

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

然后告诉plot_surface什么值范围使用Vmin和Vmax参数绘制:

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 2014-10-08 17:10:46

+0

非常感谢你! – Alex 2014-10-08 20:29:48

0

对于第一个问题,如果您将vmin=0.15, vmax=0.24添加到您的ax.plot_surface呼叫中,您将获得一个彩色图。我不知道为什么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

谢谢farenorth您的进一步建议! – Alex 2014-10-08 20:30:58

相关问题