文章分類/Telerik
實務上如遇到多個 charts,需要同時顯示,並可以同步進行 x 軸的區間選擇,觀察同一個區間,每個不同 charts 的變化量,或是 zoom-in、zoom-out,則需要透過 pane 的方式。
ng add @progress/kendo-angular-charts
以 time series 為例子,並透過 kendo 所提供的 groupBy 函式,將陣列資料做整理 (參考下方程式碼)。
timestamp 為 x 軸,value 為 y 軸,有時後在一個 chart 上會需要同時顯示兩種資料,所以透過 metric 欄位做 groupBy,可方便開發者切分資料。這個方式可以同時使用在一個 chart,或是多個 chart,是為筆者使用起來最為方便的做法。
const data = [{ timestamp: 1658303417000, metric: "cpu-total", value: 5.87, },{ timestamp: 1658303417000, metric: "usage_perc", value: 10.99,}];constructor() { const series = groupBy(data, [{ field: "metric" }]) as GroupResult[]; console.log(JSON.stringify(this.series, null, 2)); }
Console 取得的 Log 如下:
[{ aggregates: {}, field: "metric", items: [{metric: "cpu-total", timestamp: 1658303417000, value: 5.87}], value: "cpu-total"},{ aggregates: {}, field: "metric", items: [{metric: "usage_perc", timestamp: 1658303417000, value: 10.99}], value: "usage_perc"}]
因為多個 chart 需透過 pane component,去定義每個 chart,所以我們需要在資料做一些加工,讓我們做 data binding 時可以識別不同 pane。我們利用 loop 的方式,將 groupBy 後的資料,額外加入一些欄位,以利我們做判斷。
[{ aggregates: {}, axe: "cpuAxis", color: "red", field: "metric", items: [{metric: "cpu-total", timestamp: 1658303417000, value: 5.87, Date: new Date(1658303417000)}], value: "cpu-total"},{ aggregates: {}, axe: "memoryAxis", color: "blue", field: "metric", items: [{metric: "usage_perc", timestamp: 1658303417000, value: 10.99, Date: new Date(1658303417000)}], value: "usage_perc"}]
Kendo charts 的使用,都是採用 components 的方式,組合出你想要的 chart 功能。例如您希望在 chart 中生成一個 legend,則需將該 component 放入即可。
<kendo-chart> <kendo-chart-legend position="custom" [offsetX]="40" [offsetY]="25"> </kendo-chart-legend></kendo-chart>
pane 使用重點:
其他常用設定:
<kendo-chart [pannable]="true" [zoomable]="{ mousewheel: { lock: 'y' }, selection: { lock: 'y' } }"> <kendo-chart-legend position="custom" [offsetX]="40" [offsetY]="25"> </kendo-chart-legend> <kendo-chart-pane-defaults> <kendo-chart-pane-defaults-title font="700 18px sans-serif" position="center"> </kendo-chart-pane-defaults-title> </kendo-chart-pane-defaults> <kendo-chart-panes> <kendo-chart-pane name="cpuPane" [clip]="false" title="cpu" [height]="150"> </kendo-chart-pane> <kendo-chart-pane name="memoryPane" [clip]="false" title="memory" [height]="150"> </kendo-chart-pane> </kendo-chart-panes> <kendo-chart-value-axis> <kendo-chart-value-axis-item name="cpuAxis" pane="cpuPane"> </kendo-chart-value-axis-item> <kendo-chart-value-axis-item name="memoryAxis" pane="memoryPane"> </kendo-chart-value-axis-item> </kendo-chart-value-axis> <kendo-chart-series> <kendo-chart-series-item axis="{{x.axe}}" [color]="x.color" *ngFor="let x of data" [stack]="true" opacity="0.5" [data]="x.items" field="value" categoryField="Date" type="line" [highlight]="{ visible: false }" [markers]="{ visible: false }"> <kendo-chart-series-item-tooltip> <ng-template let-value="value"> {{x.value}}: {{ value }} </ng-template> </kendo-chart-series-item-tooltip> </kendo-chart-series-item> </kendo-chart-series> <kendo-chart-category-axis> <kendo-chart-category-axis-item [labels]="{ format: 'HH:mm' }" [maxDivisions]="12"> </kendo-chart-category-axis-item> </kendo-chart-category-axis> </kendo-chart>