"""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()