Исправлена ​​ошибка времени выполнения при вычислении триангуляции из-за ошибки точности при использовании функции tricontourf с ограниченным ненулевым значением - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь создать двумерную гистограмму из двух наборов данных, соответствующих двум различным переменным.В любой точке (x, y) на поверхности существует соответствующая вероятность, представленная в виде компонента z .Я сделал это раньше для разных наборов данных без проблем.Тем не менее, для конкретных данных, показанных ниже - где имеется значительное количество нулей - функция tricontourf жалуется.Мне интересно, есть ли какое-либо исправление или замена функции, чтобы обойти проблему.Ваша помощь очень ценится.

Вот MWE:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm


bins = np.logspace(8.00+0.6/2, 11.60+0.6/2, 7)

m12b = np.array([0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5])
m12c = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0])
m12f = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0])
m12m = np.array([0.0, 0.0, 0.05, 0.45, 0.45, 0.0, 0.05])
m12q = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0])

m12_mean = np.mean([m12b, m12c, m12f, m12m, m12q], axis=0)
m12_mean = np.where(m12_mean>0, m12_mean, np.nan)
m12_error = np.std([m12b, m12c, m12f, m12m, m12q], axis=0)/np.sqrt(5)
m12_error = np.where(m12_error>0, m12_error, np.nan)

velocity_m12b = np.array([0, 0, 0, 0.1291, 0, 0, 0.12169999999999999])
velocity_m12c = np.array([0, 0, 0, 0, 0, 0, 0.1746])
velocity_m12f = np.array([0, 0, 0, 0, 0, 0, 0.2046])
velocity_m12m = np.array([0, 0, 0.005613, 0.20810263666666667, 0.028291340980000006, 0, 0.1341])
velocity_m12q = np.array([0, 0, 0, 0, 0, 0, 0.1259])

velocity = np.mean([velocity_m12b, velocity_m12c, velocity_m12f, velocity_m12m, velocity_m12q], axis=0)
x, y, z = np.delete(bins, [0,1,5]), np.delete(velocity, [0,1,5]), np.delete(m12_mean, [0,1,5])

levels = np.arange(0,1,0.1)
norm = cm.colors.Normalize(vmax=1, vmin=0)
cmap = cm.Reds



cf = plt.tricontourf(x, y, z, levels, cmap=cm.get_cmap(cmap, len(levels)-1), norm=norm)
plt.tricontour(x, y, z, cf.levels, colors='k')
plt.xlim([1e8, 1e12])
plt.ylim([8e-3, 0.8])
plt.xscale("log", nonposx='clip')
plt.yscale("log", nonposy='clip')

plt.show()

А вот сообщение об ошибке при запуске кода:

Traceback (most recent call last):
  File "me.py", line 34, in <module>
    cf = plt.tricontourf(x, y, z, levels, cmap=cm.get_cmap(cmap, len(levels)-1), norm=norm)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 3667, in tricontourf
    ret = ax.tricontourf(*args, **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py", line 8025, in tricontourf
    return mtri.tricontourf(self, *args, **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/tricontour.py", line 282, in tricontourf
    return TriContourSet(ax, *args, **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/tricontour.py", line 40, in __init__
    ContourSet.__init__(self, ax, *args, **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/contour.py", line 846, in __init__
    kwargs = self._process_args(*args, **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/tricontour.py", line 51, in _process_args
    tri, z = self._contour_args(args, kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/tricontour.py", line 85, in _contour_args
    **kwargs)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/triangulation.py", line 164, in get_from_args_and_kwargs
    triangulation = Triangulation(x, y, triangles, mask)
  File "/home/usr/anaconda3/lib/python3.6/site-packages/matplotlib/tri/triangulation.py", line 55, in __init__
    self.triangles, self._neighbors = _qhull.delaunay(x, y)
RuntimeError: Error in qhull Delaunay triangulation calculation: precision error (exitcode=3); use python verbose option (-v) to see original qhull error.
...