## Welcome to VisML Lab Session! ### Hands-on Visualization for Machine Learning We'll start with Vega-Lite fundamentals that will be essential for ML visualizations later in the course. ## Week 2 Lab Overview |User Interface|Graphics Library|Purpose| |:--|:--|:--| |[observablehq.com](https://observablehq.com)|[Vega-Lite](https://vega.github.io/vega-lite/)|Foundation for ML data visualization| ### Lab Activities 1. **Setup** - Create Observable account - Explore the interface - Fork a starter notebook 2. **First Visualizations** - Create basic Vega-Lite charts - Explore different mark types - Modify visual encodings - Talk about Tidy Data ## Step 1: Setting Up Observable ### Creating Your Account 1. Go to [observablehq.com](https://observablehq.com) 2. Sign up with your NYU email 3. Verify your email address 4. Complete your profile ### Understanding the Interface :::: {.columns} ::: {.column width="50%"} #### Key Features - Interactive notebooks - Live code execution - Built-in datasets - Version control ::: ::: {.column width="50%"} #### Navigation - Home: Your notebooks - Explore: Community notebooks - Documentation: Help & tutorials - Search: Find examples ::: :::: ## Step 2: Forking Notebooks, Data ### About Forking Forking is a key function provided by **Observable** and is essential when working with different notebooks. We've made an **Observable** notebook specifically for this week's lab! Let's fork it. 1. Navigate to [Week 1 Lab Notebook](https://observablehq.com/@rk2546/2025-infovis-cse_week-1-lab 2. ) 3. Scroll to the top-right of the notebook. You should see some function buttons, such as "Share" and "Fork this notebook". 4. Select "Fork this notebook", and save it into as your own **Observable** notebook. Once your fork the notebook, you are free to start making any and all adjustments as you prefer! ## Step 3: Understanding Charts ### Basic Structure ```javascript vl.markCircle() // Make a scatter chart .data(cars) // Using the cars data (below) .encode( vl.x().fieldQ("Horsepower"), // For x, use the Horsepower field vl.y().fieldQ("Miles_per_Gallon"), // For y, use the Miles_per_Gallon field vl.tooltip().fieldN("Name") // For tooltips, show the Name field ) .render() // Draw the chart ``` ### Key Components - **mark\**: Visual representation (point, bar, line, etc.) - **Data**: The data source to render - **Encoding**: Map data to visual properties ## Step 3a. Vega-Lite Mark Types ### Common Marks :::: {.columns} ::: {.column width="33%"} #### Points & Lines - `point`: Scatterplots - `line`: Line charts - `area`: Area charts - `trail`: Connected points ::: ::: {.column width="33%"} #### Bars & Rectangles - `bar`: Bar charts - `rect`: Heatmaps - `square`: Equal-width rectangles ::: ::: {.column width="33%"} #### Other - `circle`: Fixed-size circles - `text`: Text labels - `tick`: Tick marks - `arc`: Pie charts ::: :::: ## Exercise 1: Changing Chart Types ### Task Replace `markCircle()` to generate different scatter plots using point, square, and tick. ### Starter Code ```javascript vl.markCircle() // TO-DO: Change this to show point, square and tick plots instead. .data(cars) .encode( vl.x().fieldQ("Horsepower"), vl.y().fieldQ("Miles_per_Gallon"), vl.tooltip().fieldN("Name") ) .render() ``` ## Step 3b. Data Types |Data Type|API Equivalent|Description|Examples| |:--|:--|:--|:--| |Quantitative|\`fieldQ()\`| numerical magnitudes | 1, 1.2, 3, 4, $1,230.60| |Temporal|\`fieldT()\`| corresponding to Date values | 2019-01-02T00:01:23Z, 1996| |Nominal|\`fieldN()\`| unordered, categorical data | Audi, Ford, Hyundai, Tesla| |Ordinal|\`fieldO()\`| like nominal, but with an inherent order | small, medium, large| ```javascript vl.markCircle() .data(cars) .encode( vl.x().fieldQ("Horsepower"), // This is a Quantitative type vl.y().fieldQ("Miles_per_Gallon"), // This is a Quantitative type vl.tooltip().fieldN("Name") // This is a Nominal type ) .render() ``` ## Step 3c. Visual Encodings ### Encoding Channels | Channel | Use Case | Data Types | |---------|----------|------------| | `x`, `y` | Position | Quantitative, Ordinal, Temporal | | `color` | Category distinction | Nominal, Ordinal, Quantitative | | `size` | Magnitude | Quantitative | | `shape` | Category distinction | Nominal | | `opacity` | Emphasis/de-emphasis | Quantitative | | `tooltip` | Details on demand | Any | ## Exercise 2: Bar Chart ### Task Modify the code below in the following ways: 1. Modify the x-axis to display "Year". 2. Modify the y-axis to display "Horsepower". 3. Modify the tooltip to display "Origin" instead of "Name". ### Starter Code ```javascript vl.markCircle() .data(cars) .encode( vl.x().fieldQ("Horsepower"), // TO-DO: Change this to represent "Year" vl.y().fieldQ("Miles_per_Gallon"), // TO-DO: Change this to represent "Horsepower" vl.tooltip().fieldN("Name") // TO-DO: Change this to represent "Origin" ) .render() ``` ## Step 3c. Render Settings **Vega-Lite** offers some different rendering options. - **Rendering as SVG**: Rather than rendering the chart as an HTML \