I have a 3D contour plot, which I make with python's mayavi library, into which I want to overplot some arrows. For the contour plot I use mlab.contour3d
and for the arrow mlab.quiver3d
(link to the mlab docs, to quiver3d, to contour3d). To make the example easy, I use a sphere for the contour here. It works fine as long as I plot both things separately, i.e. in different runs, see the following plot.
When I try to combine both plots, however, it is not working properly, the coordinates of both plots seem not to match, see the following plot where the arrow is somewhere very small in the bottom left corner. I have also no idea what happened to the axes and their labels.
This is my code:
import numpy as npfrom mayavi import mlab# starting coordinates of vectorx = np.array([2.])y = np.array([1.])z = np.array([0.])# components for vectorsu = np.array([3.])v = np.array([0.])w = np.array([0.])# making 3D arrays for quiver3dXX, YY, ZZ = np.meshgrid(x, y, z)UU, VV, WW = np.meshgrid(u, v, w)# coordinates for caluclating the spherex_arr = np.linspace(0,5,50)y_arr = np.linspace(0,5,50)z_arr = np.linspace(0,5,50)# center and radius of spherexc = 2yc = 2.5zc = 3r = 2# make the spheredata2plot = np.zeros( (len(x_arr), len(y_arr), len(z_arr)) )for ii in range(len(x_arr)): for jj in range(len(y_arr)): for kk in range(len(z_arr)): if np.sqrt( (x_arr[ii]-xc)**2 +(y_arr[jj]-yc)**2 +(z_arr[kk]-zc)**2 ) < r: data2plot[ii,jj,kk] = 1fig1 = mlab.figure( bgcolor=(1,1,1), fgcolor=(0,0,0))# contour plot and arrow-plot, separately, they work, combined notxx_arr, yy_arr, zz_arr = np.meshgrid(x_arr, y_arr, z_arr, indexing='ij')contPlot = mlab.contour3d( xx_arr, yy_arr, zz_arr, data2plot, transparent=True, opacity=.4, figure=fig1)arrowPlot = mlab.quiver3d(XX, YY, ZZ, UU, VV, WW, line_width=1, mode='arrow', figure=fig1 )ax1 = mlab.axes( color=(1,1,1), nb_labels=4 )mlab.show()
Any hint on what I am missing or doing wrong is greatly appreciated!