Processing
Børre Stenseth
Skisser >Kurver

Kurver

Hva

Vi skal lage en sketch som produserer kurver fra data lagret i JSON forma

Begreper som du finner i dokumentasjonen til Processing Reference

JSONObject,  JSONArray 
class
map(), textAlign(), String.format()
Relevante Skisser
kurver

Det vi lager blir f.eks. slik

kurver

Denne framstillingen er basert på følgende JSON-fil:

{"tittel":"Stortingsvalg 2017","elementer":[
    {"navn":"AP",    "verdi":27.4, "farge":"240,60,54"},
    {"navn":"H",     "verdi":25.0, "farge":"106,155,198"},
    {"navn":"Frp",   "verdi":15.2, "farge":"95,65,121"},
    {"navn":"SP",    "verdi":10.3, "farge":"0,119,68"},
    {"navn":"SV",    "verdi":6.0, "farge":"222,104,47"},
    {"navn":"V",     "verdi":4.4, "farge":"131,189,66"},
    {"navn":"Krf",   "verdi":4.2, "farge":"255,190,46"},
    {"navn":"MDG",   "verdi":3.2, "farge":"0,167,120"},
    {"navn":"R",     "verdi":2.4, "farge":"164,31,45"},
    {"navn":"Andre", "verdi":1.9, "farge":"102,102,102"}
]
}

Jeg har valgt å legge ut fargene som RGB-verdier. Jeg kunne ha valgt andre formater. Et nyttig verkøy for å se på fargeformatering er: color converter CSS Color Converter.

Som du ser viser grafen prosentverdier. Jeg har valgt å regne om alt til prosent. Det betyr også at hvis dataene er oppgitt prosentverdier vil de forhåpentligvis fortsette å være det på grafen, etter konverteringen (!). Det er viktig å merke seg at denne løsningen er meningsløs derom vi ikke har kontroll over alle utfallsmulighetene. Hvis vi f.eks. kuttet ut Ap i dataene ovenfor ville alle de andre verdiene fremstille "prosent fordelingen av de som har valgt et annet parti enn AP".

Koden består av tre filer: kurver.pde, datasett.pde, histogram.pde

Selve hovedskissen, kurver.pde, er svært enkel og kan lett utvides til f.eks. å tegne flere grafer.

_kurver.pde
/*
Framstilling av histogram
fra JSON-data
*/
JSONObject jObj;
String datakilde="data/valg.json";
//String datakilde="data/karakterer.json";
datasett DS;
void setup(){
  size(500, 500);
  jObj = loadJSONObject(datakilde);
  DS=new datasett(jObj);
}
void draw(){
  background(255);
  tegnHistogram(DS,0,0,width,height);
  noLoop();
}

De innleste JSON-dataene ornes i en egen klasse, datasett. Dette er gjort for å forenkle koden og for å lage en klasse som lett kan modifiseres for å støtte andre typer uttegninger. Det er dessuten ganske behagelig å ha en slik klasse når løsningen skal testes og modifiseres

_datasett.pde
/*
Ordner jasondata i prosentverdier
*/
class datasett{
  String tittel;
  JSONArray elementer;
  float maxVerdi;
  float sum;
  
  datasett(JSONObject jObj){
    elementer=jObj.getJSONArray("elementer");
    this.tittel=jObj.getString("tittel");
    maxVerdi=0;
    sum=0;
    // regn om til prosent
    for(int i=0; i< elementer.size();i++){
      float v=elementer.getJSONObject(i).getFloat("verdi");
      if(v > maxVerdi)
          maxVerdi=v;
      sum+=v;
    }
    for(int i=0; i< elementer.size();i++){
      float v=elementer.getJSONObject(i).getFloat("verdi");
      elementer.getJSONObject(i).setFloat("verdi",v*100.0/sum);
    }
    maxVerdi=maxVerdi*100.0/sum;
  }
  //---------------------------------
  // antall verdier
  int getAntallVerdier(){
    return elementer.size();
  }
  
  //--------------------------------
  // verdier er nå prosentverdier
  float getVerdi(int i){
    return elementer.getJSONObject(i).getFloat("verdi");
  }
  float getMaxVerdi(){
    return maxVerdi;
  }  
  String getNavn(int i){
    return elementer.getJSONObject(i).getString("navn");
  }
  String getTittel(){
    return tittel;
  }
  color getFarge(int i){
    String[] rgb=
      elementer.getJSONObject(i).getString("farge").split(",");
    return color(parseInt(rgb[0]),
                 parseInt(rgb[1]),
                 parseInt(rgb[2]));
  }
}

Funksjonen som tegner histogrammet er plassert i en egen fil, histogram.pde. Årsaken er igjen et ønske om å skille funksjonalitet og holde orden. Det er mange ting som kan endres her. Det er f.eks. et svakt punkt at for lange navn på x-aksen vil skape vansker. Se om du kan fikse det.

_histgram.pde

Når vi arbeider med JSON er det erfaringsmessig veldig nyttig å teste data, for å se om de er riktig formatert. Det blir fort mange parenteser av ulik type. Det finne flere stder på nettet der du kan teste JSON-formatering. Jeg har hatt nytte av denne : Json-parser online . Det er også slikat de siste versjonene av nettlesere parser json og melder om feil.

Skisser >Kurver