【问题标题】:Matplotlib contourplot fails when no contour existsMatplotlib 轮廓图在不存在轮廓时失败
【发布时间】:2015-07-10 21:06:40
【问题描述】:

我使用食谱示例 frin http://wiki.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data 来制作等高线图。但是我的一些数据可能只包含零,在这种情况下,我会得到一个 ValueError:zero-size array to reduction operation minimum 它没有身份。

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
from numpy.random import uniform, seed


# make up some randomly distributed data
seed(1234)
npts = 200
x = uniform(-2,2,npts)
y = uniform(-2,2,npts)
z = 0*x*np.exp(-x**2-y**2) #Here i multiply by zero
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,100)
# grid the data.
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')

#zi[0][0]=0.00001 would make everything ok again
print(zi)
# do the plotting and save the result
CS = plt.contour(xi, yi, zi)
plt.show()

有没有优雅的方法来处理这个问题? 这值得 matplotlib 中的一张票吗?

【问题讨论】:

  • 您希望代码表现如何?你提供了错误的数据,你会得到一个例外。对我来说听起来不错。
  • 好吧,我不会说我提供的是“坏”数据。 z = 0*x*np.exp(-x2-y2) + 0.0000001,有效并包含尽可能多的信息。
  • 但是,在使用 griddata 对上述代码进行插值后,您会得到一组 NaN,而不是一组 0 或其他数字,因为很难决定如何在等高线图中使用它。抛出异常似乎是一个合理的响应。
  • @Tommy 正确我在尝试制作示例时注意到了 NaN(我的原始代码从 csv 文件中生成了零数组)。有趣的是,只要不是全部都是 NaN,plt.contour 就可以处理 NaN,(去掉 *0),但是如果 all 元素都是零,它就不能处理这个问题。那是我遇到此错误的唯一一次。

标签: python numpy matplotlib scipy


【解决方案1】:

为什么不直接捕获异常,即:

try:
    CS = plt.contour(xi, yi, zi)
    plt.show()
except ValueError:
    print("Can't plot this data")

【讨论】:

  • 感谢您的回答,我目前的解决方法是:如果 numpy.max(zi)==numpy.min(zi)==0: zi[0][0]=0.00000001,因为我会还是像个情节。异常处理有一些更优雅的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2021-01-05
  • 2022-01-24
相关资源
最近更新 更多