【问题标题】:Colorbar only shows one color in Python颜色栏在 Python 中只显示一种颜色
【发布时间】:2014-12-03 09:13:47
【问题描述】:

在我的理学学士学位内。论文我必须研究注液井周围的孔隙压力和应力分布。我尝试通过使用 Spyder 来解决这部分问题,这对我来说似乎是最好的界面,因为我的编码经验几乎为零。

虽然我研究了最重要的 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. 绘图后,我的颜色条只显示一种颜色(蓝色),我不知道为什么。我在这个网站上查找了类似的问题,但无法找到合适的解决方案。我怎样才能完成这项工作?

  2. 假设我想知道我的坐标x=5my=2m 从我的注入点 (x,y=0) 的压力值。是否有代码可以“获取”这个值?


我将尝试在钻孔周围绘制一些应力(例如法向应力和剪切应力)。我可以通过简单地使用您建议的提议来避免我在未来的情节中遇到的压力

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

并修改 plot_surface 命令?我问是因为我不确定我是否会在 inf 内有一个值。

【问题讨论】:

  • 即使没有 inf 值,我的解决方案也会起作用。

标签: python matplotlib plot spyder colorbar


【解决方案1】:

色标都是蓝色的,因为你们中的一个 z 值在 inf 中。您可以先将 z 中的 inf 值设置为 nan 来更正此问题:

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))

您可以轻松地创建一个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

【讨论】:

  • 同步发布!我认为莫莉的解决方案更好。使用插值函数 - 正如我所建议的那样 - 将 NaNInf 的值放在 0 附近。Molly 的选项不会这样做。
  • 非常感谢您!
【解决方案2】:

对于您的第一个问题,如果您将 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)

或沿 y=2 从 x=-3 到 -1 的点线:

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

祝你好运!

【讨论】:

  • 感谢 farenorth 的进一步建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多