/usr/lib/python2.7/dist-packages/dipy/viz/projections.py is in python-dipy 0.10.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | """
Visualization tools for 2D projections of 3D functions on the sphere, such as
ODFs.
"""
import numpy as np
import scipy.interpolate as interp
from ..utils.optpkg import optional_package
matplotlib, has_mpl, setup_module = optional_package("matplotlib")
plt, _, _ = optional_package("matplotlib.pyplot")
tri, _, _ = optional_package("matplotlib.tri")
bm, has_basemap, _ = optional_package("mpl_toolkits.basemap")
import dipy.core.geometry as geo
from dipy.testing import doctest_skip_parser
@doctest_skip_parser
def sph_project(vertices, val, ax=None, vmin=None, vmax=None, cmap=None,
cbar=True, tri=False, boundary=False, **basemap_args):
"""Draw a signal on a 2D projection of the sphere.
Parameters
----------
vertices : (N,3) ndarray
unit vector points of the sphere
val: (N) ndarray
Function values.
ax : mpl axis, optional
If specified, draw onto this existing axis instead.
vmin, vmax : floats
Values to cut the z
cmap : mpl colormap
cbar: Whether to add the color-bar to the figure
triang : Whether to display the plot triangulated as a pseudo-color plot.
boundary : Whether to draw the boundary around the projection in a black line
Returns
-------
ax : axis
Matplotlib figure axis
Examples
--------
>>> from dipy.data import get_sphere
>>> verts = get_sphere('symmetric724').vertices
>>> ax = sph_project(verts.T, np.random.rand(len(verts.T))) # skip if not has_basemap
"""
if ax is None:
fig, ax = plt.subplots(1)
if cmap is None:
cmap = matplotlib.cm.hot
basemap_args.setdefault('projection', 'ortho')
basemap_args.setdefault('lat_0', 0)
basemap_args.setdefault('lon_0', 0)
basemap_args.setdefault('resolution', 'c')
from mpl_toolkits.basemap import Basemap
m = Basemap(**basemap_args)
if boundary:
m.drawmapboundary()
# Rotate the coordinate system so that you are looking from the north pole:
verts_rot = np.array(np.dot(np.matrix([[0,0,-1],[0,1,0],[1,0,0]]), vertices))
# To get the orthographic projection, when the first coordinate is positive:
neg_idx = np.where(verts_rot[0]>0)
# rotate the entire bvector around to point in the other direction:
verts_rot[:, neg_idx] *= -1
_, theta, phi = geo.cart2sphere(verts_rot[0], verts_rot[1], verts_rot[2])
lat, lon = geo.sph2latlon(theta, phi)
x, y = m(lon, lat)
my_min = np.nanmin(val)
if vmin is not None:
my_min = vmin
my_max = np.nanmax(val)
if vmax is not None:
my_max = vmax
if tri:
m.pcolor(x, y, val, vmin=my_min, vmax=my_max, tri=True, cmap=cmap)
else:
cmap_data = cmap._segmentdata
red_interp, blue_interp, green_interp = (
interp.interp1d(np.array(cmap_data[gun])[:,0],
np.array(cmap_data[gun])[:,1]) for gun in
['red', 'blue','green'])
r = (val - my_min)/float(my_max-my_min)
# Enforce the maximum and minumum boundaries, if there are values
# outside those boundaries:
r[r<0]=0
r[r>1]=1
for this_x, this_y, this_r in zip(x,y,r):
red = red_interp(this_r)
blue = blue_interp(this_r)
green = green_interp(this_r)
m.plot(this_x, this_y, 'o',
c=[red.item(), green.item(), blue.item()])
if cbar:
mappable = matplotlib.cm.ScalarMappable(cmap=cmap)
mappable.set_array([my_min, my_max])
# setup colorbar axes instance.
pos = ax.get_position()
l, b, w, h = pos.bounds
# setup colorbar axes
cax = fig.add_axes([l+w+0.075, b, 0.05, h], frameon=False)
fig.colorbar(mappable, cax=cax) # draw colorbar
return ax
|