Random Walk from Processing to Tableau

For another submission to Viz as Art contest at Tableau, I wanted to create something involving randomness and random walk specifically. But I found that the classic random walk algorithm creates results that are, well…too random, as opposed to the organic, botanical shapes I was looking for. Luckily, someone has already thought of developing a “Random Walk with Transition Probabilities that Depend on Direction of Motion”. It sounds nerdy, but that is just the recipe that Mother Nature uses to build branches on a blueberry bush, dandelion’s see head or the maple tree outside my window.  In particular, a particle always moves forward and changes direction or stays the course dependent on a given probability. One of the chapters in Clifford Pickover’s book “Computers, Pattern, Chaos and Beauty” describes this in more detail.

As with Lorenz Attractor visualization, I wrote a program in Processing to generate the points and export them to a text file. Below is a complete listing of the code:

PrintWriter textFile;
//number of branches
int branchNum = 200;
//scale factor for angle theta
float delTheta = .9;
//scale factor for radius
float delRadius = 0.05;
//probability of transmission
float pt = 0.2;
//number of steps
int stepNum = 150;
//direction angle
float Theta = 0;

void setup(){
size(1000,1000);
background(0);
 
//initialize output text file
//textFile = createWriter("txtfiles/points.txt");
 
for (int branch = 0; branch < branchNum; branch++) {
//set initial conditions for each branch
float x0 = width/2;
float y0 = height/2;
float radius = 1;
 
float res = 0;
float dir = 1;
float lastDir = 1;
float thresh = 0;
strokeWeight(0);
stroke(0);
fill(random(1,255), random(1,255), random(1,255));
//stroke(random(1,255), random(1,255), random(1,255));
 
for (int step = 0; step < stepNum; step++) {
if (step == 0) {
res = random(0,1);
if (res > 0.5) {
dir=1;
} else {
dir=-1;
}
res = res * dir;
Theta = Theta + (res * delTheta);
radius = radius + delRadius;
float x = radius * cos(Theta) + x0;
float y = radius * sin(Theta) + y0;
line(x0, y0, x, y);
x0 = x;
y0 = y;
lastDir = dir; 
} else {
if(lastDir == -1) {
thresh = pt;
} else {
thresh = 1 - pt; 
}
 
res = random(0,1);
if (res > thresh) {
dir = 1;
} else {
dir = -1; 
}
res = res * dir;
Theta = Theta + (res * delTheta);
radius = radius + delRadius;
float x = radius * cos(Theta) + x0;
float y = radius * sin(Theta) + y0;
line(x0, y0, x, y);
ellipse(x,y,10,10);
x0 = x;
y0 = y;
lastDir = dir; 
 
//save output to text file
//textFile.println(branch + "," + x + "," + y);
//textFile.flush();
//exit(); 
         }
      } 
   }
} 

Just by changing one or two parameters, one can create an infinite number of patterns, some more organic looking than others. Here are sample outputs from Processing:

random walk in Processing

I imported the points into Tableau and played with different shapes, sizes an colours to achieve the best look. In the end, I settled for a basic grey circle with white outline. At first the monochrome chart was an uninteresting jumble of random points but after I added Branch field (unique branch number) to the Level of Detail, all tendrils got nicely separated revealing their organic structure.

Your email is never published or shared. Required fields are marked *

*

*

Back to top|Contact me