Use Processing to make continuous graph using CSV

a GRAPH / PLOT as a short window of data
from ONE CSV file?
or a graph of all data from CSV with a zoom function?

possibly better use a library ( loaded via PDE contribution manager ) like
https://jagracar.com/grafica.php


still i think you should start
with your own little plot function
-1- point(x,y)
-2- rect()
-3- a line connecting the measuring points
and ignore the axis / grid beauty things at first


next need check data in a first loop for min max to auto adjust graph

float dmin, dmax, davg;
Table table;
String infilename = "data/data.csv";
int trow = 0;                        // = table.getRowCount();

boolean dprint = true;               // temporary diag print

//____________________________________________________________
void setup() {
  size(500, 500);
  get_Table();
  find_MinMax();
}

//____________________________________________________________
void draw() {
  background(200, 200, 0);
  draw_graph();
}

//____________________________________________________________
void get_Table() {
  table=loadTable(infilename, "header");
  trow = table.getRowCount();
  if (dprint) println("rows: "+trow+" in file: "+infilename);
  table.setColumnType("Time", Table.INT);
  table.setColumnType("Intensity", Table.FLOAT);  
}

//____________________________________________________________
void find_MinMax() {
  float iintensity;  // local temp
  dmin = 1000;       // INIT range globals
  dmax = -1000;
  davg = 0;
  for (int i=0; i<trow; i++) {
    iintensity = table.getFloat(i, "Intensity");
    if ( iintensity > dmax ) dmax = iintensity;
    if ( iintensity < dmin ) dmin = iintensity;
    davg += iintensity;
  }
  davg = davg/trow;                                  // sum devided by data records  thresh=(davg + dmax)/2.0;                          // latest calc formula
  if (dprint) println("davg "+nf(davg, 1, 2)+" dmax "+dmax+" dmin "+dmin);
}

//____________________________________________________________
void draw_graph() {
  float iintensity;  // local
  float x0= 20, y0 = height-50, w = 1, zoom = 200; // init
  float graphgrid = 40;
  zoom = graphgrid*floor((height -100)/dmax/graphgrid);        // rerange graph ( dmax - dmin ); 
  w = ( width- 2*x0 )/trow;                                    // rerange graph by samples
  stroke(100, 100, 100);
  for ( int k =0; k<=int((height -100)/graphgrid); k++ ) {
    line(x0-1, y0+1, x0-1, 50);
    line(x0-1, y0+1-k*graphgrid, x0+w*trow, y0+1-k*graphgrid);
  }
  for (int i=0; i<trow; i++) {
    iintensity = table.getFloat(i, "Intensity");
    fill(0, 200, 0); 
    noStroke();
    rect(x0+i*w, y0, w, -zoom*iintensity);
  }
}

//____________________________________________________________


some operation Key PlusPlus allow time range ZOOM and MOVE

float dmin, dmax, davg;
Table table;
String infilename = "data/data3.csv";
int trow = 0;                        // = table.getRowCount();

boolean dprint = true;               // temporary diag print
// ECG_2
// use view range
int rstart=0, rend;
char cmode = ' ';
//____________________________________________________________
void setup() {
  size(500, 500);
  get_Table();
  find_MinMax();
  println("operation: Key Plus Plus [s] [e] [UP] [DOWN] can select / zoom time range // OR  [LEFT] [RIGHT]  move range");
}

//____________________________________________________________
void draw() {
  background(0, 0, 80);
  draw_graph();
}

//____________________________________________________________
void get_Table() {
  table=loadTable(infilename, "header");
  trow = table.getRowCount();
  if (dprint) println("rows: "+trow+" in file: "+infilename);
  table.setColumnType("Time", Table.FLOAT);
  table.setColumnType("Intensity", Table.FLOAT);
}

//____________________________________________________________
void find_MinMax() {
  float iintensity;  // local temp
  dmin = 1000;       // INIT range globals
  dmax = -1000;
  davg = 0;
  for (int i=0; i<trow; i++) {
    iintensity = table.getFloat(i, "Intensity");
    if ( iintensity > dmax ) dmax = iintensity;
    if ( iintensity < dmin ) dmin = iintensity;
    davg += iintensity;
  }
  davg = davg/trow;                                  // sum devided by data records  thresh=(davg + dmax)/2.0;                          // latest calc formula
  if (dprint) println("davg "+nf(davg, 1, 2)+" dmax "+dmax+" dmin "+dmin);

  rend=trow;
}

//____________________________________________________________
void draw_graph() {
  float iintensity;  // local
  float x0= 20, y0 = height-100, w = 1, zoom = 200; // init
  float graphgrid = 100;
  zoom = graphgrid*floor((height -100)/dmax/graphgrid);        // rerange graph ( dmax - dmin ); 
  w = ( width- 2*x0 )/( rend - rstart );//trow;                // rerange graph by samples
  stroke(100, 100, 100);
  for ( int k =0; k<=int((height -100)/graphgrid); k++ ) {
    line(x0-1, y0+1, x0-1, 50);
    line(x0-1, y0+1-k*graphgrid, x0+w*trow, y0+1-k*graphgrid);
  }
  int samples = rend - rstart;
  for (int i=0; i < samples; i++) {
    iintensity = table.getFloat(rstart+i, "Intensity");
    fill(0, 200, 0); 
    noStroke();
    rect(x0+i*w, y0, w, -zoom*iintensity);
  }
  text(table.getFloat(rstart, "Time"), x0, height-20); //____ show start end time from table column "Time"
  text(table.getFloat(rend-1, "Time"), width-50, height-20);
}

//____________________________________________________________

void keyPressed() { //___________________________ KPP operation zoom [s] [e] [UP] [DOWN]  move [LEFT] [RIGHT]
  int xdc, dc=10; //______________________________ color range in steps
  if ( key == 's' || key == 'e' ) cmode = key; 
  else if ( keyCode == UP || keyCode == DOWN ) { //__________ zoom range
    if ( keyCode == UP ) xdc =  dc;
    else                 xdc = -dc;
    if      ( cmode == 's' ) rstart += xdc;
    else if ( cmode == 'e' ) rend   += xdc;
    rstart = constrain(rstart, 0, rend);
    rend   = constrain(rend, rstart, trow);
    println("mode: "+cmode+", record start "+rstart+" end "+rend);
  } else if ( keyCode == LEFT || keyCode == RIGHT ) { //_____ move range
    if ( keyCode == RIGHT ) xdc =  dc;
    else                    xdc = -dc;
    rstart += xdc;
    rend   += xdc;
    rstart = constrain(rstart, 0, trow);
    rend   = constrain(rend, 0, trow);
  } else cmode = ' '; //__________________________ reset cmode on any other key
}

3 Likes