stories/chart.heatMap.stories.js (176 lines of code) (raw):
import React from 'react';
import { storiesOf } from '@storybook/react';
import { Util, Wheatmap, Wcontainer, themes } from '@alicloud/cloud-charts';
const stories = storiesOf('Wheatmap', module);
const data = [
{
name: '类型一',
data: [
['aws1', 'aws1'],
['aws2', 'aws2'],
['aws3', 'aws3'],
['aws4', 'aws4'],
['aws5', 'aws5'],
],
},
{
name: '类型二',
data: [
['aws1', 'aws2', 0],
['aws1', 'aws3', 234],
['aws1', 'aws4', 234],
['aws2', 'aws1', 234],
['aws2', 'aws3', 234],
['aws2', 'aws4', 234],
['aws2', 'aws5', 234],
['aws3', 'aws1', 234],
['aws3', 'aws4', 234],
['aws3', 'aws5', 234],
['aws4', 'aws1', 234],
['aws4', 'aws2', 234],
['aws4', 'aws5', 234],
['aws5', 'aws1', 234],
['aws5', 'aws2', 234],
['aws5', 'aws3', 234],
['aws5', 'aws4', 234],
],
},
{
name: '类型三',
data: [
['aws1', 'aws5', 234],
['aws3', 'aws2', 234],
['aws4', 'aws3', 234],
],
},
];
stories.add('基础色块图', () => (
<Wcontainer className="demos">
<Wheatmap height="600" data={data} config={{ label: true }} />
</Wcontainer>
));
// 最终数据格式如下:
// 列表需要按照时间顺序排序,否则展示会错乱
// [
// // 正常状态,x 对应X轴数据,y 对应Y轴数据,type 用于区分颜色,extra 用于渲染 tooltip
// {
// "x": "0",
// "y": "6",
// "extra": {
// "time": "2020-04-22 06:00:00",
// "value": "正常"
// },
// "type": "正常"
// },
// // 异常,extra 中的数据格式可以自定义,在 config 中对应即可
// {
// "x": "4",
// "y": "6",
// "extra": {
// "time": "2020-04-22 06:04:00",
// "value": {
// "list": [
// {
// "time": "10:00:00",
// "status": "正常"
// },
// {
// "time": "10:00:20",
// "status": "异常"
// },
// {
// "time": "10:00:40",
// "status": "正常"
// }
// ]
// }
// },
// "type": "异常"
// },
// // 无数据状态
// {
// "x": "6",
// "y": "6",
// "extra": {
// "time": "2020-04-22 06:06:00",
// "value": "无数据"
// },
// "type": "无数据"
// },
// ];
// === mock 数据开始 ===
const timeStatusData = [
{
name: '正常',
data: [],
},
{
name: '异常',
data: [],
},
{
name: '无数据',
data: [],
},
];
const timeStatusArrData = [];
// 当前分钟开始时间戳
const now = new Date().setSeconds(0, 0);
// 对齐本小时最后一分钟
const endTime = new Date().setMinutes(59, 0, 0);
function ten(v) {
if (v < 10) {
return `0${v}`;
}
return v;
}
for (let i = 0; i < 6 * 60; i++) {
const t = new Date(endTime - i * 60000);
const timeStr = `${t.getFullYear()}-${ten(t.getMonth() + 1)}-${ten(t.getDate())} ${ten(
t.getHours(),
)}:${ten(t.getMinutes())}:${ten(t.getSeconds())}`;
const d = {
x: String(t.getMinutes()),
y: String(t.getHours()),
extra: {
time: timeStr,
},
};
if (t.getTime() === now) {
d.extra.highlight = true;
}
if (t.getTime() > now) {
// timeStatusData[2].data.unshift([`${t.getMinutes()}m`, `${t.getHours()}h`, '无数据']);
// timeStatusData[2].data.unshift([String(t.getMinutes()), String(t.getHours()), '无数据', timeStr]);
d.type = '无数据';
d.extra.value = '无数据';
} else if (Math.random() < 0.05) {
// timeStatusData.unshift([String(t.getMinutes()), String(t.getHours()), {
// list: [],
// }, timeStr]);
d.type = '异常';
d.extra.value = {
list: [
{
time: '10:00:00',
status: '正常',
},
{
time: '10:00:20',
status: '异常',
},
{
time: '10:00:40',
status: '正常',
},
],
};
} else {
// timeStatusArrData.unshift([String(t.getMinutes()), String(t.getHours()), '正常', timeStr]);
d.type = '正常';
d.extra.value = '正常';
}
timeStatusArrData.unshift(d);
}
// === mock 数据结束 ===
const normalColor = '#c9e6fd';
const errorColor = Util.getStatusColor('error');
const noneColor = Util.getStatusColor('none');
const timeStatusConfig = {
colors(type) {
if (type === '正常') {
return normalColor;
}
if (type === '异常') {
return errorColor;
}
if (type === '无数据') {
return noneColor;
}
},
xAxis: {
tickCount: 16,
labelFormatter(v) {
return `${v}m`;
},
},
yAxis: {
labelFormatter(v) {
return `${v}h`;
},
},
tooltip: {
// tooltip 开头内容,这里展示完整的时间戳
nameFormatter(name, raw, i, arr) {
const data = arr[i].data;
return data.extra.time;
},
valueFormatter(v) {
// tooltip 内容需自行定义,返回 html 字符串,不支持 React 组件
if (typeof v === 'object') {
const list = v.list
.map((item) => {
return `<span style="color: ${item.status === '异常' ? errorColor : ''}">${
item.time
}: ${item.status}</span>`;
})
.join('<br />');
return `详情:<br />${list}`;
}
return v;
},
},
geomStyle: {
stroke(x, y, type, extra) {
// 高亮点
if (extra.highlight) {
return Util.getStatusColor('normal');
}
return themes['widgets-map-area-border'];
},
},
dataType: 'g2',
};
stories.add('时序状态图', () => (
<Wcontainer className="demos">
<Wheatmap config={timeStatusConfig} data={timeStatusArrData} />
</Wcontainer>
));