首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python只显示一种颜色

用Python只显示一种颜色
EN

Stack Overflow用户
提问于 2014-10-08 16:09:16
回答 2查看 1.9K关注 0票数 1

在我的B.Sc里。论文研究了注液井周围孔隙压力和应力的分布.我试图使用Spyder来解决这个问题,这似乎是我最好的界面,因为我在编码方面几乎没有经验。

虽然我阅读了最重要的Python和matplotlib文档,但我找不到解决问题的方法。

首先,这是我目前的代码:

代码语言:javascript
复制
# -*- 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. 绘制后,我的彩色条只显示一种颜色(蓝色),我不知道为什么。我在这个网站上查找了类似的问题,但没有找到合适的解决方案。我怎么才能完成这件事?
  2. 假设我想知道从注入点(x,y=0)到坐标x=5my=2m的压力值。是否有“获取”此值的代码?

我将尝试绘制一些应力(例如法向应力和剪应力)在一个钻孔周围。我是否可以简单地使用你的建议来避免我在未来情节中在压力下遇到的错误?

代码语言:javascript
复制
z[z == np.inf] = np.nan

并修改plot_surface命令?我之所以问这个问题,是因为我不确定我是否会在inf中有一个值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 17:03:16

颜色标度都是蓝色的,因为你们中的一个z值在inf中。您可以首先通过将z中的inf值设置为nan来纠正这一点:

代码语言:javascript
复制
z[z == np.inf] = np.nan

然后告诉面形使用vmin和vmax参数绘制的值范围:

代码语言:javascript
复制
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))

您可以很容易地创建一个函数来计算给x和y的z,如下所示:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-10-08 17:08:14

对于第一个问题,如果将vmin=0.15, vmax=0.24添加到ax.plot_surface调用中,您将得到一个有色的绘图。我不知道为什么plot_surface没有更好地自动选择这些颜色限制,但我想它没有。

关于第二个问题,如果您想获取任意点(不一定是网格中的点),可以使用内插函数。例如,首先创建一个插值函数:

代码语言:javascript
复制
from scipy.interpolate import interp2d
intrp = interp2d(X, Y, z)

然后你可以用它来计算你喜欢的任何地方的值。你可以得到一个点:

代码语言:javascript
复制
a_single_point = intrp(2, 4)

或沿y=2从x=-3到-1之间的一列点:

代码语言:javascript
复制
vals = intrp(np.arange(-3, -1, .1), 2)

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26261494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档