Jc @sdZddklZlZddklZddklZddklZddk Z ddk l Z l Z ddkZddkZddkZdZd Zd efd YZd d ZdS(sZ Module containing Axes3D, an object which can plot 3D objects on a 2D matplotlib figure. i(tAxestrcParams(tcbook(tBbox(t collectionsN(t NormalizetcolorConvertercCsJt|djpt|djod|}|i|Sd|SdS(s:Used to generate more comprehensible numbers in status barg@gMbP?s%1.4es%4.3fN(tabst_formatSciNotation(tselftvaluets((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytsensible_format_datas& cCs+ttiddgddgg}|S(Nii(Rtnptarray(tbox((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt unit_bboxs'tAxes3DcBs?eZdZd8dZdZdZd8dZd8d8dZd8d8dZ dZ dZ d Z d8d8d Z eeed Zd Zd8d8d ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d8d"Z&d8d#Z'd8d$Z(ed%Z)d8d&Z*e*Z+d'Z,e,Z-d(Z.d)Z/d*Z0d+Z1d,d-Z2d.d/Z3e3Z4d0Z5e5Z6d1d2d3Z7d1d2d4Z8e8Z9d1d2d5Z:d6d7Z;RS(9s 3D axes object. c Os$|djoddddg}n||_g|_|idd}|idd}t|_t|_t|_t|_|i ||d|_ t i ||i|dt d gd g||d|_d |_ |i|i|i|iid|ii|dS( Ngg?tazimiteleviitframeontxtickstyticksi(tNonetfigtcidstpopRt xy_viewLimt zz_viewLimt xy_dataLimt zz_dataLimt view_initt_readyRt__init__tTruetMt mouse_initt create_axest set_top_viewt axesPatcht set_linewidthtadd_axes(R RtrecttargstkwargsRR((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR!'s,             cCs`d|i}d|i}d|i}d|i}ti|| |ti|| |dS(Ngffffff?g?(tdistRtset_xlimtset_ylim(R txdwltxdwtydwltydw((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR&Fs     cCsytid|ii|ii||_tid|ii|ii||_ti d|i i|i i||_ dS(Ntxtytz( taxis3dtXAxisRt intervalxRtw_xaxistYAxist intervalytw_yaxistZAxisRRtw_zaxis(R ((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR%Qs c Cs|p |i\}}}}}}||||||||g||||||||g||||||||g}} } t|| | S(N(t get_w_limstzip( R tvalstminxtmaxxtminytmaxytminztmaxztxstystzs((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt unit_cubeYs %&cCs?|djo |i}n|i|}ti||}|S(N(RR#RLtproj3dt proj_points(R RBR#txyzsttcube((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt tunit_cube`s   cCs|i||}|d|df|d|df|d|df|d|df|d|df|d|df|d|df|d|df|d|df|d|df|d|df|d|dfg }|S( Niiiiiiii(RQ(R RBR#ttctedges((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt tunit_edgesgsc Cs|ii|t|_|i|_|i|_|i|_|i|_|i|_g}|i D]}||i ||fqf~}|i |i x)t |D]\}\}}||_qWg}|iD]}||i ||fq~}|i |i x)t |D]\}\}}||_qW|ii||ii||ii|ti||dS(N(R'tdrawtFalset_frameontget_projR#tvvecteyetget_axis_positionRtdo_3d_projectiontsorttreverset enumeratetzordertpatchesR:R=R?R( R trenderert_[1]tcoltzlisttiR6t_[2]tpatch((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRUys2     ,    ,    cCs|i}|i||i}|dd|ddj}|dd|ddj}|dd|ddj}|||fS(Niiii(R@RQR#(R RBRRtxhightyhightzhigh((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR[s  cKsdS(N((R txysR,((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytupdate_datalimscCstti|||f\}}}y:|i|i}}|dj o|i}nWntj o nX|iiti||gi | |dj o*|i iti||gi | n|i dS(N( tmapR tasarraytflattenRtAttributeErrorRtupdate_from_data_xyRtTRtautoscale_view(R tXtYtZthad_dataR4R5R6((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytauto_scale_xyzs$ & *cCs|i|ipdS|ipdS|o|i|iin|o|i|iin|o|i|i indS(N( R&R tget_autoscale_ont set_xlim3dRR9t set_ylim3dR<t set_zlim3dR(R tscalextscaleytscalez((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRts   cCsL|i\}}|i\}}|i\}}||||||fS(sGet 3d world limits.(t get_xlim3dt get_ylim3dt get_zlim3d(R RCRDRERFRGRH((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR@scOs\|djo ti|o|\}}n||jo|d8}|d7}n||fS(Ng?(RRtiterable(R txmintxmaxR+R,((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt_determine_limss   cOs"|i||}||i_|S(sSet 3D x limits.(RRR9(R R+R,tlims((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR{s cOs"|i||}||i_|S(sSet 3D y limits.(RRR<(R R+R,R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR|s cOs"|i||}||i_|S(sSet 3D z limits.(RRR9(R R+R,R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR}s cCs |iiS(sGet 3D x limits.(RR9(R ((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRscCs |iiS(sGet 3D y limits.(RR<(R ((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRscCs |iiS(sGet 3D z limits.(RR9(R ((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRscOsdS(N(R(R R+R,((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytclabelscCs dG|GHdS(Ntnumsteps((R R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytpanyscCs dG|GHdS(NR((R R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pytpanpyscCsd|_||_||_dS(Ni (R-RR(R RR((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRs  cCsti|idti|id}}|i\}}|i\}}|i\}}ti||||||} ti dddg} | dti |ti ||i } | dti |ti ||i } | dti ||i } ti | | | f}||_ | ||_|iti|i|_t|tidjoti d}nti d}|i |i }}ti|| |}ti||}ti|| }ti||}|S( sCreate the projection matrix from the current viewing position. elev stores the elevation angle in the z plane azim stores the azimuth angle in the x,y plane dist is the distance of the eye viewing point from the object point. ig?iiii(iii(iii(R tpiRRRRRRMtworld_transformationRtcosR-tsinRZRYtmodRtview_transformationtpersp_transformationtdot(R trelevtrazimRRtymintymaxtzmintzmaxtworldMtRtxptyptzptEtVtzfronttzbacktviewMtperspMtM0R#((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRXs0 )  ++  cCs{d|_|ii}|djoU|id|i}|id|i}|id|i}|||g|_ndS(Ntmotion_notify_eventtbutton_press_eventtbutton_release_event( Rtbutton_pressedtfiguretcanvast mpl_connectt_on_movet _button_presst_button_releaseR(R tcanvtc1tc2tc3((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR$3s   cCsRx$|iD]}|iii|q Wg|_ti||itddS(Ns axes3d.grid(RRRtmpl_disconnectRtclatgridR(R tcid((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyR<s    cCs)|i|_|i|i|_|_dS(N(tbuttonRtxdatatydatatsxtsy(R tevent((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRDs cCs d|_dS(N(RR(R R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRHscCsDy|i|SWn,tj o |ii}t||SXdS(s Return x string formatted. This function will use the attribute self.fmt_xdata if it is callable, else will fall back on the xaxis major formatter N(t fmt_xdatat TypeErrorR:tget_major_formatterR (R R4tfmt((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt format_xdataKs cCsDy|i|SWn,tj o |ii}t||SXdS(s Return y string formatted. This function will use the attribute self.fmt_ydata if it is callable, else will fall back on the yaxis major formatter N(t fmt_ydataRR=RR (R R5R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt format_ydataWs cCsJy|i|SWn2ttfj o |ii}t||SXdS(s Return z string formatted. This function will use the attribute self.fmt_zdata if it is callable, else will fall back on the yaxis major formatter N(t fmt_zdataRqRR?RR (R R6R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt format_zdatacs cCs|idjodS|idjod|i|ifS||f}|i}g}t|D].\}\}}|ti||||fqc~} | i | dd} || \}}|\} } } |\}}}t i | || |}t i ||||}||}||| |||}ti ||||i\}}}|i |}|i|}|i|}d|||fS(s Given the 2D view coordinates attempt to guess a 3D coordinate. Looks for the nearest edge to the point and then assumes that the point is at the same z location as the nearest point on the edge. tis!azimuth=%d deg, elevation=%d deg isx=%s, y=%s, z=%sN(R#RRRRRTR_RMtline2d_seg_distR]R thypott inv_transformRR(R txdtydtpRSRcRftp0tp1tldiststedgeitx0ty0tz0tx1ty1tz1td0td1tdtR6R4R5RIRJRK((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt format_coordos,  A  $cCs&|ipdS|idjodS|i|i}}|djodS||i||i}}|i\}}|i\}} ||} | |} |||_|_|idjo|djo|djodSt i |i || d|_ t i |i || d|_ |i |iiin|idjon|idjo|i\} } }}}}d| || }| | |}|||}|||}|i| || ||i|||||i|||||i |iiindS(sFMouse moving button-1 rotates button-3 zooms Niiiii(RR#RRRRRtget_xlimtget_ylimtart3dt norm_angleRRRXRRRUR@R{R|R}(R RR4R5tdxtdyRRRRtwthRCRDRERFRGRHtdftdz((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRsB    !!  cKsK|ii}|i||dj o|i|n|i||S(s Set xlabel. N(R:t get_labeltset_textRtupdate(R txlabeltfontdictR,tlabel((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt set_xlabels    cKsK|ii}|i||dj o|i|n|i||S(s Set ylabel.N(R=RRRR(R tylabelRR,R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt set_ylabels    cKsK|ii}|i||dj o|i|n|i||S(s Set zlabel.N(R?RRRR(R tzlabelRR,R((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt set_zlabels    cKs ||_dS(s& Set / unset 3D grid. N(t _draw_grid(R tonR,((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRscCs/ti||||}ti||||S(sAdd text to the plot.(RttextRt text_2d_to_3d(R R4R5R6R tzdirR((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRsc Osy|i}|idd}|idd}d}t|djoati|doMt|t|djo0ti|ddo||}|d7}n@t|djo,ti|do||}|d7}nti|ptit||}nti ||||||} x'| D]} t i | d|d|q<W|i ||||| S(so Plot 2D or 3D data. ========== ================================================ Argument Description ========== ================================================ *xs*, *ys* X, y coordinates of vertices *zs* z value(s), either one for all points or one for each point. *zdir* Which direction to use as z ('x', 'y' or 'z') when plotting a 2d set. ========== ================================================ Other arguments are passed on to :func:`~matplotlib.axes.Axes.plot` RKiRR6i( thas_dataRtlenRRt is_scalarR tonesRtplotRt line_2d_to_3dRy( R RIRJR+R,RxRKRtargsitlinestline((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyRs& '5 ' c& Os|i}|i\}}ti|ti|ti|} } } |idd} |idd} |idd}titi|}|idd }g}g}g}xti d|d| D]}x{ti d|d| D]`}g}g}x\|| f|| f|| fgD]9\}}|||t ||| d!}|t |d|| |t ||| d!}|t |d|| |t ||| dd }|d d d }|||t ||| dd }|d d d }|i |d|d |d|d gti ||||f}|i |q*Wt|}tig}g}d } x@|D]8}!|!|jo%|i |!|!}| |!d 7} qqW|i ||i | t|ti|dti|d}"ti|d ti|d}#|i ti|"|#qWqWti|||}$|d j o'|$iti||$idn |i||}%|$i|%|i|$|i|||||$S( s Create a surface plot. By default it will be colored in shades of a solid color, but it also supports color mapping by supplying the *cmap* argument. ========== ================================================ Argument Description ========== ================================================ *X*, *Y*, Data values as numpy.arrays *Z* *rstride* Array row stride (step size) *cstride* Array column stride (step size) *color* Color of the surface patches *cmap* A colormap for the surface patches. ========== ================================================ trstridei tcstridetcolortbtcmapiiNigi(RtshapeR t transposeRRRtto_rgbatgetRtarangetmintappendt concatenateRARtcrossRtPoly3DCollectiont set_arrayR(t _shade_colorstset_facecolorstadd_collectionRy(&R RuRvRwR+R,RxtrowstcolsttXttYttZRRRRtpolystnormalstavgztrstcstpstcornerstattatztoptzlefttzbasetzrightR6tlastptps2tavgzsumRtv1tv2tpolyctcolors((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt plot_surface'sh /" "39()    $$!   cCs|g}xo|D]g}ti|dti|d}ti|dti|d}|iti||q W|S(s Generate normals for polygons by using the first three points. This normal of course might not make sense for polygons with more than three points not lying in a plane. iii(R RR R (R tpolygonsRtvertsR(R)((sA/usr/lib64/python2.6/site-packages/mpl_toolkits/mplot3d/axes3d.pyt_generate_normalsws$$c Csg}xG|D]?}|ti|d}|iti|dddgq Wti|}ti|}t||djoptt ||t ||}|i }d|d s