Seaborn is a popular Python visualization library built on top of Matplotlib. It provides a high-level interface for creating attractive statistical graphics with ease.
While Seaborn excels at 2D data visualization, it does not natively support 3D plotting. However, by utilizing Matplotlib‘s 3D graphics capabilities, we can create and customize a wide variety of 3D plots with Seaborn styling.
In this comprehensive guide, we will explore the following topics:
- Overview of 3D plots and their use cases
- Using Matplotlib to create 3D scatter, wireframe, surface, and contour plots
- Customizing 3D visualizations with Seaborn styles and color palettes
- Advanced techniques like projections, rotations, lighting effects
- Real-world examples and applications using weather, terrain, and financial datasets
So let‘s get started with the fundamentals!
Overview of 3D Data Visualization
3D plots are useful for visualizing data that has three dimensions. For example:
- Weather or climate data with latitude, longitude, and a measured variable like temperature or pressure
- GPS tracking data with time, latitude, longitude coordinates
- Physics simulations with multidimensional input and output parameters
- Financial data with time, stock symbols, and trading volumes/prices
By extending visualization into the third dimension, we can gain deeper insights from complex multidimensional datasets. Patterns and relationships that were obscured in 2D can leap out in 3D plots.
Common types of 3D plots include:
3D Scatter Plots – used to plot data points in 3D space, like bubble charts extended into 3D
3D Wireframe Plots – connect data points together with lines to reveal the underlying structural shape
3D Surface Plots – map a 2D grid onto a continuous 3D surface function
3D Contour Plots – similar to surface plots but with contour lines showing intersections of the surface height
Next we will look at how to make each of these plot types with Matplotlib and customize them using Seaborn.
Creating 3D Scatter Plots with Seaborn Styling
The most straightforward way to visualize 3D data is by extending a scatter plot into the third dimension. Here is an example 3D scatter plot showing 200 random data points:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Set up figure and 3D axes
fig = plt.figure(figsize=(6, 6))
ax = plt.axes(projection=‘3d‘)
# Generate 200 random data points
zdata = 15 * np.random.random(200)
xdata = np.sin(zdata) + 0.1 * np.random.randn(200)
ydata = np.cos(zdata) + 0.1 * np.random.randn(200)
# Plot scatter plot
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap=‘Greens‘);
The key steps are:
-
Create a new 3D axes object from matplotlib by passing
‘3d‘
to.axes()
. -
Generate x, y, z data arrays to plot
-
Plot the points using
.scatter3D()
and pass in the coordinates
We can also use Seaborn‘s styles and color palettes to customize the plot aesthetics:
# Use seaborn styling
sns.set_style("whitegrid")
# Plot with custom Seaborn palette
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap=sns.color_palette("rocket"));
This demonstrates the pattern for building on Matplotlib‘s 3D engine with Seaborn‘s high-level styling.
Next let‘s look at visualizing 3D surfaces.
Creating 3D Surface Plots
Surface plots reveal continuous functions in 3D space, with the height shown via color intensity or contours. They can elegantly display complex surfaces so we can understand the shape of multivariate data.
Here is an example plotting a 3D quadratic bowl surface:
# Function to plot
def quadratic_bowl(x, y):
return 50 - (x**2 + y**2)
# Input data grid
resolution = 40
x = np.linspace(-4, 4, resolution)
y = np.linspace(-4, 4, resolution)
X, Y = np.meshgrid(x, y)
# Get height values
Z = quadratic_bowl(X, Y)
# Draw surface plot
fig = plt.figure(figsize=(6, 5))
ax = plt.axes(projection=‘3d‘)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap=‘viridis‘, edgecolor=‘none‘)
ax.set_title(‘Quadratic Bowl‘);
The key steps are:
-
Define a function to plot over a grid
-
Create x and y data arrays using
np.linspace()
-
Generate a meshgrid with
np.meshgrid()
-
Evaluate the function over the grid to get a height (z) matrix
-
Plot the surface using
ax.plot_surface()
and draw grid lines withrstride/cstride
-
Customize the plot colors using a Matplotlib colormap
This reveals the 3D bowl shapequadratic function. More complex surfaces can be visualized as well.
Next let‘s look at contour plots.
Creating 3D Contour Plots
While a surface plot colors the entire 3D landscape, a contour plot only draws contour lines at certain height thresholds, revealing intersections of the surface.
Here is an example with contour lines showing a quadratic bowl:
def quadratic_bowl(x, y):
return 50 - (x**2 + y**2)
resolution = 25
x = np.linspace(-4, 4, resolution)
y = np.linspace(-4, 4, resolution)
X, Y = np.meshgrid(x, y)
Z = quadratic_bowl(X, Y)
# Draw contour plot
fig = plt.figure(figsize=(8, 6))
ax = plt.axes(projection=‘3d‘)
ax.contour3D(X, Y, Z, 50, cmap=‘binary‘)
ax.set_title(‘Contour Plot of Quadratic Bowl‘);
The process is similar to a 3D surface, but using .contour3D()
instead. By adjusting the contour threshold and colormap, we can reveal different insights into the 3D shape.
Next we‘ll look at another common plot type – the 3D wireframe.
Creating 3D Wireframe Plots
A wireframe plot shows the underlying data point structure by connecting points together with lines. This reveals the core shape of the data landscape.
Here is an example wireframe over the quadratic bowl surface:
fig = plt.figure(figsize=(6, 5))
ax = plt.axes(projection=‘3d‘)
ax.plot_wireframe(X, Y, Z, color=‘black‘)
ax.set_title(‘Wireframe Over Quadratic Bowl‘);
The wireframe clearly reveals the parabolic bowl shape defined by the quadratic function, with depth fading from the center.
Customizing Plots with Seaborn Styles
Now that we have covered the foundation of generating different 3D plot types with Matplotlib, let‘s discuss how Seaborn can help customize and improve the plot aesthetics.
Here is an example enhancing the scatter plot with Seaborn styles:
sns.set_style("whitegrid")
ax.scatter(xdata, ydata, zdata, c=zdata, cmap=sns.cubehelix_palette(as_cmap=True))
ax.view_init(60, 35)
ax.set_xlabel(‘X‘)
ax.set_ylabel(‘Y‘)
ax.set_zlabel(‘Z‘);
The key customizations are:
-
Styles – Use
sns.set_style()
to change plot background -
Colors – Apply a custom color palette with
.cubehelix_palette()
-
Angles – Rotate the view with
ax.view_init(elev, azim)
-
Labels – Improve axes labels with
set_xlabel()
, etc.
Many other refinements can enhance clarity and aesthetics like:
- Adding axis tick marks and custom limits
- Changing transparency and lighting
- Annotating points of interest
- Tightening layout spacing
This is where Seaborn‘s high-level interface accelerates plot styling.
Now let‘s apply these principles to visualize some real-world 3D data.
Example Application – Visualizing Weather Data
Weather data often has a geographic component lending itself naturally to 3D visualization. Let‘s demonstrate by loading and plotting real 3D weather data using MetPy:
import metpy.calc as mpcalc
import xarray as xr
# Download sample data
ds = xr.open_dataset(‘https://thredds.ucar.edu/thredds/dodsC/casestudies/python-gallery/Iowa_Storm/iowa_20170524_ruc13.nc‘)
# Pull out 3D temperature field
temp = ds[‘Temperature_isobaric‘].sel(vertical=500,
time=ds.time.data[1]).squeeze()
lats = ds[‘lat‘].data
lons = ds[‘lon‘].data
# Contour plot
fig = plt.figure(figsize=(12,5))
ax = fig.add_subplot(111, projection=‘3d‘)
cf = ax.contourf(lons, lats, temp, zdir=‘z‘, offset=250, cmap=‘RdBu_r‘)
c = fig.colorbar(cf)
ax.set_xlabel(‘Longitude‘)
ax.set_ylabel(‘Latitude‘)
ax.set_title(‘500 mb Temperature‘);
This plots a 3D temperature contour map, revealing a wave pattern in the upper atmosphere over Iowa. The kinds of insights available only become clear through 3D visualization!
By layering on Seaborn styles and customizations, the full context comes to light. 3D data storytelling fosters deeper understanding.
Final Thoughts
Although Seaborn does not offer native 3D graphics, we can utilize Matplotlib‘s 3D engine to open up multilayered data exploration. Scatter plots, surfaces, contours, and wireframes each provide unique windows into the third dimension.
By combining Matplotlib‘s foundation with Seaborn‘s beautiful styling, the possibilities for immersive 3D data visualization shine through. Uncover deeper insights from complex data as multidimensional relationships leap off the screen through precise 3D representations.
So don your 3D glasses and start discovering!