Saturday, November 16, 2024

Day 6: 30-days to learn rgl, plotly, and gganimate - Create an interactive 3D plot with rgl that uses various viewpoints or angles to simulate rotation

rglWebGL


Step 1: Install and Load the rgl Package

Ensure that you have the rgl package installed and loaded in your R environment.

# Install rgl if not already installed
if (!require("rgl")) install.packages("rgl")
 
# Load the rgl package
library(rgl)

Step 2: Prepare a Dataset

For demonstration purposes, create or use a sample 3D dataset (e.g., random points in 3D space).

# Sample dataset with random 3D points
set.seed(123)
n <- 100
x <- rnorm(n)
y <- rnorm(n)
z <- rnorm(n)
colors <- rainbow(n)

Step 3: Create a Basic 3D Plot

Use plot3d() to create a basic 3D scatter plot.

# Create a 3D scatter plot
plot3d(x, y, z, col = colors, size = 5, type = 's', xlab = "X-axis", ylab = "Y-axis", zlab = "Z-axis")

Step 4: Enhance the Plot with Customization

Add customizations like grid lines, labels, and lighting for better visualization.

# Add grid lines
grid3d("x")
grid3d("y")
grid3d("z")
 
# Enhance lighting
light3d(specular = "white")

Step 5: Set Up Rotation Parameters

Define a sequence of angles to rotate the plot and simulate a continuous rotation.

# Define rotation parameters
angles <- seq(0, 360, by = 5) # 5-degree increments

Step 6: Rotate the Plot Programmatically

Use a loop to rotate the plot around a specific axis (e.g., the z-axis).

# Rotate around the z-axis
for (angle in angles) {
  view3d(theta = angle, phi = 30) # Rotate theta; phi is the vertical angle
  Sys.sleep(0.1)                 # Pause for 0.1 seconds for smooth transition
}

Step 7: Export the Visualization

Save the interactive 3D plot as an HTML widget or image file for sharing or further use.

# Save as an interactive HTML file
rglwidget() %>% htmlwidgets::saveWidget("3D_plot_rotation.html")
 
# Save as a static image (PNG)
rgl.snapshot("3D_plot_rotation.png")

Step 8: Test and Adjust

  • Experiment with different rotation axes (x, y, or z) by modifying view3d() parameters.
  • Adjust the speed of rotation using Sys.sleep().

Outcome

By the end of this exercise, you will have an interactive 3D plot that smoothly rotates, providing a dynamic visualization of the data. You can integrate this plot with tools like plotly or embed it into web presentations for a polished output.


Friday, November 15, 2024

Day 5: 30-days to learn rgl, plotly, and gganimate - Practice rgl customization (lighting, colors, sizes) and apply labels and text to 3D points



Step 1: Create a Basic 3D Plot

We'll begin by creating a simple 3D scatter plot to serve as our canvas for customization.

# Load the rgl package
library(rgl)
 
# Sample data for 3D scatter plot
set.seed(123)
x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)
 
# Basic 3D scatter plot
plot3d(x, y, z, type = "s", col = "blue", size = 2)

This creates a simple 3D scatter plot with blue points.

Step 2: Customize Point Colors, Sizes, and Shapes

Adjusting colors, point sizes, and shapes can make the plot more visually informative.

# Customizing colors, sizes, and shapes
point_colors <- rainbow(length(x))  # Assign each point a different color
plot3d(x, y, z, col = point_colors, size = 5, type = "s")  # Increased size

In this example:

  • Each point gets a unique color.
  • size controls the size of the points (default is smaller; try 5 for larger points).
  • type = "s" sets the points as spheres.

Step 3: Add Lighting Effects

Lighting can add depth and realism to your plot.

# Adding lighting effects
open3d()  # Open a new rgl window
plot3d(x, y, z, col = point_colors, size = 5, type = "s")
 
# Adjust lighting - you can experiment with these settings
rgl.light(ambient = "#FFFFFF", specular = "#BBBBBB", diffuse = "#888888", x = 1, y = 1, z = 1)

Lighting parameters:

  • ambient: Light that scatters evenly.
  • specular: Shiny highlights on objects.
  • diffuse: Light scattered by the surface.

Experiment with these values to get the desired effect.

Step 4: Customize Camera Angles and Views

You can set the viewing angle to emphasize specific points or sections.

# Adjust camera angle
rgl.viewpoint(theta = 30, phi = 30, fov = 60)

Parameters:

  • theta and phi: Control the angles from which the plot is viewed.
  • fov: Field of view; increasing it creates a wide-angle view, while lowering it zooms in.

Step 5: Add Labels and Text to 3D Points

Labels help make your data points identifiable, enhancing interpretability.

# Adding labels to each point
text3d(x, y, z, texts = paste("Pt", 1:10), col = "black", cex = 0.8)

Explanation:

  • text3d: Adds text at each point’s location.
  • texts: Vector of labels for each point.
  • col and cex: Customize text color and size.

Step 6: Experiment with Size and Color Gradients

You can set sizes and colors based on data values to make plots more meaningful.

# Adjust point sizes and color gradient based on z-values
size_values <- rescale(z, to = c(3, 10))  # Scale sizes between 3 and 10
color_gradient <- heat.colors(length(z))
 
plot3d(x, y, z, col = color_gradient, size = size_values, type = "s")

Step 7: Adding Legends for Better Interpretation (Optional)

Legends help viewers interpret what different colors or sizes represent.

# Add a simple legend to the plot
legend3d("topright", legend = c("Low", "Medium", "High"), pch = 16, col = c("blue", "green", "red"), cex = 1.2)

Step 8: Save the Interactive 3D Plot (Optional)

To save your 3D plot as an HTML file for interactive viewing:

# Save as HTML file for interactive use
rglwidget() %>% htmlwidgets::saveWidget("3Dplot.html")

This file can then be shared or viewed interactively in a browser.

Summary

Today, you customized an rgl 3D plot by:

  • Adjusting lighting, colors, sizes, and shapes.
  • Adding text labels to 3D points for better interpretation.
  • Experimenting with camera angles and views.