PhotoPie

Web app for colour data visualisations of photos
,

var img = new Image()
  img.onload = function () {
    var canvas = document.createElement('canvas')
    canvas.width = width
    canvas.height = width * (img.height / img.width)
    var ctx = canvas.getContext('2d')
    ctx.drawImage(img, 0, 0, width, canvas.height)
    var id = ctx.getImageData(0, 0, canvas.width, canvas.height)
Dot memorial

A personal memorial for lives lost due to covid-19
,

mport csv, json, urllib.request, datetime
from codecs import iterdecode
def main(latest):
    url =   'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/'   
+'master/csse_covid_19_data/csse_covid_19_daily_reports/'
            +latest+'.csv'
    try:
        latest = urllib.request.urlopen(url)
        return generatejson(latest)
    except urllib.request.HTTPError:
        print('url not found')
        return False
def generatejson(csvfile):
    data = {}
    total = 0
    csvReader = csv.DictReader(iterdecode(csvfile, 'utf-8'))
    for row in csvReader:
        name = row['Country_Region']
        Deaths = int(row['Deaths'])    
        if name not in data:
            data[name] = Deaths
        else:
            data[name] += Deaths
        total += Deaths
    data = {k: v for k, v in sorted(data.items(), key=lambda item: item[1],reverse=True)}
    with open('data.json', 'w') as jsonfile:
        jsonfile.write(json.dumps(data))
    return total
Maldives parliamentary election 2019 analysis

Data analysis of election results by sex
, ,

float bar_start = (x-per)*10;
float bar_width = per*10;
if ( party.equals("MDP")  ){
    fill(255,222,0);
} else if ( party.equals("PPM") || party.equals("PNC") ) {
    fill(223,24,147);
} else if ( party.equals("JP") ){
    fill(230,23,23);
} else if ( party.equals("MDA") ){
    fill(212,157,37);
} else if ( party.equals("AP") ){
    fill(62,132,64);
} else if ( party.equals("IND") ){
    fill(175,175,175);
}    
Maldives population poster and notebook

Population awareness materials for UNFPA
, ,

textAlign(CENTER, CENTER);
int count = 0;
int y = 50;
int x = 50;
int atoll = 0;
for (TableRow islandrow : islands.rows()) {
     if (count%19 == 0 /*|| atoll != islandrow.getInt("Misc")*/ ) {
         y += 52;
         x = 47;
         count=0;
     }
     //if (atoll == 9) { continue;} //skip male'
     count++;
     String islandname = islandrow.getString("Name");
     int islandpop = islandrow.getInt("2014");
Maldives census visualisations

Data visualisations & knowledge products for UNFPA
, ,

import processing.pdf.*;

Table atolls;
PGraphicsPDF pdf;
PFont helvetica;

void draw() {
  textFont(helvetica);
  textSize(2);
  textAlign(CENTER);
  float scale = 300;
  String[] years = {"1911", "1921","1953","1960",  "1965","1977","1985","1990","1995","2000","2006","2014"};
  for (TableRow atollrow : atolls.rows()) {
    String atoll_short = atollrow.getString("Atoll_short");
    float lat = atollrow.getFloat("Lat");
    float lon = atollrow.getFloat("Long");    
    pushMatrix();
#mvelection2013

2013 Maldives presidential election results analytics
, ,

function r(id, label, mdp, ppm, jp, gi, invalid, nonvoters, max) {
  var total = mdp+ppm+jp+gi+invalid+nonvoters+max;
  var canvas = document.createElement('canvas');
  var chartwidth = 2100;
  var chartheight = 50;
  var top = 2;
  if (max < 10000 && max != 0) {
    canvas.width = 2100; 
  } else {
    chartwidth = 800;
    canvas.width = chartwidth ;   
  }
mvmurders

Mapping & documenting murders that have taken place in the Maldives
, ,

                                                     _                     
                                                    | |                    
  _ __ ___   __   __  _ __ ___    _   _   _ __    __| |   ___   _ __   ___ 
 | '_ ` _ \  \ \ / / | '_ ` _ \  | | | | | '__|  / _` |  / _ \ | '__| / __|
 | | | | | |  \ V /  | | | | | | | |_| | | |    | (_| | |  __/ | |    \__ \
 |_| |_| |_|   \_/   |_| |_| |_|  \__,_| |_|     \__,_|  \___| |_|    |___/
                                                                           
                                                                           
Nakaiy Nevi

Seasons of the Maldives – a mobile app
, , ,

for (var i=1; i<nakaiy.length; i++){
  nakaiydb.insert({ id:i, 
    nakaiy:nakaiy[i][0], 
    dates:nakaiy[i][1], 
    season:nakaiy[i][2], 
    number:nakaiy[i][3], 
    description:nakaiy[i][4], 
    meaning:nakaiy[i][5], 
    weather:nakaiy[i][6], 
    averages:nakaiy[i][7], 
    fishing:nakaiy[i][8], 
    agriculture:nakaiy[i][9], 
    asterism:nakaiy[i][10]
  }); 
}
Islands of Maldives

Islands of Maldives (aligning together)
, ,

import processing.video.*;
MovieMaker mm;
....
float x = -7000 + float(pieces[6])*100;
float y = 715 + float(pieces[7])*-100;
scale(50);
String[] shapes = split(pieces[0], ',');

beginShape();
  for (int nodes = 0; nodes < shapes.length; nodes = nodes+1) {
    String[] xy = split(shapes[nodes]," ");  
    float x1 = -7000 + float(xy[0])*100 - x+6.4;
    float y1 = 715 + float(xy[1])*-100 - y+4.0;
    vertex(x1, y1);
  }
endShape(CLOSE);
Maldives 2006 Census Data Visualizations

For UNDP’s disaster awareness campaign research
, ,

function population_density() {
  $content = '';
  $fp2 = fopen('source.csv', 'r');    
  while (!feof($fp2)) {
    $line = fgetcsv($fp2, 4096);
    if ($line[0] == "138") { continue; }; // remove male' 
    if (is_numeric($line[4]) AND  is_numeric($line[5]) AND  !empty($line[6]) AND  !empty($line[17]) ) {
       $content .= '';
       $content .= '';
    }
  }
  fclose($fp2);
  $content .= '';
  return $content;
}
UNDP Rakaavethibeyyaa Dhivehiraaje

Generative logo design
, ,

foreach ($xml->children() as $atolls) {
  $island_count = 0;
  foreach ($atolls->children() as $atoll){
    $content .= '';
    foreach ($atoll->children() as $island){
      $content .= 'x  . '" y="' . $island->y . '" 
              width="' . $island->size . '" height="'. $height .'" 
              fill="black"  />  ';  
    }
    $content .= '';
  }
}
Framing Leaders

Algorithmically generated framed pictures of heads of governments
, , ,

#!/usr/bin/python
#
import datetime
for row in cursor.fetchall():
  if row['country_code'] + ".png" in srcfiles:
    x = datetime.datetime.now().date() - row['h_gov_since']
    if x.days > 365*2:
      years = " ("+ str(math.floor(x.days/365))[:-2] + " years)"
    elif x.days < 365:
      years = " ("+ str(x.days) + " days)"
      
    else:
      years = " ("+ str(math.floor(x.days/365))[:-2] + " year)" 
    img = row['country_code'] + ".png"
    imgs.append(img)
    li[img] = row['country_name'].capitalize() + years
    height.append(Image.open(pathx + img).size[1]+35)
    width.append(Image.open(pathx + img).size[0]+20)
Flags By Colours

Data visualization experiment using flags of the world
, , , ,

#!/usr/bin/python
#
from sys import argv
import Image, ImageDraw 
im = Image.open(argv[1]) 
im = im.convert('RGB') 
colors = {}; total = 0
for y in range(im.size[1]):
  for x in range(im.size[0]):
    color = im.getpixel((x,y))
    if color in colors.keys():
      colors[color] += 1
    else:
      colors[color] = 1
    total += 1 
Generator

An evolving algorithm that generates music & visuals
, ,

#!/usr/bin/python
from common import *
import random


while 1:
  num = 000
  files = ls (images, 'jpg')
  last = len(files)
  half = str(round (last/2))
  half = int(half[:half.find('.')])-3
  using = files[last-10:last]
  using.sort()
  using.reverse()
  using += files[half:half+10]
mvblogosphere

Mapping of the Maldivian blogosphere (2006-2014)
, ,

                      _       _                                         _     
                     | |     | |                                       | |    
  _ __ ___   __   __ | |__   | |   ___     __ _    ___    ___   _ __   | |__  
 | '_ ` _ \  \ \ / / | '_ \  | |  / _ \   / _` |  / _ \  / __| | '_ \  | '_ \ 
 | | | | | |  \ V /  | |_) | | | | (_) | | (_| | | (_) | \__ \ | |_) | | | | |
 |_| |_| |_|   \_/   |_.__/  |_|  \___/   \__, |  \___/  |___/ | .__/  |_| |_|
                                           __/ |               | |            
                                          |___/                |_|            
                     
                     
   ___   _ __    ___ 
  / _ \ | '__|  / _ \
 |  __/ | |    |  __/
  \___| |_|     \___|