Skip to content
Snippets Groups Projects

Resolve "(LearnerND) add iso-surface plot feature"

Merged Jorn Hoofwijk requested to merge 112-learnernd-add-iso-surface-plot-feature into master
All threads resolved!
Compare and Show latest version
2 files
+ 37
29
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -10,20 +10,11 @@ import scipy.spatial
from .base_learner import BaseLearner
from ..notebook_integration import ensure_holoviews
from ..notebook_integration import ensure_holoviews, ensure_plotly
from .triangulation import (Triangulation, point_in_simplex,
circumsphere, simplex_volume_in_embedding)
from ..utils import restore, cache_latest
try:
import plotly.graph_objs
import plotly.figure_factory
import plotly.offline
with_plotly = True
except ModuleNotFoundError:
with_plotly = False
def volume(simplex, ys=None):
# Notice the parameter ys is there so you can use this volume method as
@@ -586,11 +577,6 @@ class LearnerND(BaseLearner):
else:
raise ValueError("Only 1 or 2-dimensional plots can be generated.")
def get_range(self):
r_min = min(self.data[v] for v in self.tri.vertices)
r_max = max(self.data[v] for v in self.tri.vertices)
return r_min, r_max
def _get_isosurface(self, level=0.0):
if self.ndim != 3 or self.vdim != 1:
raise Exception('Isosurface plotting is only supported'
@@ -605,8 +591,8 @@ class LearnerND(BaseLearner):
return from_line_to_vertex[(a, b)]
# Otherwise compute it and cache the result.
vertex_a = np.array(self.tri.vertices[a])
vertex_b = np.array(self.tri.vertices[b])
vertex_a = self.tri.vertices[a]
vertex_b = self.tri.vertices[b]
value_a = self.data[vertex_a]
value_b = self.data[vertex_b]
@@ -614,7 +600,7 @@ class LearnerND(BaseLearner):
db = abs(value_b - level)
dab = da + db
new_pt = db / dab * vertex_a + da / dab * vertex_b
new_pt = db / dab * np.array(vertex_a) + da / dab * np.array(vertex_b)
new_index = len(vertices)
vertices.append(new_pt)
@@ -623,10 +609,10 @@ class LearnerND(BaseLearner):
for simplex in self.tri.simplices:
plane = []
for a,b in itertools.combinations(simplex, 2):
for a, b in itertools.combinations(simplex, 2):
va = self.data[self.tri.vertices[a]]
vb = self.data[self.tri.vertices[b]]
if min(va,vb) < level <= max(va,vb):
if min(va, vb) < level <= max(va, vb):
vi = _get_vertex_index(a, b)
should_add = True
for pi in plane:
@@ -642,7 +628,8 @@ class LearnerND(BaseLearner):
faces.append(plane[1:])
if len(faces) == 0:
r_min, r_max = self.get_range()
r_min = min(self.data[v] for v in self.tri.vertices)
r_max = max(self.data[v] for v in self.tri.vertices)
raise ValueError(
f"Could not draw isosurface for level={level}, as"
@@ -653,7 +640,7 @@ class LearnerND(BaseLearner):
return vertices, faces
def plot_isosurface(self, level=0.0, hull_opacity=0.2):
"""Plots the linearly interpolated iso-surface of the function, based on
"""Plots the linearly interpolated iso-surface of the function, based on
the currently evaluated points. This is the 3d analog of an iso-line.
Parameters
@@ -663,8 +650,7 @@ class LearnerND(BaseLearner):
hull_opacity : float
the opacity of the hull of the domain. Defaults to 0.2
"""
if not with_plotly:
raise Exception('plot_isosurface requires plotly to be installed')
plotly = ensure_plotly()
vertices, faces = self._get_isosurface(level)
x, y, z = zip(*vertices)
@@ -680,13 +666,15 @@ class LearnerND(BaseLearner):
return plotly.offline.iplot([fig.data[0], hull_mesh])
def _get_hull_mesh(self, opacity=0.2):
plotly = ensure_plotly()
hull = scipy.spatial.ConvexHull(self._bounds_points)
# Find the colors of each plane, giving triangles which are coplanar the
# same color, such that a square face has the same color.
color_dict = {}
def _get_plane_color(simplex):
simplex= tuple(simplex)
simplex = tuple(simplex)
# If the volume of the two triangles combined is zero then they
# belong to the same plane.
for simplex_key, color in color_dict.items():
@@ -695,7 +683,7 @@ class LearnerND(BaseLearner):
return color
if scipy.spatial.ConvexHull(points).volume < 1e-5:
return color
color_dict[simplex] = tuple(random.randint(0,255) for _ in range(3))
color_dict[simplex] = tuple(random.randint(0, 255) for _ in range(3))
return color_dict[simplex]
colors = [_get_plane_color(simplex) for simplex in hull.simplices]
@@ -704,4 +692,3 @@ class LearnerND(BaseLearner):
i, j, k = hull.simplices.T
return plotly.graph_objs.Mesh3d(x=x, y=y, z=z, i=i, j=j, k=k,
facecolor=(colors), opacity=opacity)
\ No newline at end of file
Loading