Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib - Wrong overlapping when plotting two 3D surfaces on the same axes

Tags:

I am trying to plot two 3D surfaces on the same axes in matplotlib with the plot_surface command.

fig = plt.figure() fig.figsize = fig_size ax = fig.gca(projection='3d')  surf = ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True) surf = ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True) 

The problem I have is that when viewing the plot, not always the correct surface is 'on top', for instance in the plot:

Example plot

in the back corner (200N, 2.5Hz on the axes) the blue-green surface is 'on top' when actually the yellow-red is closer to the viewer. If I rotate the plot:

Second example plot

then things look ok now, the blue-green surface is underneath the yellow-red one at 200N and 2.5Hz (now on the left side). I have tried searching stackoverflow and Google but cannot find any similar problems with a solution.

I am using Python 2.7.3, Numpy 1.6.1 and Matplotlib 1.1.1rc on Linux.

like image 966
Andrew Spencer Avatar asked Dec 18 '12 11:12

Andrew Spencer


People also ask

How do you avoid overlapping plots in python?

Dot Size. You can try to decrease marker size in your plot. This way they won't overlap and the patterns will be clearer.

Can we plot 3D plots Matplotlib?

3D plotting in Matplotlib starts by enabling the utility toolkit. We can enable this toolkit by importing the mplot3d library, which comes with your standard Matplotlib installation via pip. Just be sure that your Matplotlib version is over 1.0. Now that our axes are created we can start plotting in 3D.

Can a Matplotlib figure have more than one set of axes?

Create multiple y axes with a shared x axis. This is done by creating a twinx axes, turning all spines but the right one invisible and offset its position using set_position . Note that this approach uses matplotlib.


1 Answers

This behavior is documented in matplotlib FAQ here. The same page suggests to install Mayavi which works OK with 3D plots.

  • Its interface is quite similar to matplotlib.
  • Its main problem is that it's still tricky to install it on python 3. (got much easier now)

Here's a demo "matplotlib vs mayavi" comparison:

# generate data import numpy as np  x = np.arange(-2, 2, 0.1) y = np.arange(-2, 2, 0.1) mx, my = np.meshgrid(x, y, indexing='ij') mz1 = np.abs(mx) + np.abs(my) mz2 = mx ** 2 + my ** 2  # A fix for "API 'QString' has already been set to version 1" # see https://github.com/enthought/pyface/issues/286#issuecomment-335436808 from sys import version_info if version_info[0] < 3:     import pyface.qt   def v1_matplotlib():     from matplotlib import pyplot as plt     from mpl_toolkits.mplot3d import Axes3D      fig = plt.figure()     ax = fig.gca(projection='3d')     surf1 = ax.plot_surface(mx, my, mz1, cmap='winter')     surf2 = ax.plot_surface(mx, my, mz2, cmap='autumn')     ax.view_init(azim=60, elev=16)     fig.show()   def v2_mayavi(transparency):     from mayavi import mlab     fig = mlab.figure()      ax_ranges = [-2, 2, -2, 2, 0, 8]     ax_scale = [1.0, 1.0, 0.4]     ax_extent = ax_ranges * np.repeat(ax_scale, 2)      surf3 = mlab.surf(mx, my, mz1, colormap='Blues')     surf4 = mlab.surf(mx, my, mz2, colormap='Oranges')      surf3.actor.actor.scale = ax_scale     surf4.actor.actor.scale = ax_scale     mlab.view(60, 74, 17, [-2.5, -4.6, -0.3])     mlab.outline(surf3, color=(.7, .7, .7), extent=ax_extent)     mlab.axes(surf3, color=(.7, .7, .7), extent=ax_extent,               ranges=ax_ranges,               xlabel='x', ylabel='y', zlabel='z')      if transparency:         surf3.actor.property.opacity = 0.5         surf4.actor.property.opacity = 0.5         fig.scene.renderer.use_depth_peeling = 1   v1_matplotlib() v2_mayavi(False) v2_mayavi(True)  # To install mayavi, the following currently works for me (Windows 10): # #   conda create --name mayavi_test_py2 python=2.7 matplotlib mayavi=4.4.0 #    (installs pyqt=4.10.4 mayavi=4.4.0 vtk=5.10.1) #    * the `use_depth_peeling=1` got no effect. Transparency is not correct. #    * requires `import pyface.qt` or similar workaround # # or # #   conda create --name mayavi_test_py3 python=3.6 matplotlib #   conda activate mayavi_test_py3 #   pip install mayavi 

matplotlib vs mayavi_no_transparency vs mayavi_with_transparency

like image 173
Igor Avatar answered Oct 01 '22 14:10

Igor