2025–26 / Bartlett School design project · Data-driven design
Earthquake: Data into Space
A design workflow connecting Jupyter, Python, Blender, and Processing
This earthquake study turns visual features, narrative signals, and geophysical records into computable design variables. Collection, cleaning, analysis, and fusion in Jupyter lead to Python-driven architectural fragments, ground fractures, and animated scenes in Blender, followed by particles, waves, and real-time feedback in Processing.
My contribution
Python data processing, design mappings, and spatial visualisation
Project stage
Multimodal analysis, procedural modelling, and real-time visualisation
01
From data to design
How can earthquake data become rules for spatial form and dynamic behaviour?
Statistics, photographs, and news each describe different aspects of earthquakes. This project converts those descriptions into computable features and a shared parameter interface, connecting analysis, procedural modelling, and real-time visualisation across tools.
240cleaned images
232news titles and summaries
240fusion design samples
20spatial instances
01 / Jupyter · Python
Collect and clean
Collect images, text, and seismic records; remove duplicates and structure the data.
02 / Python
Analyse and fuse
Extract features, standardise, cluster, and reduce dimensions into shared design parameters.
03 / Blender · Python
Rules and space
Translate parameters into fragments, ground displacement, fractures, waves, and dust.
04 / Processing
Behaviour and feedback
Read records sequentially to drive particles, propagating waves, and a data panel.
The spatial field: shared rules generate distinct, comparable instances.02
Images and visual features
icrawler collects images of collapsed buildings, urban rubble, and rescue operations. Invalid files and hash-based duplicates are removed. OpenCV and PIL extract average brightness, grayscale contrast, and Canny edge density from the remaining 240 images.
Image-sample collage: from visual references to computable features.
Edge density, contrast, and darkness form damage_proxy, a design cue for fragmentation. It is an approximation based on visual features, rather than a measured structural-damage rating. Standardised features enter four K-means groups, with PCA used to inspect their distribution.
Four cluster counts: 71 / 54 / 78 / 37.PCA projection reveals relationships between visual features.
Inspect the original Python feature and clustering logic
YOLOv8 records person_count and total_objects, adding signals for later fragment density and spatial complexity.
Detected peopleDetected objects
03
Text and narrative signals
Earthquake-related headlines and summaries are combined, deduplicated, and cleaned into 232 records. Keywords such as damage, death, rescue, and collapse are extracted. TextBlob polarity distinguishes positive, neutral, and negative wording, turning narrative content into design variables.
News keyword frequenciesText polarity describes wording; it does not measure affected people’s emotions.
Count Vectorizer and TF-IDF representations are compared. TF-IDF features enter four K-means clusters, and PCA displays a two-dimensional projection. Keywords suggest instability and collapse, while clusters and polarity introduce variation in form and motion.
Text groupsTwo-dimensional text-feature projection
04
Seismic records and data fusion
Date, magnitude, depth, latitude, and longitude come from the Significant Earthquakes, 1965–2016 dataset. Pandas removes invalid records and normalises variables with different units into a shared numerical interface.
Magnitude distribution in the sampleDepth and magnitude: inspect the ranges and distribution of variables.
The fusion notebook adds disaster-text samples and satellite-tile features, comparing TF-IDF, Sentence-BERT, and image representations. Reduced features are standardised alongside numerical variables and emotion-intensity signals before five-group K-means clustering. The output contains 240 design samples.
Five clusters after multimodal fusionLongitude, latitude, and magnitude in three dimensions
Semantic labels generated by rules or a modelKeyword distribution of the disaster-text sample
Scope of the fusion
Image and news analyses are separate branches. The final fusion pairs seismic records, disaster texts, and image features by sample without establishing a time-and-location match to the same event. Emotion and fragmentation signals explore design parameters in a data-driven generative experiment.
05
Python design mappings
Data translation makes the connection between features and design tools explicit. Each parameter has an input, a mapping, and a spatial effect. CSV acts as the interface between Jupyter, Blender, and Processing. Select a source sample below to inspect how magnitude and depth change its parameters.
DATA → PARAMETERS
Select a record to inspect its design parameters
240 design samples
Cluster 0Cluster 1Cluster 2Cluster 3Cluster 4
001 / 240
Magnitude
6.1
Depth
60.0 km
Geometry scale
1.667 ×
Vertical offset
-0.087
Fragmentation
0.600
Material group
3
scale = 1 + magnitude_norm × 4 z = −depth_norm
Values come directly from the original final_fusion_data.csv. Clusters combine numerical, semantic, and image features. Sample pairings are design experiments, rather than verified matches to the same earthquake event.
Input variable
Mapping rule
Design effect
magnitude_norm
1 + magnitude_norm × 4
Geometry scale and shake amplitude
depth_norm
z = −depth_norm
Vertical displacement
longitude_norm / latitude_norm
x / y
Normalised spatial coordinates
emotion_intensity
fragmentation / noise
Fragmentation and disturbance intensity
emotion_label
rotation_chaos
Rotation and motion behaviour
cluster_id
material_index
Material or asset family
Inspect the original Python mapping and export logic
Python imports the data into Blender. Height extrusion and planar distribution first test the mappings; clustering density, structural fracture, emissive cracks, and epicentral waves follow. These five complete model views from the report show the progression from direct mapping to integrated spatial composition.
01
Direct extrusion
Test the relationship between values and height.
02
Spatial distribution
Spread individual objects into a comparable spatial field.
03
Clustering and density
Use grouping and density to organise local structures.
04
Fragmentation and instability
Introduce variation in orientation, fracture, and irregularity.
05
Integrated composition
Integrate height, density, fractures, and waves in one scene.
From one scene to multiple instances
After testing the rules, 20 parameter combinations form a grid for comparison. Each instance combines architectural fragments, displaced ground, fractures, waves, rubble, and dust. Data influences scene density, deformation, and motion intensity.
Compare different data conditions under shared rules.Images become surface textures; data parameters drive scale and disturbance.Inspect Blender Python programming and scene development07
From space to live behaviour
The exported Blender model and final_fusion_data.csv enter Processing. Every 25 frames, the program reads a record. Magnitude controls particle count, emission force, colour, and wave speed; depth and coordinates appear in the data panel. Automatic scene rotation turns static data into an observable temporal process.
Complete sequence: read data → release energy → expand waves → dissipate particles.
Capabilities demonstrated
Python structures disparate sources into analysable tables. Feature extraction, standardisation, clustering, and dimension reduction explain variation. Numerical values become reusable spatial rules, with CSV connecting analysis, modelling, animation, and real-time feedback.