JavaScript TypeScript / ES6 JSON ...
<style >
#chartdiv {
width : 100% ;
height : 600px ;
}
</style >
<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/plugins/timeline.js" > </script >
<script src ="https://cdn.amcharts.com/lib/4/plugins/bullets.js" > </script >
<script src ="https://cdn.amcharts.com/lib/4/themes/animated.js" > </script >
<script >
am4core.ready (function ( ) {
am4core.useTheme (am4themes_animated);
var insterfaceColors = new am4core.InterfaceColorSet ();
var lineColor = insterfaceColors.getFor ("background" );
var chart = am4core.create ("chartdiv" , am4plugins_timeline.CurveChart );
chart.curveContainer .padding (20 ,20 ,20 ,20 );
chart.data = [{ name : "Chandler" , file : "/wp-content/uploads/assets/timeline/chandler.jpg" , track : 1 , value : 450 }, { name : "Ross" , file : "/wp-content/uploads/assets/timeline/ross.jpg" , track : 2 , value : 650 }, { name : "Joey" , file : "/wp-content/uploads/assets/timeline/joey.jpg" , track : 3 , value : 578 }, { name : "Monica" , file : "/wp-content/uploads/assets/timeline/monica.jpg" , track : 4 , value : 730 }, { name : "Phoebe" , file : "/wp-content/uploads/assets/timeline/phoebe.jpg" , track : 5 , value : 490 }, { name : "Rachel" , file : "/wp-content/uploads/assets/timeline/rachel.jpg" , track : 6 , value : 532 }];
var categoryAxis = chart.yAxes .push (new am4charts.CategoryAxis ());
categoryAxis.dataFields .category = "name" ;
categoryAxis.renderer .minGridDistance = 10 ;
categoryAxis.renderer .innerRadius = 5 ;
categoryAxis.renderer .radius = 145 ;
categoryAxis.renderer .line .stroke = lineColor;
categoryAxis.renderer .line .strokeWidth = 5 ;
categoryAxis.renderer .line .strokeOpacity = 1 ;
var labelTemplate = categoryAxis.renderer .labels .template ;
labelTemplate.fill = lineColor;
labelTemplate.fontWeight = 600 ;
labelTemplate.fontSize = 11 ;
var gridTemplate = categoryAxis.renderer .grid .template ;
gridTemplate.strokeWidth = 1 ;
gridTemplate.strokeOpacity = 1 ;
gridTemplate.stroke = lineColor;
gridTemplate.location = 0 ;
gridTemplate.above = true ;
var fillTemplate = categoryAxis.renderer .axisFills .template ;
fillTemplate.disabled = false ;
fillTemplate.fill = am4core.color ("#b84f49" );
fillTemplate.fillOpacity = 1 ;
categoryAxis.fillRule = function (dataItem ) {
dataItem.axisFill .__disabled = false ;
dataItem.axisFill .opacity = 1 ;
}
var valueAxis = chart.xAxes .push (new am4charts.ValueAxis ());
valueAxis.min = 0 ;
valueAxis.max = 1000 ;
valueAxis.renderer .points = [{ x : 0 , y : -100 }, { x : 200 , y : -100 }, { x : 200 , y : 100 }, { x : 0 , y : 100 }, { x : -200 , y : 100 }, { x : -200 , y : -100 }, { x : 0 , y : -100 }];
valueAxis.renderer .polyspline .tensionX = 0.4 ;
valueAxis.renderer .line .strokeOpacity = 0.1 ;
valueAxis.renderer .line .strokeWidth = 10 ;
valueAxis.renderer .maxLabelPosition = 0.98 ;
valueAxis.renderer .minLabelPosition = 0.02 ;
var flagRange = valueAxis.axisRanges .create ();
flagRange.value = 0 ;
var flagBullet = new am4plugins_bullets.FlagBullet ();
flagBullet.label .text = "START" ;
flagRange.bullet = flagBullet;
flagBullet.adapter .add ("dy" , function (dy, target ) {
return -categoryAxis.renderer .radius ;
})
var valueLabelTemplate = valueAxis.renderer .labels .template ;
valueLabelTemplate.fill = lineColor;
valueLabelTemplate.fontSize = 8 ;
valueLabelTemplate.fontWeight = 600 ;
valueLabelTemplate.fillOpacity = 1 ;
valueLabelTemplate.horizontalCenter = "right" ;
valueLabelTemplate.verticalCenter = "bottom" ;
valueLabelTemplate.padding (0 , 10 , 0 , 0 );
valueLabelTemplate.adapter .add ("rotation" , function (rotation, target ) {
var value = target.dataItem .value ;
var position = valueAxis.valueToPosition (value);
var angle = valueAxis.renderer .positionToAngle (position);
return angle;
})
var valueGridTemplate = valueAxis.renderer .grid .template ;
valueGridTemplate.strokeOpacity = 0.3 ;
valueGridTemplate.stroke = lineColor;
var series = chart.series .push (new am4plugins_timeline.CurveColumnSeries ());
series.dataFields .categoryY = "name" ;
series.stroke = lineColor;
series.fill = lineColor;
series.dataFields .valueX = "value" ;
series.defaultState .transitionDuration = 4000 ;
var columnTemplate = series.columns .template ;
columnTemplate.fill = lineColor;
columnTemplate.strokeOpacity = 0 ;
columnTemplate.fillOpacity = 0.3 ;
columnTemplate.height = am4core.percent (100 );
var hoverState = columnTemplate.states .create ("hover" );
hoverState.properties .fillOpacity = 0.9 ;
var bullet = series.bullets .push (new am4charts.CircleBullet ())
bullet.fill = lineColor;
chart.legend = new am4charts.Legend ();
chart.legend .data = chart.data ;
chart.legend .parent = chart.curveContainer ;
chart.legend .width = 360 ;
chart.legend .horizontalCenter = "middle" ;
chart.legend .verticalCenter = "middle" ;
var markerTemplate = chart.legend .markers .template ;
markerTemplate.width = 30 ;
markerTemplate.height = 30 ;
chart.legend .itemContainers .template .events .on ("over" , function (event ) {
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
dataItem.column .isHover = true ;
}
else {
dataItem.column .isHover = false ;
}
})
})
chart.legend .itemContainers .template .events .on ("hit" , function (event ) {
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
if (dataItem.visible ) {
dataItem.hide (1000 , 0 , 0 , ["valueX" ]);
}
else {
dataItem.show (1000 , 0 , ["valueX" ]);
}
}
})
})
var rect = markerTemplate.children .getIndex (0 );
rect.cornerRadius (20 , 20 , 20 , 20 );
var as = markerTemplate.states .create ("active" );
as .properties .opacity = 0.5 ;
var image = markerTemplate.createChild (am4core.Image )
image.propertyFields .href = "file" ;
image.width = 30 ;
image.height = 30 ;
image.filters .push (new am4core.DesaturateFilter ());
image.events .on ("inited" , function (event ) {
var image = event.target ;
var parent = image.parent ;
image.mask = parent.children .getIndex (0 );
})
});
</script >
<div id ="chartdiv" > </div >
import * as am4core from "@amcharts/amcharts4/core" ;
import * as am4charts from "@amcharts/amcharts4/charts" ;
import am4themes_animated from "@amcharts/amcharts4/themes/animated" ;
am4core.useTheme (am4themes_animated);
let insterfaceColors = new am4core.InterfaceColorSet ();
let lineColor = insterfaceColors.getFor ("background" );
let chart = am4core.create ("chartdiv" , am4plugins_timeline.CurveChart );
chart.curveContainer .padding (20 ,20 ,20 ,20 );
chart.data = [{ name : "Chandler" , file : "/wp-content/uploads/assets/timeline/chandler.jpg" , track : 1 , value : 450 }, { name : "Ross" , file : "/wp-content/uploads/assets/timeline/ross.jpg" , track : 2 , value : 650 }, { name : "Joey" , file : "/wp-content/uploads/assets/timeline/joey.jpg" , track : 3 , value : 578 }, { name : "Monica" , file : "/wp-content/uploads/assets/timeline/monica.jpg" , track : 4 , value : 730 }, { name : "Phoebe" , file : "/wp-content/uploads/assets/timeline/phoebe.jpg" , track : 5 , value : 490 }, { name : "Rachel" , file : "/wp-content/uploads/assets/timeline/rachel.jpg" , track : 6 , value : 532 }];
let categoryAxis = chart.yAxes .push (new am4charts.CategoryAxis ());
categoryAxis.dataFields .category = "name" ;
categoryAxis.renderer .minGridDistance = 10 ;
categoryAxis.renderer .innerRadius = 5 ;
categoryAxis.renderer .radius = 145 ;
categoryAxis.renderer .line .stroke = lineColor;
categoryAxis.renderer .line .strokeWidth = 5 ;
categoryAxis.renderer .line .strokeOpacity = 1 ;
let labelTemplate = categoryAxis.renderer .labels .template ;
labelTemplate.fill = lineColor;
labelTemplate.fontWeight = 600 ;
labelTemplate.fontSize = 11 ;
let gridTemplate = categoryAxis.renderer .grid .template ;
gridTemplate.strokeWidth = 1 ;
gridTemplate.strokeOpacity = 1 ;
gridTemplate.stroke = lineColor;
gridTemplate.location = 0 ;
gridTemplate.above = true ;
let fillTemplate = categoryAxis.renderer .axisFills .template ;
fillTemplate.disabled = false ;
fillTemplate.fill = am4core.color ("#b84f49" );
fillTemplate.fillOpacity = 1 ;
categoryAxis.fillRule = function (dataItem ) {
dataItem.axisFill .__disabled = false ;
dataItem.axisFill .opacity = 1 ;
}
let valueAxis = chart.xAxes .push (new am4charts.ValueAxis ());
valueAxis.min = 0 ;
valueAxis.max = 1000 ;
valueAxis.renderer .points = [{ x : 0 , y : -100 }, { x : 200 , y : -100 }, { x : 200 , y : 100 }, { x : 0 , y : 100 }, { x : -200 , y : 100 }, { x : -200 , y : -100 }, { x : 0 , y : -100 }];
valueAxis.renderer .polyspline .tensionX = 0.4 ;
valueAxis.renderer .line .strokeOpacity = 0.1 ;
valueAxis.renderer .line .strokeWidth = 10 ;
valueAxis.renderer .maxLabelPosition = 0.98 ;
valueAxis.renderer .minLabelPosition = 0.02 ;
let flagRange = valueAxis.axisRanges .create ();
flagRange.value = 0 ;
let flagBullet = new am4plugins_bullets.FlagBullet ();
flagBullet.label .text = "START" ;
flagRange.bullet = flagBullet;
flagBullet.adapter .add ("dy" , function (dy, target ) {
return -categoryAxis.renderer .radius ;
})
let valueLabelTemplate = valueAxis.renderer .labels .template ;
valueLabelTemplate.fill = lineColor;
valueLabelTemplate.fontSize = 8 ;
valueLabelTemplate.fontWeight = 600 ;
valueLabelTemplate.fillOpacity = 1 ;
valueLabelTemplate.horizontalCenter = "right" ;
valueLabelTemplate.verticalCenter = "bottom" ;
valueLabelTemplate.padding (0 , 10 , 0 , 0 );
valueLabelTemplate.adapter .add ("rotation" , function (rotation, target ) {
let value = target.dataItem .value ;
let position = valueAxis.valueToPosition (value);
let angle = valueAxis.renderer .positionToAngle (position);
return angle;
})
let valueGridTemplate = valueAxis.renderer .grid .template ;
valueGridTemplate.strokeOpacity = 0.3 ;
valueGridTemplate.stroke = lineColor;
let series = chart.series .push (new am4plugins_timeline.CurveColumnSeries ());
series.dataFields .categoryY = "name" ;
series.stroke = lineColor;
series.fill = lineColor;
series.dataFields .valueX = "value" ;
series.defaultState .transitionDuration = 4000 ;
let columnTemplate = series.columns .template ;
columnTemplate.fill = lineColor;
columnTemplate.strokeOpacity = 0 ;
columnTemplate.fillOpacity = 0.3 ;
columnTemplate.height = am4core.percent (100 );
let hoverState = columnTemplate.states .create ("hover" );
hoverState.properties .fillOpacity = 0.9 ;
let bullet = series.bullets .push (new am4charts.CircleBullet ())
bullet.fill = lineColor;
chart.legend = new am4charts.Legend ();
chart.legend .data = chart.data ;
chart.legend .parent = chart.curveContainer ;
chart.legend .width = 360 ;
chart.legend .horizontalCenter = "middle" ;
chart.legend .verticalCenter = "middle" ;
let markerTemplate = chart.legend .markers .template ;
markerTemplate.width = 30 ;
markerTemplate.height = 30 ;
chart.legend .itemContainers .template .events .on ("over" , function (event ) {
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
dataItem.column .isHover = true ;
}
else {
dataItem.column .isHover = false ;
}
})
})
chart.legend .itemContainers .template .events .on ("hit" , function (event ) {
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
if (dataItem.visible ) {
dataItem.hide (1000 , 0 , 0 , ["valueX" ]);
}
else {
dataItem.show (1000 , 0 , ["valueX" ]);
}
}
})
})
let rect = markerTemplate.children .getIndex (0 );
rect.cornerRadius (20 , 20 , 20 , 20 );
let as = markerTemplate.states .create ("active" );
as .properties .opacity = 0.5 ;
let image = markerTemplate.createChild (am4core.Image )
image.propertyFields .href = "file" ;
image.width = 30 ;
image.height = 30 ;
image.filters .push (new am4core.DesaturateFilter ());
image.events .on ("inited" , function (event ) {
let image = event.target ;
let parent = image.parent ;
image.mask = parent.children .getIndex (0 );
})
<style >
#chartdiv {
width : 100% ;
height : 600px ;
}
</style >
<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/plugins/timeline.js" > </script >
<script src ="https://cdn.amcharts.com/lib/4/plugins/bullets.js" > </script >
<script src ="https://cdn.amcharts.com/lib/4/themes/animated.js" > </script >
<script >
am4core.useTheme (am4themes_animated);
var chart = am4core.createFromConfig ({
"curveContainer" : {
"paddingTop" : 20 ,
"paddingRight" : 20 ,
"paddingBottom" : 20 ,
"paddingLeft" : 20 ,
"children" : [{
"type" : "Legend" ,
"forceCreate" : true ,
"callback" : function ( ) {
var chart = this .baseSprite ;
this .data = chart.data ;
},
"width" : 360 ,
"horizontalCenter" : "middle" ,
"verticalCenter" : "middle" ,
"markers" : {
"width" : 30 ,
"height" : 30 ,
"children" : [{
"cornerRadiusTopLeft" : 20 ,
"cornerRadiusTopRight" : 20 ,
"cornerRadiusBottomRight" : 20 ,
"cornerRadiusBottomLeft" : 20
}, {
"type" : "Image" ,
"forceCreate" : true ,
"width" : 30 ,
"height" : 30 ,
"propertyFields" : {
"href" : "file"
},
"filters" : [{
"type" : "DesaturateFilter"
}],
"events" : {
"inited" : function (event ) {
var image = event.target ;
var parent = image.parent ;
if (parent) {
image.mask = parent.children .getIndex (0 );
}
}
}
}],
"states" : {
"active" : {
"properties" : {
"opacity" : 0.5
}
}
},
},
"itemContainers" : {
"events" : {
"over" : function (event ) {
if (!event.target .baseSprite ) {
return ;
}
var chart = event.target .baseSprite ;
var series = chart.series .getIndex (0 );
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
dataItem.column .isHover = true ;
}
else {
dataItem.column .isHover = false ;
}
})
},
"hit" : function (event ) {
if (!event.target .baseSprite ) {
return ;
}
var chart = event.target .baseSprite ;
var series = chart.series .getIndex (0 );
series.dataItems .each (function (dataItem ) {
if (dataItem.dataContext == event.target .dataItem .dataContext ) {
if (dataItem.visible ) {
dataItem.hide (1000 , 0 , 0 , ["valueX" ]);
}
else {
dataItem.show (1000 , 0 , ["valueX" ]);
}
}
})
}
}
}
}]
},
"data" : [
{ name : "Chandler" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/chandler.jpg" , track : 1 , value : 450 },
{ name : "Ross" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/ross.jpg" , track : 2 , value : 650 },
{ name : "Joey" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/joey.jpg" , track : 3 , value : 578 },
{ name : "Monica" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/monica.jpg" , track : 4 , value : 730 },
{ name : "Phoebe" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/phoebe.jpg" , track : 5 , value : 490 },
{ name : "Rachel" , file : "https://www.amcharts.com/wp-content/uploads/assets/timeline/rachel.jpg" , track : 6 , value : 532 }
],
"yAxes" : [{
"type" : "CategoryAxis" ,
"dataFields" : {
"category" : "name"
},
"renderer" : {
"minGridDistance" : 10 ,
"innerRadius" : 5 ,
"radius" : 145 ,
"line" : {
"stroke" : "#ffffff" ,
"strokeWidth" : 5 ,
"strokeOpacity" : 1
},
"labels" : {
"fill" : "#ffffff" ,
"fontWeight" : 600 ,
"fontSize" : 11
},
"grid" : {
"strokeWidth" : 1 ,
"strokeOpacity" : 1 ,
"stroke" : "#ffffff" ,
"location" : 0 ,
"above" : true
},
"axisFills" : {
"disabled" : false ,
"fill" : "#b84f49" ,
"fillOpacity" : 1
}
},
"fillRule" : function (dataItem ) {
dataItem.axisFill .__disabled = false ;
dataItem.axisFill .opacity = 1 ;
}
}],
"xAxes" : [{
"type" : "ValueAxis" ,
"min" : 0 ,
"max" : 1000 ,
"renderer" : {
"points" : [{ x : 0 , y : -100 }, { x : 200 , y : -100 }, { x : 200 , y : 100 }, { x : 0 , y : 100 }, { x : -200 , y : 100 }, { x : -200 , y : -100 }, { x : 0 , y : -100 }],
"maxLabelPosition" : 0.98 ,
"minLabelPosition" : 0.02 ,
"polyspline" : {
"tensionX" : 0.4
},
"line" : {
"strokeOpacity" : 0.1 ,
"strokeWidth" : 10
},
"labels" : {
"fill" : "#ffffff" ,
"fontSize" : 8 ,
"fontWeight" : 600 ,
"fillOpacity" : 1 ,
"horizontalCenter" : "right" ,
"verticalCenter" : "bottom" ,
"paddingTop" : 0 ,
"paddingRight" : 10 ,
"paddingBottom" : 0 ,
"paddingLeft" : 0 ,
"adapter" : {
"rotation" : function (rotation, target ) {
if (!target.baseSprite ) {
return rotation;
}
var chart = target.baseSprite ;
var valueAxis = chart.xAxes .getIndex (0 );
var value = target.dataItem .value ;
var position = valueAxis.valueToPosition (value);
var angle = valueAxis.renderer .positionToAngle (position);
return angle;
}
}
},
"grid" : {
"strokeOpacity" : 0.3 ,
"stroke" : "#ffffff"
}
},
"axisRanges" : [{
"value" : 0 ,
"bullet" : {
"type" : "FlagBullet" ,
"label" : {
"text" : "START"
},
"adapter" : {
"dy" : function (dy, target ) {
if (!target.baseSprite ) {
return dy;
}
var chart = target.baseSprite ;
var categoryAxis = chart.yAxes .getIndex (0 );
return -categoryAxis.renderer .radius ;
}
}
}
}]
}],
"series" : [{
"type" : "CurveColumnSeries" ,
"stroke" : "#ffffff" ,
"fill" : "#ffffff" ,
"dataFields" : {
"categoryY" : "name" ,
"valueX" : "value"
},
"defaultState" : {
"transitionDuration" : 4000
},
"columns" : {
"fill" : "#ffffff" ,
"strokeOpacity" : 0 ,
"fillOpacity" : 0.3 ,
"height" : "100%" ,
"states" : {
"hover" : {
"properties" : {
"fillOpacity" : 0.9
}
}
}
},
"bullets" : [{
"type" : "CircleBullet" ,
"fill" : "#ffffff"
}]
}],
}, "chartdiv" , am4plugins_timeline.CurveChart );
</script >
<div id ="chartdiv" > </div >