Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4fa9418

Browse files
committed
a few 3d bug fixes
svn path=/trunk/matplotlib/; revision=2507
1 parent 606ddd6 commit 4fa9418

5 files changed

Lines changed: 17 additions & 129 deletions

File tree

examples/simple3d_oo.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@ def plot3d(self):
3939
plt = self.fig.axes.append(ax3d)
4040

4141
delta = nx.pi / 100.0
42-
u = nx.arange(0, 2*nx.pi + delta, delta)
43-
v = nx.arange(0, nx.pi + delta, delta)
42+
u = nx.arange(0, 2*nx.pi, delta)
43+
v = nx.arange(0, nx.pi, delta)
4444

4545
x=10*nx.outerproduct(nx.cos(u),nx.sin(v))
4646
y=10*nx.outerproduct(nx.sin(u),nx.sin(v))
4747
z=10*nx.outerproduct(nx.ones(nx.size(u)),nx.cos(v))
4848

4949
ax3d.plot_wireframe(x,y,z)
50+
ax3d.plot_surface(x+10,y,z)
51+
5052
ax3d.set_xlabel('X')
5153
ax3d.set_ylabel('Y')
5254
ax3d.set_zlabel('Z')

lib/matplotlib/art3d.py

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313
from cm import jet
1414

1515
import numerix as nx
16-
1716
import proj3d
1817

19-
2018
class Wrap2D:
2119
"""Wrapper which wraps a 2D object and makes it 3D
2220
@@ -85,7 +83,6 @@ class Text3D(Text3DW):
8583
def __init__(self, x=0,y=0,z=0,text='', dir='z'):
8684
inst = text.Text(x,y,text,*args, **kwargs)
8785
Text3DW.__init__(self, z,dir, inst)
88-
8986

9087
class oText3D(text.Text):
9188
def __init__(self, x=0,y=0,z=0,text='', dir='z', *args, **kwargs):
@@ -115,7 +112,6 @@ def draw(self, renderer):
115112

116113
lines.Line2D.draw(self, renderer)
117114

118-
119115
class Line3DCollectionW(Wrap2D):
120116
def __init__(self, inst, segments):
121117
Wrap2D.__init__(self, inst)
@@ -134,7 +130,6 @@ def __init__(self, segments, *args, **kwargs):
134130
inst = LineCollection(segments, *args, **kwargs)
135131
Line3DCollectionW.__init__(self, inst, segments)
136132

137-
138133
class Line2DCollectionW(Wrap2D):
139134
def __init__(self, inst, z=0, dir='z'):
140135
Wrap2D.__init__(self, inst)
@@ -177,9 +172,7 @@ def get_verts(*args):
177172

178173
self.get_verts = get_verts
179174
self.draw2d(renderer)
180-
181-
182-
175+
183176
class Patch3DCollectionW(Wrap2D):
184177
def __init__(self, inst, zs, dir='z'):
185178
Wrap2D.__init__(self, inst)
@@ -202,7 +195,6 @@ def draw3d(self, renderer):
202195
self._edgecolors = zalpha(self._edgecolors,vzs)
203196
self._offsets = zip(vxs,vys)
204197
self.draw2d(renderer)
205-
206198

207199
class Poly3DCollectionW(Wrap2D):
208200
def __init__(self, inst, zs=None, dir='z'):
@@ -225,8 +217,6 @@ def draw3d(self, renderer):
225217
# mess with colors
226218
self._verts = [verts for (z,verts) in vverts]
227219
self.draw2d(renderer)
228-
229-
230220

231221
class oLine3DCollection(LineCollection):
232222
def __init__(self, segments, *args, **kwargs):
@@ -243,7 +233,6 @@ def draw(self, renderer):
243233
LineCollection.draw(self, renderer)
244234
self._segments = orig_segments
245235

246-
247236
class Poly3DCollection(Wrap2D):
248237
def __init__(self, segments, *args, **kwargs):
249238
inst = PolyCollection(segments, *args, **kwargs)
@@ -290,7 +279,6 @@ def draw3d(self, renderer):
290279

291280
self.draw2d(renderer)
292281

293-
294282
def juggle_axes(xs,ys,zs, dir):
295283
"""Depending on the direction of the plot re-order the axis
296284
@@ -314,8 +302,6 @@ def draw3d(self, renderer):
314302
self._x = xs
315303
self._y = ys
316304
self.draw2d(renderer)
317-
318-
319305

320306
def line_draw(self, renderer):
321307
"""Draw a 2D line as a 3D line"""
@@ -360,8 +346,6 @@ def set_line_data(line, xs,ys,zs):
360346
line.set_data(xs,ys)
361347
line.zs = zs
362348

363-
364-
365349
def iscolor(c):
366350
try:
367351
return (len(c)==4 or len(c)==3) and (type(c[0])==float)
@@ -409,7 +393,6 @@ def patch_draw(self, renderer):
409393
def wrap_patch(patch, zs, dir='z'):
410394
return Patch3DCollectionW(patch, zs, dir)
411395

412-
413396
def draw_linec(self, renderer):
414397
orig_segments = self._segments
415398
segments_3d = [[(x,y,z) for (x,y),z in zip(points,zs)]
@@ -436,8 +419,7 @@ def draw_polyc(self, renderer):
436419
self._verts = segments_2d
437420
PolyCollection.draw(self, renderer)
438421
self._verts = orig_segments
439-
440-
422+
441423
def text_draw(self, renderer):
442424
x,y = self.get_position()
443425
xs,ys,zs = juggle_axes(x,y,self._z,self.dir)
@@ -459,7 +441,6 @@ def wrapped_draw(renderer,text=text):
459441
def set_text_data(text, x,y,z):
460442
text._x,text._y,text._z = x,y,z
461443

462-
463444
def draw(text, renderer):
464445
print 'call draw text', text
465446
print text.get_visible()
@@ -474,7 +455,6 @@ def draw_text(renderer,text=text):
474455
draw(text,renderer)
475456
text.draw = draw_text
476457

477-
478458
def wrap_2d_fn(patch, zs,dir='z',fn=patch_draw):
479459
patch.zs = zs
480460
patch.dir = dir
@@ -483,7 +463,3 @@ def wrapped_draw(renderer,patch=patch,fn=fn):
483463
return fn(patch,renderer)
484464
patch.draw = wrapped_draw
485465
return patch
486-
487-
488-
489-

lib/matplotlib/axes3d.py

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
"""
77
3D projection glued onto 2D Axes.
88
9-
AXes3D
10-
11-
12-
9+
Axes3D
1310
"""
1411

1512
import random
@@ -23,7 +20,6 @@
2320
import numerix as nx
2421
from colors import normalize
2522

26-
2723
import art3d
2824
import proj3d
2925
import axis3d
@@ -36,7 +32,6 @@ def sensible_format_data(self, value):
3632
else:
3733
return '%4.3f' % value
3834

39-
4035
class Axes3DI(Axes):
4136
"""Wrap an Axes object
4237
@@ -52,18 +47,13 @@ class Axes3DI(Axes):
5247
The axes representing the x,y,z world dimensions are self.w_xaxis,
5348
self.w_yaxis and self.w_zaxis. They can probably be controlled in
5449
more or less the normal ways.
55-
56-
5750
"""
58-
def __init__(self, fig=None, rect=[0.0, 0.0, 1.0, 1.0], *args, **kwargs):
59-
#
60-
self.fig = fig or figure.Figure()
51+
def __init__(self, fig, rect=[0.0, 0.0, 1.0, 1.0], *args, **kwargs):
52+
self.fig = fig
6153

6254
azim = cbook.popd(kwargs, 'azim', -60)
6355
elev = cbook.popd(kwargs, 'elev', 30)
6456

65-
#
66-
6757
self.xy_viewLim = unit_bbox()
6858
self.zz_viewLim = unit_bbox()
6959
self.xy_dataLim = unit_bbox()
@@ -74,19 +64,12 @@ def __init__(self, fig=None, rect=[0.0, 0.0, 1.0, 1.0], *args, **kwargs):
7464
Axes.__init__(self, self.fig, rect,
7565
frameon=True,
7666
xticks=[], yticks=[], *args, **kwargs)
77-
#
78-
# figmanager = pylab.get_current_fig_manager()
79-
# self.toolbar = figmanager.toolbar
80-
#
81-
#
82-
# self.toolbar._active is current zoom/pan mode
83-
#
84-
#
67+
8568
self.M = None
8669
self._ready = 1
8770

8871
self.view_init(elev, azim)
89-
#self.mouse_init()
72+
self.mouse_init()
9073
self.create_axes()
9174
self.set_top_view()
9275

@@ -95,7 +78,6 @@ def __init__(self, fig=None, rect=[0.0, 0.0, 1.0, 1.0], *args, **kwargs):
9578
#self.axesPatch.set_facecolor((0,0,0,0))
9679
self.fig.add_axes(self)
9780

98-
9981
def set_top_view(self):
10082
# this happens to be the right view for the viewing coordinates
10183
# moved up and to the left slightly to fit labels and axes
@@ -131,7 +113,6 @@ def nset_ylim(self, *args):
131113
vmin,vmax = self.vlim_argument(self.get_ylim)
132114
print 'ylim', vmin,vmax
133115

134-
135116
def create_axes(self):
136117
self.w_xaxis = axis3d.Axis('x',self.xy_viewLim.intervalx,
137118
self.xy_dataLim.intervalx, self)
@@ -140,7 +121,6 @@ def create_axes(self):
140121
self.w_zaxis = axis3d.Axis('z',self.zz_viewLim.intervalx,
141122
self.zz_dataLim.intervalx, self)
142123

143-
144124
def unit_cube(self,vals=None):
145125
minx,maxx,miny,maxy,minz,maxz = vals or self.get_w_lims()
146126
xs,ys,zs = ([minx,maxx,maxx,minx,minx,maxx,maxx,minx],
@@ -174,8 +154,6 @@ def tunit_edges(self, vals=None,M=None):
174154
return edges
175155

176156
def draw(self, renderer):
177-
#print 'elev', self.elev, 'azim', self.azim
178-
179157
# draw the background patch
180158
self.axesPatch.draw(renderer)
181159
self._frameon = False
@@ -273,7 +251,6 @@ def get_w_xlim(self):
273251
def get_w_ylim(self):
274252
return self.xy_viewLim.intervaly().get_bounds()
275253

276-
277254
def pany(self, numsteps):
278255
print 'numsteps', numsteps
279256

@@ -336,7 +313,6 @@ def get_proj(self):
336313
def mouse_init(self):
337314
self.button_pressed = None
338315
self.figure.canvas.mpl_connect('motion_notify_event', self.on_move)
339-
340316
self.figure.canvas.mpl_connect('button_press_event', self.button_press)
341317
self.figure.canvas.mpl_connect('button_release_event', self.button_release)
342318

@@ -380,7 +356,6 @@ def format_zdata(self, z):
380356
fmt = self.w_zaxis.get_major_formatter()
381357
return sensible_format_data(fmt,z)
382358

383-
384359
def format_coord(self, xd, yd):
385360
"""Given the 2D view coordinates attempt to guess a 3D coordinate
386361
@@ -418,7 +393,6 @@ def on_move(self, event):
418393
419394
button-1 rotates
420395
button-3 zooms
421-
422396
"""
423397
#NOTE - this shouldn't be called before the graph has been drawn for the first time!
424398
if event.inaxes != self or not self.M:
@@ -440,7 +414,7 @@ def on_move(self, event):
440414
w = (x1-x0)
441415
h = (y1-y0)
442416
self.sx,self.sy = x,y
443-
#
417+
444418
if self.button_pressed == 1:
445419
# rotate viewing point
446420
# get the x and y pixel coords
@@ -472,7 +446,6 @@ def on_move(self, event):
472446
self.get_proj()
473447
self.figure.canvas.draw()
474448

475-
476449
def set_xlabel(self, xlabel, fontdict=None, **kwargs):
477450
#par = cbook.popd(kwargs, 'par',None)
478451
#label.set_par(par)
@@ -497,7 +470,6 @@ def set_zlabel(self, zlabel, fontdict=None, **kwargs):
497470
label.update(kwargs)
498471
return label
499472

500-
501473
def plot(self, *args, **kwargs):
502474
had_data = self.has_data()
503475

@@ -561,7 +533,7 @@ def plot_surface(self, X, Y, Z, *args, **kwargs):
561533
n = proj3d.cross(box[0]-box[1],
562534
box[0]-box[2])
563535
n = n/proj3d.mod(n)*5
564-
shade.append(proj3d.dot(n,[-1,-1,0.5]))
536+
shade.append(nx.dot(n,[-1,-1,0.5]))
565537
lines.append((box[0],n+box[0]))
566538
#
567539
color = nx.array([0,0,1,1])
@@ -676,11 +648,9 @@ class Axes3D:
676648
to their 3D approximations.
677649
678650
This should probably be the case for plot etc...
679-
680-
681651
"""
682-
def __init__(self, *args, **kwargs):
683-
self.__dict__['wrapped'] = Axes3DI(*args, **kwargs)
652+
def __init__(self, fig, *args, **kwargs):
653+
self.__dict__['wrapped'] = Axes3DI(fig, *args, **kwargs)
684654

685655
def set_xlim(self, *args, **kwargs):
686656
self.wrapped.set_w_xlim(*args, **kwargs)
@@ -713,7 +683,6 @@ def scatter(self, xs,ys,zs=None,dir='z',*args,**kwargs):
713683
patches = art3d.wrap_patch(patches, zs=[0]*len(xs),dir=dir)
714684
return patches
715685

716-
717686
def bar(self, left, height, z=0, dir='z', *args, **kwargs):
718687
had_data = self.has_data()
719688
patches = self.wrapped.bar(left, height, *args, **kwargs)
@@ -729,7 +698,6 @@ def bar(self, left, height, z=0, dir='z', *args, **kwargs):
729698
xs,ys,zs=art3d.juggle_axes(xs,ys,zs,dir)
730699
self.wrapped.auto_scale_xyz(xs,ys,zs, had_data)
731700

732-
733701
def test_scatter():
734702

735703
ax = Axes3D()

0 commit comments

Comments
 (0)