yjryu / pohang_tp star
김성원 김성원 2023-12-12
차트 수정
@86adef4fea044a6689b8fa180d34381f30f013ae
client/resources/css/main.css
--- client/resources/css/main.css
+++ client/resources/css/main.css
@@ -95,6 +95,7 @@
   border-radius: 10px;
   box-shadow: 0px 0px 10px #eee;
   padding: 30px;
+  height: 500px;
 }
 
 #chartdiv{
 
client/views/components/DataChart1.vue (added)
+++ client/views/components/DataChart1.vue
This file is too big to display.
 
client/views/components/StackedColumnChart.vue (added)
+++ client/views/components/StackedColumnChart.vue
@@ -0,0 +1,181 @@
+<template>
+    <div class="chart-container" ref="chartdiv"></div>
+</template>
+  
+<script>
+import * as am5 from '@amcharts/amcharts5';
+import * as am5xy from '@amcharts/amcharts5/xy';
+import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
+
+export default {
+    props: {
+        chartData: {
+            type: Array,
+            required: true,
+        },
+        xField: {
+            type: String,
+            required: true,
+        },
+        yField: {
+            type: String,
+            required: true,
+        },
+        color: {
+            type: Array,
+            default: ['#1c7ed6'],
+        },
+    },
+    data() {
+        return {
+            chart: null,
+        };
+    },
+    methods: {
+        createChart(data, xField, yField, color) {
+            console.log(color)
+            let chartWarp = this.$refs["chartdiv"]; // 차트 상위 div ref 매칭
+            chartWarp.innerHTML = ""; // 차트 상위 div 내용 초기화 (기존 차트 삭제)
+            let div = document.createElement("div"); // 차트를 담을 빈 div 생성 (차트 하위 div)
+            div.style.width = "100%"; // 차트를 담을 div의 넓이
+            div.style.height = "100%"; // 차트를 담을 div의 높이
+            chartWarp.appendChild(div); // 차트 상위 div 안에 차트 하위 div를 추가
+            let root = am5.Root.new(div); // 차트 하위 div에 차트(root) 담기
+            this.charts = root; // 차트 정보 전역에 담기
+
+            root._logo.dispose();
+
+            let coulmns = Object.keys(data[0]);
+
+
+
+            for(let i = 0; i < coulmns.length ; i++){
+                if(coulmns[i] == xField){
+                    coulmns.splice(i,1);
+                }
+               
+            }
+            console.log('data',data)
+            console.log('coulmns',coulmns)
+
+
+            // Set themes
+            // https://www.amcharts.com/docs/v5/concepts/themes/
+            root.setThemes([
+                am5themes_Animated.new(root)
+            ]);
+            // Create chart
+            let chart = root.container.children.push(am5xy.XYChart.new(root, {
+                panX: false,
+                panY: false,
+                wheelX: "panX",
+                wheelY: "zoomX",
+                paddingLeft: 0,
+                layout: root.verticalLayout
+            }));
+
+            // Add scrollbar
+            chart.set("scrollbarX", am5.Scrollbar.new(root, {
+              orientation: "horizontal"
+            }));
+
+            // Add cursor
+          //  let cursor = chart.set("cursor", am5xy.XYCursor.new(root, {}));
+           // cursor.lineY.set("visible", false);
+
+            // Create axes
+            let xRenderer = am5xy.AxisRendererX.new(root, { minGridDistance: 30 });
+            xRenderer.labels.template.setAll({
+                centerY: am5.p50,
+                centerX: am5.p50,
+            });
+
+            xRenderer.grid.template.setAll({
+                location: 1
+            });
+
+            let xAxis = chart.xAxes.push(am5xy.CategoryAxis.new(root, {
+                maxDeviation: 0.3,
+                categoryField: xField,
+                renderer: xRenderer,
+                tooltip: am5.Tooltip.new(root, {})
+            }));
+
+            xAxis.data.setAll(data);
+
+            let yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
+                maxDeviation: 0.3,
+                min: 0,
+                renderer: am5xy.AxisRendererY.new(root, {
+                    strokeOpacity: 0.1,
+                   // inversed: true
+                })
+            }));
+
+            let legend = chart.children.push(am5.Legend.new(root, {
+                centerX: am5.p50,
+                x: am5.p50
+            }));
+
+            for(let s = 0 ; s < coulmns.length; s++){
+                this.makeSeries(chart,xField, xAxis ,yAxis, root,data,legend ,coulmns[s],coulmns[s]);
+            }
+
+
+            chart.appear(1000, 100);
+
+            return chart;
+        },
+
+        makeSeries : function(chart,xField, xAxis ,yAxis ,root ,data , legend ,  name, fieldName) {
+            let series = chart.series.push(am5xy.ColumnSeries.new(root, {
+                name: name,
+                stacked: true,
+                xAxis: xAxis,
+                yAxis: yAxis,
+                valueYField: fieldName,
+                categoryXField: xField
+            }));
+
+            series.columns.template.setAll({
+                tooltipText: "{name}, {categoryX}: {valueY}",
+                tooltipY: am5.percent(10)
+            });
+            series.data.setAll(data);
+
+            // Make stuff animate on load
+            // https://www.amcharts.com/docs/v5/concepts/animations/
+            series.appear();
+
+            series.bullets.push(function () {
+                return am5.Bullet.new(root, {
+                sprite: am5.Label.new(root, {
+                    text: "{valueY}",
+                    fill: root.interfaceColors.get("alternativeText"),
+                    centerY: am5.p50,
+                    centerX: am5.p50,
+                    populateText: true
+                })
+                });
+            });
+        legend.data.push(series);        
+    }
+    },
+    watch: {
+        'chartData': function (newData) {
+            this.createChart(newData, this.xField, this.yField, this.color);
+        }
+    },
+    mounted() {
+        // this.chart = this.createChart(this.data, this.xField, this.yField, this.color);
+    },
+};
+</script>
+  
+<style scoped>
+.chart-container {
+    width: 100%;
+    height: 95%;
+}
+</style>
+  (No newline at end of file)
client/views/components/VerticalBarChart.vue
--- client/views/components/VerticalBarChart.vue
+++ client/views/components/VerticalBarChart.vue
@@ -57,7 +57,9 @@
                 panY: true,
                 wheelX: "panX",
                 wheelY: "zoomX",
-                pinchZoomX: true
+                pinchZoomX: true,
+                paddingLeft:0,
+                paddingRight:1
             }));
 
             // Add cursor
@@ -87,7 +89,7 @@
                 min: 0,
                 renderer: am5xy.AxisRendererY.new(root, {
                     strokeOpacity: 0.1,
-                    inversed: true
+                   // inversed: true
                 })
             }));
 
@@ -152,7 +154,7 @@
 <style scoped>
 .chart-container {
     width: 100%;
-    height: 300px;
+    height: 95%;
 }
 </style>
   
(No newline at end of file)
client/views/pages/Main/Main.vue
--- client/views/pages/Main/Main.vue
+++ client/views/pages/Main/Main.vue
@@ -10,40 +10,50 @@
             <div class="content-box">
                 <div class="chart-title">
                     <div class="flex">
-                        <p>월별 평균 길이 Z축 마모</p>
-                        <select name="" id="">
-                            <option v-for="(tool, index) in tools" :key="index" :value="tool">{{ tool }}</option>
-                        </select>
+                        <p>정비 주기 패턴 군집</p>                        
                     </div>
                 </div>
-                <VerticalBarChart :chartData="emptyData" xField="month" yField="value" />
+                <DataChart1 :chartData="emptyLineData" :keyMapping="lineDataKeyMapping" :xField="lineDataKeyMapping.date" />
             </div>
             <div class="content-box">
                 <div class="chart-title">
                     <div class="flex">
-                        <p>시간대별 평균 길이 Z축 마모</p>
-                        <select name="" id="">
-                            <option v-for="(tool, index) in tools" :key="index" :value="tool">{{ tool }}</option>
-                        </select>
+                        <p>군집/월별 점검 횟수</p>                       
                     </div>
                 </div>
-                <VerticalBarChart :chartData="emptyTimeData" :xField="'time'" :yField="'value'" :color="['#1c7ed6','#74c0fc','#1864ab']" />
+                <!-- <VerticalBarChart :chartData="emptyTimeData" :xField="'time'" :yField="'mean'" :color="['#1c7ed6','#74c0fc','#1864ab']" /> -->
             </div>
             <div class="content-box">
                 <div class="chart-title">
                     <div>
-                        <p>가동시간에 따른 각 툴별(도구) 길이 Z축 마모</p>
+                        <p>군집별 평균 주행거리</p>
                     </div>
                 </div>
-                <LineChart :chartData="emptyLineData" :keyMapping="lineDataKeyMapping" :xField="lineDataKeyMapping.date" />
+                <VerticalBarChart :chartData="emptyClusterData" :xField="'Cluster_Labels'" :yField="'mean'" :color="['#1c7ed6','#74c0fc','#1864ab']" />               
             </div>
             <div class="content-box">
                 <div class="chart-title">
                     <div>
-                        <p>가동시간에 따른 각 툴별(도구) 길이 X축 형상마모</p>
+                        <p>군집별 평균정비 주기</p>
                     </div>
                 </div>
-                <LineChart :chartData="emptyLineData" :keyMapping="lineDataKeyMapping" :xField="lineDataKeyMapping.date" />
+                <VerticalBarChart :chartData="emptyClusterData2" :xField="'Cluster_Labels'" :yField="'mean'" :color="['#1c7ed6','#74c0fc','#1864ab']" />          
+            </div>
+            <div class="content-box">
+                <div class="chart-title">
+                    <div>
+                        <p>군집별 차종 현황</p>
+                    </div>
+                </div>
+                <StackedColumnChart :chartData="emptyClusterData3" :xField="'Cluster_Labels'" />
+            </div>
+            <div class="content-box">
+                <div class="chart-title">
+                    <div>
+                        <p>군집별 제조사 현황</p>
+                    </div>
+                </div>
+                <StackedColumnChart :chartData="emptyClusterData4" :xField="'Cluster_Labels'" />
             </div>
         </div>
     </div>
@@ -52,6 +62,9 @@
 <script>
 import VerticalBarChart from '../../components/VerticalBarChart.vue';
 import LineChart from '../../components/LineChart.vue';
+import DataChart1 from '../../components/DataChart1.vue';
+import StackedColumnChart from '../../components/StackedColumnChart.vue';
+
 
 export default {
     data() {
@@ -86,7 +99,36 @@
                 { date: "2023-01-01", value1: 10, value2: 20, value3: 50 },
                 { date: "2023-01-02", value1: 15, value2: 25, value3: 50 },
                 { date: "2023-01-03", value1: 20, value2: 30, value3: 50 },
-            ]
+            ],
+            emptyClusterData: [],
+            clusterData : [
+                { Cluster_Labels:0.0,  mean:242.8801507382 },
+                { Cluster_Labels:1.0,  mean:90.112943153},
+                { Cluster_Labels:2.0,  mean:158.4532030077},
+                { Cluster_Labels:3.0,  mean:60.4299174302 },
+            ],
+            emptyClusterData2: [],
+            clusterData2 :[
+                 {  "Cluster_Labels":0.0, "mean":91.0661736084 },
+                 {  "Cluster_Labels":1.0, "mean":331.3113772455 },
+                 { "Cluster_Labels":2.0, "mean":12.2679856115  },
+                 {  "Cluster_Labels":3.0, "mean":123.3695111848 }
+            ],
+            emptyClusterData3: [],
+            clusterData3 :[
+                { "Cluster_Labels":0.0, "9":787.0, "B":41.0, "D":46.0, "F":1135.0, "L":320.0, "M":200.0 },
+                { "Cluster_Labels":1.0, "9":386.0, "B":105.0, "D":250.0, "F":831.0, "L":329.0, "M":459.0 },
+                { "Cluster_Labels":2.0, "9":314.0, "B":8.0, "D":34.0, "F":103.0, "L":34.0, "M":29.0  },
+                { "Cluster_Labels":3.0, "9":297.0, "B":257.0, "D":380.0, "F":1152.0, "L":495.0, "M":667.0  }
+            ],
+            emptyClusterData4: [],
+            clusterData4 :[
+                { "Cluster_Labels":0.0, "B":40.0, "D":786.0, "M":1501.0, "N":241.0 },
+                { "Cluster_Labels":1.0, "B":332.0, "D":394.0, "M":1381.0,"N":564.0  },
+                { "Cluster_Labels":2.0, "B":41.0, "D":314.0, "M":164.0, "N":37.0 },
+                { "Cluster_Labels":3.0, "B":399.0, "D":305.0, "M":1992.0, "N":924.0}
+            ],
+            
         }
     },
     methods: {
@@ -95,6 +137,10 @@
             this.emptyTimeData = this.timeData;
             this.emptyNetData = this.netData;
             this.emptyLineData = this.lineData;
+            this.emptyClusterData = this.clusterData;
+            this.emptyClusterData2 = this.clusterData2;
+            this.emptyClusterData3 = this.clusterData3;
+            this.emptyClusterData4 = this.clusterData4;
         }
     },
     watch: {
@@ -103,7 +149,9 @@
     computed: {},
     components: {
         'VerticalBarChart': VerticalBarChart,
-        'LineChart': LineChart
+        'LineChart': LineChart,
+        'DataChart1': DataChart1,
+        'StackedColumnChart' : StackedColumnChart
     },
     mounted() {
         this.dataSet();
Add a comment
List