12345678910111213141516171819202122232425262728293031323334 |
- """Histogram along a PCA axis"""
- import numpy as np
- from vedo import Points, pca_ellipse, Arrow2D, Goniometer
- from vedo.pyplot import Figure, histogram
- data = np.random.randn(1000, 3)
- pts = Points(data).color('#1f77b4').ps(6)
- pts.scale([2,1,0.01]).rotate_z(45).shift(5,1) # rotate and shift!
- # Recover the rotation pretending we only know the points
- # Fit a 1-sigma ellipse to the points
- elli = pca_ellipse(pts)
- ec, e1, e2 = elli.center, elli.axis1, elli.axis2
- arrow1 = Arrow2D(ec, ec - 3*e1)
- arrow2 = Arrow2D(ec, ec + 3*e2)
- angle = np.arctan2(e1[1], e1[0]) * 180/np.pi
- mypts = pts.clone() # rotate back to make the histo:
- mypts.shift(-ec).rotate_z(-angle)
- histo = histogram( # a Histogram1D(Figure) object
- mypts.points[:,1], # grab the y-values (PCA2)
- ytitle='', title=' ', # no automatic title, no y-axis
- c='#1f77b4', # color
- aspect=16/9, # aspect ratio
- )
- histo.rotate_z(90 + angle).pos(ec - 6*e1)
- gon = Goniometer(ec-5.5*e1, ec, [ec[0]-5.5*e1[0], ec[1],0]).z(0.2)
- fig = Figure([0,14], [-4,9], aspect="equal", title=__doc__)
- fig += [pts, elli.z(-0.1), arrow1, arrow2, gon, histo]
- fig.show(zoom='tight').close()
|