Я пытаюсь создать двумерную гистограмму из двух наборов данных, соответствующих двум различным переменным.В любой точке (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.