amchartslinechartamcharts4

How to create smoothed line instead of sharp line in amcharts 4?


unable to smooth line

I've tried to set tensionX, tensionY, chart.smoothing. However, the line is still not smoothed

Here is the jsfiddle filehttps://jsfiddle.net/cherrykosasih02/wyac0dnq/2/


Solution

  • You cannot use tensionX, tensionY or smoothing with propertyFields. You have to create axis ranges instead. Take a look at the following issue on GitHub:

    The smoothed curve algorithm works by bending the path around multiple points.

    Now, when you are using propertyFields to color specific section of the line, it creates a separate path for each separately-colored segment. If that segment encompasses only two points, the smoothing algorithm does not have anything to work with, hence the straight line.

    If you remove series.propertyFields.stroke = "color"; and replace it with series.smoothing = "monotoneX";, you could do something like this:

    function colorize(startDate, endDate, color) {
      var range = dateAxis.createSeriesRange(series);
      
      range.date = new Date(startDate + ' 12:00');
      range.endDate = new Date(endDate + ' 12:00');
      range.contents.stroke = am4core.color(color); 
    }
    
    for (var i = 0; i < chart.data.length; i++) {
      var startDate = chart.data[i].date,
          endDate = (i < chart.data.length - 1) && chart.data[i + 1].date,
          color = chart.data[i].color;
      
      colorize(startDate, endDate, color);
    }
    

    Here is your code with these modifications and additions:

    /**
     * ---------------------------------------
     * This demo was created using amCharts 4.
     * 
     * For more information visit:
     * https://www.amcharts.com/
     * 
     * Documentation is available at:
     * https://www.amcharts.com/docs/v4/
     * ---------------------------------------
     */
    
    // Themes begin
    am4core.useTheme(am4themes_animated);
    // Themes end
    
    
    
    // Create chart instance
    var chart = am4core.create("chartdiv", am4charts.XYChart);
    
    // Add data
    chart.data = [{
      "date": "2012-03-01",
      "price": 20,
      "color": "#00FF00"
    }, {
      "date": "2012-03-02",
      "price": 75,
      "color": "#FF0000"
    }, {
      "date": "2012-03-03",
      "price": 15,
      "color": "#00FF00"
    }, {
      "date": "2012-03-04",
      "price": 75,
      "color": "#00FF00"
    }, {
      "date": "2012-03-05",
      "price": 158,
      "color": "#FF0000"
    }, {
      "date": "2012-03-06",
      "price": 57,
      "color": "#FF0000"
    }, {
      "date": "2012-03-07",
      "price": 107,
      "color": "#FF0000"
    }, {
      "date": "2012-03-08",
      "price": 89,
      "color": "#FF0000"
    }, {
      "date": "2012-03-09",
      "price": 75,
      "color": "#00FF00"
    }, {
      "date": "2012-03-10",
      "price": 132,
      "color": "#00FF00"
    }, {
      "date": "2012-03-11",
      "price": 380,
      "color": "#FF0000"
    }, {
      "date": "2012-03-12",
      "price": 56,
      "color": "#00FF00"
    }, {
      "date": "2012-03-13",
      "price": 169,
      "color": "#FF0000"
    }, {
      "date": "2012-03-14",
      "price": 24,
      "color": "#00FF00"
    }, {
      "date": "2012-03-15",
      "price": 147,
      "color": "#00FF00"
    }];
    
    // Create axes
    var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
    dateAxis.renderer.grid.template.location = 0;
    dateAxis.renderer.minGridDistance = 50;
    
    var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
    /* valueAxis.logarithmic = true; */
    valueAxis.renderer.minGridDistance = 20;
    
    // Create series
    var series = chart.series.push(new am4charts.LineSeries());
    series.dataFields.valueY = "price";
    series.dataFields.dateX = "date";
    series.strokeWidth = 3;
    // series.propertyFields.stroke = "color";
    series.smoothing = "monotoneX"; // <--- HERE
    
    var bullet = series.bullets.push(new am4charts.CircleBullet());
    bullet.circle.fill = am4core.color("#fff");
    bullet.circle.strokeWidth = 3;
    
    // Add cursor
    chart.cursor = new am4charts.XYCursor();
    chart.cursor.fullWidthLineX = true;
    chart.cursor.xAxis = dateAxis;
    chart.cursor.lineX.strokeWidth = 0;
    chart.cursor.lineX.fill = am4core.color("#000");
    chart.cursor.lineX.fillOpacity = 0.1;
    
    // Add scrollbar
    chart.scrollbarX = new am4core.Scrollbar();
    
    // Add a guide
    let range = valueAxis.axisRanges.create();
    range.value = 90.4;
    range.grid.stroke = am4core.color("#396478");
    range.grid.strokeWidth = 1;
    range.grid.strokeOpacity = 1;
    range.grid.strokeDasharray = "3,3";
    range.label.inside = true;
    range.label.text = "Average";
    range.label.fill = range.grid.stroke;
    range.label.verticalCenter = "bottom";
    
    // ========================= HERE =========================
    
    function colorize(startDate, endDate, color) {
      var range = dateAxis.createSeriesRange(series);
    
      range.date = new Date(startDate + " 12:00");
      range.endDate = new Date(endDate + " 12:00");
      range.contents.stroke = am4core.color(color); 
    }
    
    for (var i = 0; i < chart.data.length; i++) {
      var startDate = chart.data[i].date,
          endDate = (i < chart.data.length - 1) && chart.data[i + 1].date,
          color = chart.data[i].color;
    
      colorize(startDate, endDate, color);
    }
    body {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
    }
    
    #chartdiv {
      width: 100%;
      height: 500px;
    }
    <script src="https://cdn.amcharts.com/lib/4/core.js"></script>
    <script src="https://cdn.amcharts.com/lib/4/charts.js"></script>
    <script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script>
    <div id="chartdiv"></div>