MPG Dataset SurfaceΒΆ
This example is based on the Auto MPG dataset.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm,colors,colormaps
import s3dlib.surface as s3d
import s3dlib.pntcloud as ptc
import csv as csv
# 1. Get data to examine ...........................................
def getMPG(val=2) :
# Z 1 2 X 4 Y 6
dataNames = [ 'mpg','cylinders','displacemnet','horsepower','weight','acceleration','model_year']
csv_data = []
with open('data/mpg.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader: csv_data.append(row)
geom = np.array([ c[0:7] for c in csv_data ][1:]).astype(float).T
tgeom = np.array([geom[3],geom[5],geom[0]])
scalar_values = np.array(geom[val])
return tgeom.T, scalar_values, dataNames[val]
input_coor, mpg_color, vName = getMPG()
norm = colors.Normalize(np.min(mpg_color),np.max(mpg_color) )
vals = norm(mpg_color)
data = np.column_stack((input_coor,vals))
# 2. Setup and map surface .........................................
pdg,drez,relden,cmap = 0.8,4,0.05,'jet'
domain = [ [25,250], [5,25], [0,50] ]
cloudObj = ptc.Point3DCloud(drez,cmap=cmap,domain=domain)
cloudObj.map_vals_from_sampdens(input_coor,pdg)
surface = cloudObj.valsurf(relden)
surface.map_vertvals_from_samples(data,domain)
surface.map_cmap_from_vertvals(cmap)
# 3. Construct figures, add surfaces, and plot ....................
fig = plt.figure(figsize=(10,4))
# ....................
title = 'automobile dataset surface\n( pdg = {:.2f}, relden = {:.2f} )'.format(pdg,relden)
fig.text(.27,0.9,title,ha='center')
ax = fig.add_subplot(121, projection='3d', aspect='equal')
ax.set(xlim=domain[0], ylim=domain[1], zlim=domain[2],
xlabel='HP',ylabel='acc.',zlabel='MPG')
ax.view_init(elev=22,azim=31 )
ax.add_collection3d(surface.shade())
s3d.add_boxCorner(ax,domain)
# ....................
title = 'automobile data\ndataset ('+str( len(mpg_color))+')'
fig.text(.7,0.9,title,ha='center')
ax = fig.add_subplot(122, projection='3d', aspect='equal')
ax.set(xlim=domain[0], ylim=domain[1], zlim=domain[2],
xlabel='HP',ylabel='acc.',zlabel='MPG')
ax.view_init(elev=22,azim=31 )
ax.scatter(*input_coor.T, s=40, c=colormaps[cmap](vals) ,edgecolor='k')
s3d.add_boxCorner(ax,domain)
# ....................
scmp = cm.ScalarMappable(norm=norm,cmap=cmap)
cbar = plt.colorbar(scmp, ax=ax, shrink=0.8, pad=.1 )
cbar.set_label(vName, rotation=270, labelpad = 15)
fig.tight_layout(pad=3)
plt.show()
The surface shape is controlled by two arguments pdg and relden. The effect of these two arguments is exemplified in the figure below:
import numpy as np
import matplotlib.pyplot as plt
import s3dlib.surface as s3d
import s3dlib.pntcloud as ptc
import csv as csv
# 0. control parameters.
drez,cmap = 4, 'jet'
domain = [ [25,250], [5,25], [0,50] ]
pdg_relden = [ [0.80,.05], [0.80,0.17], [0.4,0.05], [0.4,0.17] ]
# 1. Get data to examine ...........................................
def getMPG(val=2) :
# Z 1 2 X 4 Y 6
dataNames = [ 'mpg','cylinders','displacemnet','horsepower','weight','acceleration','model_year']
csv_data = []
with open('data/mpg.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader: csv_data.append(row)
geom = np.array([ c[0:7] for c in csv_data ][1:]).astype(float).T
tgeom = np.array([geom[3],geom[5],geom[0]])
scalar_values = np.array(geom[val])
return tgeom.T, scalar_values, dataNames[val]
dcoor, sVals, vName = getMPG()
data = np.column_stack((dcoor, sVals))
# 3. Construct figures, add surfaces, and plot ....................
fig = plt.figure(figsize=(5.5,5.5))
for i, [pdg, relden] in enumerate(pdg_relden) :
ax = fig.add_subplot(221+i, projection='3d', aspect='equal')
ax.set(xlim=domain[0], ylim=domain[1], zlim=domain[2])
ax.tick_params(labelcolor='w')
ax.view_init(elev=22,azim=31 )
title = '( pdg = {:.2f}, relden = {:.2f} )'.format(pdg,relden)
colp = 0.25 if i%2==0 else 0.75
rowp = 0.96 if i<=1 else 0.475
fig.text(colp,rowp,title,ha='center',va='center',fontsize='medium')
cloudObj = ptc.Point3DCloud(drez,domain=domain)
cloudObj.map_vals_from_sampdens(data,pdg)
surface = cloudObj.valsurf(relden,name='swiss roll')
surface.map_vertvals_from_samples(data,domain)
surface.map_cmap_from_vertvals(cmap)
surface.triangulate(1)
ax.add_collection3d(surface.shade())
s3d.add_boxCorner(ax,domain)
fig.tight_layout(pad=1)
plt.show()
