안녕하세요. 오늘은 am차트에 대해 이야기해보겠습니다.
am차트를 사용하여 데이터까지 연동하는 형태로 정리하려 합니다.
완성형태입니다. 꽤 깔끔한 디자인입니다.
우선 am차트 사이트로 접속합니다.
amCharts = www.amcharts.com/
JavaScript Charts & Maps - amCharts
JavaScript / HTML5 charts and maps data-viz libraries for web sites and applications. Fast and responsive. WordPress plugin available. Developed since 2006.
www.amcharts.com
차트 홈페이지답게 차트스러운 화면이 나옵니다. 여기서 데모를 클릭해줍니다.
엄청나게 많은 차트들이 나옵니다....여기서 제가 만든 파이형태의 차트를 선택해보죠
아래 화면이 나올겁니다.. 여기서 자바스크립트 탭이 활성화된 상태에서 ... 표시를 눌러줍니다.
그럼 큰 화면으로 소스가 나타나게 됩니다~~~~ 여기를 붙여넣은 다음 사용하면 됩니다.
controller
우선 List로 배열을 만든 다음 Json배열형태로 만들어줍니다.
List<ContractVO> result = contractStatsManageService.getWorkChartInfo(searchVO);
JSONArray cJsonArr = new JSONArray();
JSONObject cJsonObj = new JSONObject();
for(ContractVO vo : result) {
cJsonObj.put("y", vo.getChart_total());
cJsonObj.put("d", vo.getCo_labor());
cJsonArr.add(cJsonObj);
}
model.addAttribute("chartJSON", cJsonArr);
service
List<ContractVO> getWorkChartInfo(ContractVO searchVO);
serviceImpl
@Override
public List<ContractVO> getWorkChartInfo(ContractVO searchVO){
return dao.getWorkChartInfo(searchVO);
}
DAO
public List<ContractVO> getWorkChartInfo(ContractVO searchVO) {
return selectList("getWorkChartInfo", searchVO);
}
XML
select
abc
,count(*) as abc_total
from
tbl_name
group by
abc
Script & Html
스크립트 전체소스입니다...
하나하나 뜯어보기로하죠!!
<style>
#chartdiv {
width: 100%;
height: 500px;
}
</style>
<!-- Resources -->
<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>
<script type="text/javascript">
var todayInfo = null;
<!-- Chart code -->
am4core.ready(function() {
// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end
var chart = am4core.create("chartdiv", am4charts.PieChart3D);
chart.hiddenState.properties.opacity = 0; // this creates initial fade-in
var qq = getPersonCnt("cateArr");
var ee = getPersonCnt("data");
var dataList = [];
for (var i = 0, j= 0; i < qq.length, j < ee.length; i++,j++) {
var data = {};
data.country = qq[i];
data.litres = ee[j];
dataList.push(data);
}
var reqData = {};
reqData.dataList = dataList;
var sendData = {};
sendData.reqData = reqData;
chart.data = reqData.dataList
chart.innerRadius = am4core.percent(40);
chart.depth = 120;
chart.legend = new am4charts.Legend();
var series = chart.series.push(new am4charts.PieSeries3D());
series.dataFields.value = "litres";
series.dataFields.depthValue = "litres";
series.dataFields.category = "country";
series.slices.template.cornerRadius = 5;
series.colors.step = 3;
}); // end am4core.ready()
function getPersonCnt(type){
if(todayInfo==null) todayInfo=${chartJSON};
var todayInfoMap = resultProcLineChart(todayInfo);
if(todayInfoMap==null) return null;
if(type=="data"){
return todayInfoMap.get("data");
}else{
return todayInfoMap.get("cateArr");
}
}
function resultProcLineChart($obj){
if($obj==null) return null;
var resMap = new JqMap();
var cateArr = new Array();
var dataArr = new Array();
for(var k in $obj){
var xobj =$obj[k];
cateArr.push(xobj.d);
dataArr.push(xobj.y);
}
resMap.put("cateArr",cateArr);
resMap.put("data",dataArr);
return resMap;
}
</script>
<div id="chartdiv"></div>
var todayInfo = null; 은 컨트롤러에서 JSON배열로 담은 녀석을 사용하기 위한 전역변수입니다.
var todayInfo = null;
resultProcLineChart함수는
컨트롤러에서 model로 빼낸 ‘chartJSON’이 obj로 되어서 for문을 통하여 xobj에 넣어준 후
각 선언한 배열 (cateArr / dateArr)에 오브젝트에서 put으로 빼낸 y와 d를 넣어줍니다.
그리고 resmap에 최종적으로 넣은 후 return으로 반환시켜줍니다.
function resultProcLineChart($obj){
if($obj==null) return null;
var resMap = new JqMap();
var cateArr = new Array();
var dataArr = new Array();
for(var k in $obj){
var xobj =$obj[k];
cateArr.push(xobj.d);
dataArr.push(xobj.y);
}
resMap.put("cateArr",cateArr);
resMap.put("data",dataArr);
return resMap;
}
Getpersoncnt함수는
Getpersoncnt에 타입을 넣어서 x축과 y축을 구분할 수 있도록 해줍니다.
컨트롤러에서 model로 빼낸 ‘chartJSON’을 resultProcLineChart함수안에 넣어준 다음
todayInfoMap에 넣어 Map형태로 만들어줍니다.
function getPersonCnt(type){
if(todayInfo==null) todayInfo=${chartJSON};
var todayInfoMap = resultProcLineChart(todayInfo);
if(todayInfoMap==null) return null;
if(type=="data"){
return todayInfoMap.get("data");
}else{
return todayInfoMap.get("cateArr");
}
}
그리고 가장 중요한 데이터를 넣는 부분입니다!!
홈페이지 데모소스에서 나타나있는것과 같이 JSON형태의 데이터형식입니다.
이 부분을 맞춰줘야 차트가 나타날 수 있습니다.
제가 많이 부족해서 이 부분에서 시간을 엄청 날렸네요...
우선 만들어낸 배열을 각각 변수에 담습니다....(qq,ee)
dataList란 대괄호를 만듭니다.
그리고 for문을 돌리고
data란 중괄호 안에 country와 litres의 항목을 선언하고 그 안에 각각의 배열값을 넣어줍니다.
그리고 dataList 즉 대괄호 안에 push로 넣어줍니다.
그리고 reqData의 중괄호 안에 dataList를 넣어주면 JSON형태의 값이 출력되게 됩니다.
var qq = getPersonCnt("cateArr");
var ee = getPersonCnt("data");
var dataList = [];
for (var i = 0, j= 0; i < qq.length, j < ee.length; i++,j++) {
var data = {};
data.country = qq[i];
data.litres = ee[j];
dataList.push(data);
}
var reqData = {};
reqData.dataList = dataList;
chart.data = reqData.dataList
'JAVASCRIPT & JQUERY' 카테고리의 다른 글
[Jquery] selectbox & radio 선택 유지하는 방법 (0) | 2021.03.24 |
---|---|
[Java&Javascript] 데이터베이스 숫자 값을 콤마 붙여 가져오고 빼서 내보내는 방법!! (0) | 2021.02.24 |
[Jquery] 현재날짜와 다음달날짜 구하는방법 (feat.포맷변경/체크박스) (0) | 2021.02.03 |
[JQuery] 핸드폰번호 정규식 하이픈 추가 방법 (2) | 2020.12.30 |
[JQuery]URL 정규표현식 및 유효성검사 방법 (0) | 2020.12.29 |
댓글