JSFiddle - React, Tailwind, and code Playground

by Sub Taper

HTML

<head>
  <title>Continously Compounding Interst Plot</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
</head>

<body>
  <div class="calculator" style="padding-top:20px;">
    <div class="container">
      <form>

        <div class="form-group row">
          <label for="halfLifeInput" class="col-6 col-form-label">Present Value HALFLIFE:</label>
          <div class="col-4">
            <input class="form-control" type="text" id="halfLife" value="4">
          </div>
        </div>

        <div class="form-group  row">
          <label for="doseAmountInput" class="col-6 col-form-label">Interest Rate DOSE AMOUNT:</label>
          <div class="col-4">
            <input class="form-control" type="text" id="doseAmount" value="10">
          </div>
        </div>

        <div class="form-group  row">
          <div class="col-4">
            <input class="form-control" type="button" value="Graph" id="sendbutton">
          </div>
        </div>
      </form>
    </div>
  </div>
  <div class="chart">
    <div class="container">
      <div class="row">
        <div class="col-md-12 col-lg-12">
          <div id="compounding_chart" style="width: 900px; height: 500px"></div>
        </div>
      </div>
    </div>
  </div>
</body>
<footer>

  <!-- jQuery first, then Tether, then Bootstrap JS. -->
  <!-- jQuery first, then Tether, then Bootstrap JS, then Google Charts, then my own JS file. -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js"...

JavaScript

function compoundingData() {
  var plotData = [];
  var pv = parseFloat($("#halfLife").val());
  console.log(pv);
  var r = parseFloat($("#doseAmount").val());
  console.log(r);
  var freq = 6
  var span = pv * 6
    /* var span = (pv * 10)/24;
     var sp = 24 * (span.toFixed(0)); */
  //plotData.push(0, r);
  for (i = 1; i <= span; i += 1) {
  	var d = plotData.slice();
    var prev = ;
    if (i%freq) {
      d = r;
    } else  {
      d = 0;
    }
    
    var point = (prev*d) * Math.pow(0.5, (1 / pv));
    plotData.push([i, point]);
    
  }
  //plotData.unshift([0.5, r])
    //set 0,0 at beginning
  //var z = pv * 0;
  //plotData.unshift([z, z]);

  console.table(plotData);
  return plotData;

}

google.charts.load("current", {
  packages: ["corechart", "line"]
});
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Hours");
  data.addColumn("number", "Amount");
  data.addRows(compoundingData());

  var doseV = compoundingData.r;
  var options = {
    animation: {
      startup: true,
      /* Need to add this for animations */
      duration: 1000,
      easing: 'out',
    },
    hAxis: {
      title: "Hours",
      //ticks: [24, 48, 72],
      viewWindowMode: "explicit",
    },
    vAxis: {
      title: "Amount",
      //baseline: ("#doseAmount").val()
    },
    //curveType: "function",
    legend: {
      position: "none"
    },
    chartArea: {
      top: 5
    },
    explorer: {
      actions: ['dragToPan', 'rightClickToReset'],
      axis: "horizontal",
      //keepInBounds: true,
    }
  };
  var chart = new google.visualization.AreaChart(
    document.getElementById("compounding_chart")
  );
  chart.draw(data, options);
};

var sendBtn = document.querySelector('input[type="button"]');
sendBtn.onclick = function(e) {
  google.charts.setOnLoadCallback(drawChart());
};

/*$("form").on("input", function(e) { google.charts.setOnLoadCallback(drawChart());
});*/