在應用中主要分享曾經走過的坑和對於一些比較常用的圖表屬性說明
環境:vite + vue3
<script setup>
+ js
套件版本: am4
按照官網文件用 npm 安裝後,開始使用過程中也是按照文件的 Basics 執行,相關程式碼如下:
<template>
<div id="chartdiv" style="width: 100%; height: 400px" />
</template>
<script setup>
import * as am4core from '@amcharts/amcharts4/core'
import * as am4charts from '@amcharts/amcharts4/charts'
import am4themes_animated from '@amcharts/amcharts4/themes/animated'
// 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
am4core.useTheme(am4themes_animated)
// Create chart instance
let chart = am4core.create('chartdiv', am4charts.PieChart)
// Add data
chart.data = [...]
let pieSeries = chart.series.push(new am4charts.PieSeries())
pieSeries.dataFields.value = 'litres'
pieSeries.dataFields.category = 'country'
</script>
畫面展示:
畫面沒有出現任何圖表卻出現這段提醒:html container 'chartdiv' not found
id
來控制,但是如果和 vue.js 使用則是改用 ref
(這樣也有關係?我滿頭問號!)
id
去抓的,只是多做一件事情:把實例掛載到 onMounted
import { onMounted, onBeforeUnmount } from 'vue'
import * as am4core from '@amcharts/amcharts4/core'
import * as am4charts from '@amcharts/amcharts4/charts'
import am4themes_animated from '@amcharts/amcharts4/themes/animated'
// 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
am4core.useTheme(am4themes_animated)
function renderPieChart() {
// Create chart instance
const chart = am4core.create('chartdiv', am4charts.PieChart)
// Add data
chart.pieChart.data = [...]
// Create pie series
let pieSeries = chart.pieChart.series.push(new am4charts.PieSeries())
pieSeries.dataFields.value = 'litres'
pieSeries.dataFields.category = 'country'
}
onMounted(() => {
renderPieChart()
})
onBeforeUnmount(() => {
if (chart) {
chart.dispose()
}
})
畫面展示:
⚠️ 對於 AmCharts 4(或其他類似的圖表庫),圖表的渲染需要依賴特定的 DOM 元素,因此必須在 DOM 元素可用後才能進行。 這就是為什麼通常將 AmCharts 圖表的創建和配置放在onMounted
生命週期鉤子內的原因。
Anatomy of a Pie Chart
https://www.amcharts.com/docs/v4/chart-types/pie-chart/
1. Y 軸
屬性 | 說明 | 範例 |
---|---|---|
valueAxis 物件 | 圖表的 Y 軸 | const valueAxis = new AmCharts.ValueAxis(); |
axisColor | 軸的顏色 | valueAxis.axisColor= “#FF6600”; |
axisThickness | 軸的寬度 | valueAxis.axisThickness = 1; |
gridAlpha | 軸的透明度,數值介於0-1之間,0全透明 | valueAxis1.gridAlpha = 0.2; |
tickLength | 軸從下到上像左或右伸出來的延長線 | valueAxis1.tickLength =0; |
minimum | 軸的最小值,如果不設定那麼最小值根據資料動態變化 | valueAxis1.minimum = -100; |
maximum | 軸的最大值,如果不設定那麼最大值會根據資料動態變化 | valueAxis1.maximum = 100; |
語法 | 說明 |
---|---|
chart.legend = new am4charts.Legend(); |
建立了一個新的圖例實例並將其指派給 chart.legend 屬性 |
chart.legend.position = ‘bottom’; |
可用選項有: "left", "right", "top", "bottom" (default) 和 "absolute" |
chart.legend.useDefaultMarker = true; |
啟用了圖例中使用預設的標記符號(marker) |
chart.legend.itemContainers.template.paddingTop = 5; |
Controlling spacing:圖例中每個項目容器的頂部內邊距 |
chart.legend.itemContainers.template.paddingBottom = 0 |
Controlling spacing:圖例中每個項目容器的底部內邊距 |
chart.legend.markers.template.children.getIndex(0); |
取得圖例的第一個標記符號 |
marker.width = 12; |
設定圖例標記符號的寬度為 12 像素 |
marker.height = 12; |
設定圖例標記符號的高度為 12 像素 |
marker.dy = 4; |
垂直偏移量為 4 像素。 這可以用來微調標記符號的位置 |
marker.cornerRadius(6, 6, 6, 6); |
設定標記符號的圓角半徑 |
語法-data | 說明 |
---|---|
chart.series.push(new am4charts.PieSeries()); |
建立一個新的餅圖資料系列 |
pieSeries.dataFields.value |
指定圓餅圖資料系列中表示值的資料欄位。 |
pieSeries.dataFields.category |
指定圓餅圖資料系列中表示類別(標籤)的資料欄位。 |
語法-樣式標籤 | 說明 |
---|---|
pieSeries.slices.template.stroke |
配置圓餅圖切片的邊框顏色 |
pieSeries.slices.template.strokeOpacity |
設定切片的邊框不透明度 |
pieSeries.ticks.template.disabled |
圓餅圖切片上的不顯示刻度線 |
pieSeries.labels.template.disabled |
圓餅圖切片上的不顯示標籤 |
語法-tooltip | 說明 |
---|---|
pieSeries.slices.template.tooltipText = "[bold]{category}\n{value.value} 次[/]"; |
當滑鼠懸停在圓餅圖切片上時顯示的工具提示文字,這裡可以用 { } 客製化內容 |
pieSeries.tooltip.getFillFromObject |
設定工具提示的填滿色彩不會從物件中獲取,而將其自訂設定。 |
pieSeries.tooltip.label.propertyFields.fill |
設定工具提示文字的填滿顏色為白色。 |
pieSeries.tooltip.background.propertyFields.stroke |
工具提示的背景邊框顏色為白色 |
pieSeries.tooltip.background.propertyFields.fill = "color"; |
設定工具提示的背景填滿顏色為資料中的 "color" 屬性 |
DEMO
https://www.amcharts.com/demos/DEMO 有很多範例簡介,點選後可以再圖表的右下角看到原始碼,這裡要特別留意...因為目前已經是 am5 所以如果專案是使用舊版本要自行轉換
<template>
<div class="hello" id="chartdiv" />
</template>
<script setup>
import { onMounted, onBeforeUnmount } from 'vue';
import * as am4core from '@amcharts/amcharts4/core';
import * as am4charts from '@amcharts/amcharts4/charts';
import am4themes_animated from '@amcharts/amcharts4/themes/animated';
// 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
am4core.useTheme(am4themes_animated);
let chart = null;
function renderXYChart() {
// Create chart instance
const chart = am4core.create('chartdiv', am4charts.XYChart)
// Add data
chart.data = [
{
date: new Date(2018, 0, 1),
value: 450,
value2: 362,
value3: 699
},...
];
// Create axes
const dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.grid.template.location = 0;
dateAxis.renderer.minGridDistance = 30;
const valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
// 監聽Y軸的ready事件,該事件在Y軸準備好後觸發。
valueAxis.events.on('ready', function (ev) {
ev.target.min = ev.target.min
ev.target.max = ev.target.max
});
// Create series
function createSeries(field, name) {
const series = chart.series.push(new am4charts.ColumnSeries())
series.dataFields.valueY = field
series.dataFields.dateX = 'date'
series.name = name
series.tooltipText = '{dateX}: [b]{valueY}[/]'
series.strokeWidth = 2
return series
};
createSeries('value', 'Series #1');
createSeries('value2', 'Series #2');
createSeries('value3', 'Series #3');
// 建立圖例(Legend)並將其賦值給圖表,以在圖表中顯示系列標籤
chart.legend = new am4charts.Legend();
// 啟用互動式遊標,允許使用者在圖表上查看數據點的詳細資訊
chart.cursor = new am4charts.XYCursor();
// 新增水平滾動條,以便用戶可以滾動查看較長的圖表
chart.scrollbarX = new am4core.Scrollbar();
}
onMounted(() => {
renderXYChart()
})
onBeforeUnmount(() => {
if (chart) {
chart.dispose()
}
})
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
width: 100%;
height: 500px;
}
</style>