Masthead

3D Plotting

Introduction

The following example is from Chuck Swanson, a previous student in GSP 318. The code requires the numpy, scipy, and matplotlib packages. It also uses mpl_toolkits which is in matplotlib.

#---------------------------------------------------------------------------------------------------------
#  3D plotting tool to plot water surface elevation data output by EFDC Explorer 7.1
#  Hydrodynamic modeling software.  Data being plotted is exported as "wselev.plt"
#  the input file must have this name to be compatible with this program
#
#  Author:  Chuck Swanson
#  final project for GSP 118 Spring 2014
#
#  Required Packages:
#    matplotlib
#    scipy
#  
#  Required Inputs:
#    "wselev.plt" water surface elevation file from EFDC Explorer 7.1
#     file is formatted as a tecplot file
#
#  Outputs:
#  3D surface plot
#  
#----------------------------------------------------------------------------------------------------------

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
import Tkinter, tkFileDialog, tkMessageBox
from mpl_toolkits.mplot3d import Axes3D
from scipy.interpolate import griddata

try:
    # Get EFDC Explorer 7.1 output file from user and open a new output file in the same directory
    root = Tkinter.Tk() # create Tkinter window
    root.withdraw() # close Tkinter window
    InputFilePath = tkFileDialog.askopenfilename() # use Windows Explorer to select file
    if not InputFilePath.endswith("wselev.plt"): raise Exception

# check if input file selected is the correct file, otherwise abort
except Exception:
    tkMessageBox.showerror("Incorrect File","I'm sorry, this module is only compatible")
    quit()
 
 
#-------------------------------------------------------------------------------------------------
# The following code adapted from: 
#   http://stackoverflow.com/questions/12730436/matplotlib-plotting-non-uniform-data-in-3d-surface

# open input file and use numpy implicit function to read data to x, y, and z 1D arrays
with open(InputFilePath,"r") as InputFile:
    my_data = np.genfromtxt(InputFile, delimiter='  ',skiprows=3)
    X = my_data[:,0]
    Y = my_data[:,1]
    Z = my_data[:,2]

# create figure object and assign visual aspect
fig = plt.figure(figsize=plt.figaspect(0.5))
ax = fig.add_subplot(1, 2, 1, projection='3d')

# assign grid arrays for plotting and interpolate z-data using griddata function
#  griddata methods:
#    "nearest" next nearest neighbor interpolation applies z values at grid location from
#       nearest data value
#    "cubic" uses cubic spline interpolation
#    'linear" uses linear interpolation (only used for regularly spaced data)
xi = np.linspace(X.min(),X.max(),100)
yi = np.linspace(Y.min(),Y.max(),100)
zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='nearest')

# create 3D contour mesh plot
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,color='k')
ax = fig.add_subplot(1, 2, 2, projection='3d')
xig, yig = np.meshgrid(xi, yi)

# create 3D surface plot
surf = ax.plot_surface(xig, yig, zi, linewidth=0)

# open plotting window for viewing
plt.show()        

 

© Copyright 2018 HSU - All rights reserved.