Flexmonster Pivot 및 amCharts가 포함된 멋진 대시보드

14039 단어 javascriptdatascience
나는 그것이 옷이든, 그림이든, 흥미로운 시각화이든 상관없이 항상 밝고 특이한 것을 좋아했습니다. 그리고 그런 것을 만나면 즉시 직접 해보고 싶습니다.

이번에도 일어났습니다. amCharts에 있는 모든 예를 보았을 때 가까운 장래에 내가 어떻게 지출할지 즉시 알았습니다. 이것이 바로 차트와 피벗을 결합하고 멋진 대화형 대시보드를 만드는 동시에 의미 있는 대시보드를 만드는 방법에 대한 이 미니 튜토리얼이 등장한 방식입니다.

그래서 일하러 가자!

1단계. 데이터



데이터부터 시작하겠습니다. 이번에는 프랑스, ​​그리스, 이탈리아에서 치즈 생산에 대한 정보를 얻기로 했습니다. 그것들은 내 JSON 배열에 있으며 코드에 직접 삽입하고 getData() 함수를 통해 피벗에 대한 데이터를 가져옵니다.

function getData() {
  return [
    {
      Date: "2020-01-05",
      id: "GR",
      CountryCode: "gr",
      Country: "Greece",
      Feta: 62,
      Mozzarella: 8,
      "Parmigiano-Reggiano": 8
    },
    {
      Date: "2020-01-12",
      id: "GR",
      CountryCode: "gr",
      Country: "Greece",
      Feta: 62,
      Mozzarella: 11,
      "Parmigiano-Reggiano": 8
    },
…
] }


2단계. 피벗



이제 피벗 자체를 생성하고 마지막에 대시보드용 차트를 생성하는 reportcompleteevent 핸들러를 추가해 보겠습니다.

let pivot = new Flexmonster({
  container: "pivot-container",
  licenseFilePath: "https://cdn.flexmonster.com/codepen.key",
  componentFolder: "https://cdn.flexmonster.com/",
  height: 440,
  customizeCell: customizeCell,
  report: {
    dataSource: {
      data: getData(),
      mapping: {
        Date: {
          type: "date"
        },
        Country: {
          type: "string"
        },
        id: {
          type: "string"
        },
        CountryCode: {
          type: "property",
          hierarchy: "Country"
        },
        Feta: {
          type: "number"
        },
        Mozzarella: {
          type: "number"
        },
        "Parmigiano-Reggiano": {
          type: "number"
        }
      }
    },
    slice: {
      rows: [
        {
          uniqueName: "Country"
        },
        {
          uniqueName: "[Measures]"
        }
      ],
      columns: [
        {
          uniqueName: "Date.Month",
          filter: {
            members: [
              "date.month.[january]",
              "date.month.[february]",
              "date.month.[march]",
              "date.month.[april]",
              "date.month.[may]",
              "date.month.[june]"
            ]
          }
        }
      ],
      measures: [
        {
          uniqueName: "Feta",
          aggregation: "sum",
          grandTotalCaption: "Feta"
        },
        {
          uniqueName: "Mozzarella",
          aggregation: "sum",
          grandTotalCaption: "Mozzarella"
        },
        {
          uniqueName: "Parmigiano-Reggiano",
          aggregation: "sum",
          grandTotalCaption: "Parmigiano-Reggiano"
        }
      ]
    },
    options: {
      grid: {
        showHeaders: false,
        showGrandTotals: "rows"
      },
      showAggregationLabels: false
    }
  },
  reportcomplete: function () {
    pivot.off("reportcomplete");
    createPieChart();
    createStackedChart();
    createMapChart();
    createPictorialChart();
  }
});


3단계. 커스터마이징
피벗 자체를 더 흥미롭게 만들기 위해 국가에 국기를 추가하는 것이 좋습니다. customizeCell 함수를 통해 이 작업을 수행하고 CSS를 통해 스타일을 설정합니다. 펼쳐진 변형과 접힌 변형 모두에 스타일을 지정하고 있습니다.

function customizeCell(cell, data) {
  if (data.hierarchy && data.type == "header") {
    console.log(data);
    if (
      data.hierarchy.caption == "Country" &&
      data.member &&
      data.member.properties
    ) {
      let name = data.member.properties.CountryCode;
      let flag = `<i class="fm-icon ${
        data.expanded ? "fm-expanded-icon" : "fm-collapsed-icon"
      }" 
        title="${data.expanded ? "Click to collapse" : "Click to expand"}"></i>
        <img class="flag-icon" src="https://cdn.flexmonster.com/i/flags/${name.toLowerCase()}.svg">`;
      cell.text = `${flag}<span style="margin-left: 2px; line-height: 16px">${data.member.caption}</span>`;
      cell.addClass("fm-custom-cell");
    }
  }
}


CSS

.fm-custom-cell {
  display: flex !important;
  align-items: center !important;
  font-size: 12px !important;
}

.fm-custom-cell .flag-icon {
  width: 21px !important;
  height: 16px !important;
  margin-left: 0 !important;
  margin-right: 2px !important;
}

#fm-pivot-view
  .fm-grid-layout
  .fm-custom-cell.fm-expanded
  .fm-expanded-icon::before,
#fm-pivot-view
  .fm-grid-layout
  .fm-custom-cell.fm-collapsed
  .fm-collapsed-icon::before {
  top: -2px;
  height: 16px;
}


4단계. 차트



이제 차트에 도달할 수 있습니다.

먼저 차트를 선언하고 차트에서 사용할 색상을 선택합니다.

let mapChart, pieChart, stackedChart, pictorialChart;
// Apply amCharts theme
am4core.useTheme(am4themes_animated);

const chartColors = [
  am4core.color("#4CBF8B"),
  am4core.color("#FFCD4C"),
  am4core.color("#E8734C"),
  am4core.color("#9875E3"),
  am4core.color("#4C9EFF"),
  am4core.color("#8ACFC3"),
  am4core.color("#CD97E6"),
  am4core.color("#F1D34C"),
  am4core.color("#65D2E7")
];

const cheeseColors = [
  am4core.color("#FFE268"),
  am4core.color("#FFCD4C"),
  am4core.color("#FFB037")
];


차트의 데이터는 특별한 getData API 호출을 통해 피벗에서 전송됩니다. 여기처럼:

function createPieChart() {
  pivot.amcharts.getData(
    {
      slice: {
        rows: [
          {
            uniqueName: "Date.Month",
            filter: {
              members: [
                "date.month.[january]",
                "date.month.[february]",
                "date.month.[march]",
                "date.month.[april]",
                "date.month.[may]",
                "date.month.[june]"
              ]
            }
          }
        ],
        measures: [
          {
            uniqueName: "Feta",
            aggregation: "sum"
          }
        ]
      }
    },
    drawPieChart,
    updatePieChart
  );
}


amCharts 데모 페이지에서 다양한 차트와 그래픽을 찾아 프로젝트에 적용할 수 있습니다. 이 대시보드에서는 StackedChart, PieChart, MapChart 및 PictorialChart를 선택했습니다.

이 기사에서는 PictorialChart를 사용하여 피벗에서 데이터를 전송하는 방법을 보여주고 나머지 차트에서는 모든 것이 동일한 방식으로 작동합니다. demo의 소스 코드에서 더 자세히 공부할 수 있습니다.

따라서 먼저 차트를 초기화한 다음 데이터를 추가합니다.

 pictorialChart = am4core.create(
    "amcharts-pictorial-container",
    am4charts.SlicedChart
  );
 pictorialChart.data = chartData.data;


이것이 끝을 보는 방법입니다.

function drawPictorialChart(chartData, rawData) {
  var iconPath =
    "M10.512,156.385l231.164,35.647c-1.779-3.578-2.869-7.554-2.869-11.817c0-14.766,11.962-26.728,26.733-26.728 c14.768,0,26.733,11.962,26.733,26.728c0,7.173-2.861,13.657-7.466,18.466l75.392,11.622c8.752,1.351,12.632-3.979,8.66-11.906 l-35.401-70.833c-4.172,2.687-9.125,4.29-14.459,4.29c-14.768,0-26.726-11.968-26.726-26.733c0-11.491,7.29-21.213,17.473-24.98l-17.429-34.825c-3.955-7.92-13.781-11.547-21.94-8.093L232.122,53.41c5.122,7.019,8.175,15.631,8.175,24.98c0,23.463-19.015,42.477-42.49,42.477c-20.977,0-38.365-15.222-41.804-35.223L9.43,147.683C1.28,151.141,1.759,155.032,10.512,156.385z M125.661,123.215c4.883,0,8.838,3.95,8.838,8.833c0,4.883-3.955,8.833-8.838,8.833c-4.873,0-8.833-3.949-8.833-8.833C116.829,127.165,120.788,123.215,125.661,123.215zM30.294,218.466c17.012,0,30.799,13.793,30.799,30.805c0,16.996-13.788,30.797-30.799,30.797c-6.444,0-12.419-1.987-17.364-5.374l3.048,26.361c1.02,8.812,9.011,16.362,17.859,16.875l189.024,11.157c-0.068-0.754-0.229-1.476-0.229-2.24c0-14.644,11.857-26.497,26.493-26.497c14.643,0,26.497,11.854,26.497,26.497c0,1.815-0.192,3.595-0.529,5.313l59.086,3.486c8.844,0.514,17.34-6.115,18.979-14.827l18.431-98.29L0,162.851l7.598,65.657C13.229,222.353,21.297,218.466,30.294,218.466z M135.451,219.127c10.283,0,18.612,8.331,18.612,18.622c0,10.287-8.337,18.619-18.612,18.619c-10.293,0-18.623-8.332-18.623-18.619C116.829,227.458,125.158,219.127,135.451,219.127zM98.206,271.243c4.885,0,8.844,3.947,8.844,8.829c0,4.885-3.959,8.832-8.844,8.832c-4.871,0-8.831-3.947-8.831-8.832C89.375,275.19,93.335,271.243,98.206,271.243z";

  pictorialChart = am4core.create(
    "amcharts-pictorial-container",
    am4charts.SlicedChart
  );
  pictorialChart.hiddenState.properties.opacity = 0; // this makes initial fade in effect

  pictorialChart.data = chartData.data;

  var series = pictorialChart.series.push(
    new am4charts.PictorialStackedSeries()
  );
  series.colors.list = cheeseColors;

  series.dataFields.value = pivot.amcharts.getMeasureNameByIndex(rawData, 0);
  series.dataFields.category = pivot.amcharts.getCategoryName(rawData);
  series.alignLabels = true;
  series.labels = "disabled";
  series.ticks = "disabled";

  series.maskSprite.path = iconPath;

  pictorialChart.legend = new am4charts.Legend();
  pictorialChart.legend.position = "right";
  let marker = pictorialChart.legend.markers.template.children.getIndex(0);
  pictorialChart.legend.markers.template.width = 20;
  pictorialChart.legend.markers.template.height = 20;
  marker.cornerRadius(20, 20, 20, 20);

  pictorialChart.responsive.enabled = true;
  pictorialChart.responsive.rules.push({
    relevant: function (target) {
      if (target.pixelWidth <= 600) {
        return true;
      }
      return false;
    },
    state: function (target, stateId) {
      if (target instanceof am4charts.PictorialStackedSeries) {
        var state = target.states.create(stateId);

        var labelState = target.labels.template.states.create(stateId);
        labelState.properties.disabled = true;

        var tickState = target.ticks.template.states.create(stateId);
        tickState.properties.disabled = true;
        return state;
      }

      return null;
    }
  });
}


또한 피벗 데이터의 변경 사항에 따라 차트가 대화식으로 유지되고 변환되도록 차트를 업데이트하는 것을 잊지 않습니다.

function updatePictorialChart(chartData, rawData) {
  pictorialChart.dispose();
  drawPictorialChart(chartData, rawData);
}


5단계. 대시보드



이제 마침내 이 모든 것을 페이지에 추가할 수 있습니다. 먼저 라이브러리 자체를 추가하십시오.

<script src="https://cdn.flexmonster.com/flexmonster.js"></script>
<script src="https://cdn.flexmonster.com/lib/flexmonster.amcharts.js"></script>
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/maps.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>
<script src="https://cdn.amcharts.com/lib/4/geodata/worldHigh.js"></script>


CSS 코드에서 레이블의 스타일과 차트의 컨테이너를 미리 지정합니다.

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
    Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

.chart-container {
  height: 450px;
}

.demo-box {
  background-color: #fafafa;
  position: relative;
  padding: 40px 30px 30px 30px;
  border: 1px solid #e9e9e9;
  margin-bottom: 20px;
  margin-top: 40px;
}

.demo-title {
  font-size: 18px;
  margin-bottom: 30px;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  line-height: 24px;
}


다음으로, 페이지에 행의 모든 ​​구성 요소를 추가하고 차트 제목에 서명합니다.

<div id="pivot-container"></div>

<div class="demo-box">
  <div class="demo-title"><strong>Overall Cheese Interest by Month</strong></div>
  <div id="amcharts-stacked-container" class="chart-container"></div>
</div>

<div class="demo-box">
  <div class="demo-title"><strong>Total Cheese Interest by Country</strong></div>
  <div id="amcharts-pictorial-container" class="chart-container"></div>
  <div>Icons made by <a href="https://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div>
</div>

<div class="demo-box">
  <div class="demo-title"><strong>Feta Interest by Month</strong></div>
  <div id="amcharts-pie-container" class="chart-container"></div>
</div>

<div class="demo-box no-text-before no-text-after">
  <div class="demo-title"><strong>Feta Interest by Country</strong></div>
  <div id="amcharts-map-container" class="chart-container"></div>
</div>


짜잔! - 인터랙티브하고 현대적인 치즈 만들기 대시보드가 ​​준비되었습니다!

좋은 웹페이지 즐겨찾기