stories/chart.bar.stories.js (1,011 lines of code) (raw):
import React, { useEffect, useState } from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { Wbar, Wcontainer } from '@alicloud/cloud-charts';
import { cloneDeep } from 'lodash';
const data = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
],
},
{
name: '柱2',
data: [
['一', 92],
['二', 15],
['三', 4],
['四', 49],
['五', 64],
['六', 76],
['七', 21],
['八', 100],
['九', 71],
],
},
];
const stories = storiesOf('Wbar', module);
stories.add('柱状图', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
// legend: {
// position: 'top',
// },
// yAxis: {
// type: 'quantize',
// },
// scrollbar: true,
size: 18,
xAxis: {
// labelFormatter: (v) => {
// console.log(1111, v)
// return v
// }
}
}}
data={[
{
"name": "数量",
"data": [
[
"中心云-test",
"26725"
],
[
"17E-1",
"546"
],
[
"59E-arm",
"325"
],
[
"公共云测试",
"94"
],
[
"50E-test",
"0"
]
]
}
]}
force
/>
</Wcontainer>
));
const testData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
],
},
];
stories.add('数据与尺寸同时变', () => {
const [chartData, setChartData] = useState(testData);
useEffect(() => {
const timer = setTimeout(() => {
const changedData = testData.map((group) => ({
name: group.name,
data: group.data.slice(0, 3),
}));
setChartData(changedData);
}, 5000);
return () => {
clearTimeout(timer);
};
}, []);
return (
<Wcontainer className="demos">
<Wbar height="300" width={chartData[0].data.length * 50} config={{}} data={chartData} />
</Wcontainer>
);
});
stories.add('堆叠柱状图', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
stack: true,
// label: true,
showStackSum: true,
yAxis: {
max: 500,
},
}}
data={data}
/>
</Wcontainer>
));
stories.add('极坐标堆叠柱状图', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
stack: true,
// size: 2 * 360 / 9,
polar: true,
innerRadius: 0.2,
showStackSum: true,
}}
data={data}
/>
</Wcontainer>
));
const yuData = cloneDeep(data).slice(0, 1);
yuData[0].data = yuData[0].data.slice(0, 5).sort((a, b) => {
return a[1] - b[1];
});
// console.log(yuData)
stories.add('玉玦图', () => (
<Wcontainer className="demos">
<Wbar
height="360"
config={{
polar: true,
column: false,
innerRadius: 0.2,
}}
data={yuData}
/>
</Wcontainer>
));
stories.add('横向柱状图', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
column: false,
}}
data={data}
/>
</Wcontainer>
));
stories.add('带网格线', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
grid: true,
}}
data={data}
/>
</Wcontainer>
));
stories.add('拖拽缩放', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
zoom: true,
}}
data={data}
event={{
'zoom:start': (s) => {
action('zoom:start')(s);
},
'zoom:end': (s) => {
action('zoom:end')(s);
},
'zoom:reset': (s) => {
action('zoom:reset')(s);
},
}}
/>
</Wcontainer>
));
stories.add('点击下钻', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
zoom: true,
geomStyle: {
cursor: 'pointer',
},
}}
data={data}
event={{
'interval:click': (s) => {
action('interval:click')(s);
},
}}
/>
</Wcontainer>
));
let data2 = [
{
name: '柱1',
facet: '分面1',
data: [],
},
{
name: '柱2',
facet: '分面2',
data: [],
},
// {
// "name":"柱3",
// "facet": '分面1',
// "data":[]
// },
// {
// "name":"柱4",
// "facet": '分面2',
// "data":[]
// }
];
for (let i = 0; i < 6; i++) {
const name = i + '------' + i;
data2[0].data.push([name, Math.round(Math.random() * 1000000) / 10000]);
data2[1].data.push([name, Math.round(Math.random() * 1000000) / 10000]);
// data2[2].data.push([name, Math.random() * 100 + 100]);
// data2[3].data.push([name, Math.random() * 100 + 100]);
}
let options1 = {
padding: [40, 32, 12, 32],
colors: ['#43BF7E', '#297ACC'],
column: false,
xAxis: {
visible: false,
},
facet: {
padding: [0, 0, 12, 0],
spacing: [0, 0],
},
label: {
position: 'right',
callback(_v, facet) {
return {
style: {
textAlign: facet.columnIndex === 1 ? 'start' : 'end',
fill: facet.columnIndex === 1 ? '#297ACC' : '#43BF7E',
},
};
},
},
columnWidthRatio: 0.4,
geomStyle(x, y, type) {
if (type === '柱1') {
return {
// 设置柱形状的圆角
radius: [0, 0, 2, 2],
};
}
if (type === '柱2') {
return {
// 设置柱形状的圆角
radius: [2, 2, 0, 0],
};
}
},
// colors: [COLORS.widgetsColorCategory1, COLORS.widgetsColorCategory1, COLORS.widgetsColorCategory3, COLORS.widgetsColorCategory3],
};
const tempData = [
{
name: '碳排量',
data: [
['联通', 0.0061],
['自建', 10.9167],
],
facet: '分面1',
},
{
name: '度电排量',
data: [
['联通', 0.0006],
['自建', 0.0009],
],
facet: '分面2',
},
];
const tempData_2 = [
{
name: '碳排量',
data: [
['联通', 0.0061],
['自建', 10.9167],
],
facet: '分面1',
},
{
name: '度电排量',
data: [
['联通', 5.0061],
['自建', 10.9167],
],
facet: '分面2',
},
];
stories.add('镜面柱图', () => {
return (
<Wcontainer className="demos">
<Wbar height="300" config={options1} data={data2} />
</Wcontainer>
);
});
const config_2 = {
padding: [40, 24, 20, 44],
marginRatio: 0.05,
facet: true,
};
stories.add('多视图情况下(数据更新)', () => {
const [d, setD] = useState(tempData);
useEffect(() => {
const timer = setTimeout(() => {
setD(tempData_2);
}, 2000);
return () => clearTimeout(timer);
}, []);
return (
<Wcontainer className="demos">
<Wbar height="300" config={options1} data={d} />
</Wcontainer>
);
});
let data3 = [
{
name: '柱1',
dodge: '分组1',
data: [],
},
{
name: '柱5',
dodge: '分组1',
data: [],
},
{
name: '柱2',
dodge: '分组2',
data: [],
},
{
name: '柱3',
dodge: '分组2',
data: [],
},
{
name: '柱4',
dodge: '分组2',
data: [],
},
];
for (let i = 0; i < 10; i++) {
const name = i + '-' + i;
data3[0].data.push([name, Math.random() * 100 + 100]);
data3[1].data.push([name, Math.random() * 100 + 100]);
data3[2].data.push([name, Math.random() * 100 + 100]);
data3[3].data.push([name, Math.random() * 100 + 100]);
data3[4].data.push([name, Math.random() * 100 + 100]);
}
let options2 = {
dodgeStack: true,
label: true,
};
let data4 = [
{
name: '柱1',
data: [['一', 56]],
},
];
stories.add('分组堆叠图(图例显示数字)', () => (
<Wcontainer className="demos">
<Wbar height="300" config={options2} data={data3} />
</Wcontainer>
));
stories.add('从有数据到无数据', () => {
const [d, setD] = useState(data);
useEffect(() => {
const timer = setTimeout(() => {
setD([]);
// setD([{ name: '浏览器占比', data: [] }]);
}, 2000);
return () => clearTimeout(timer);
}, []);
return (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
zoom: true,
geomStyle: {
cursor: 'pointer',
},
legend: {
showData: true,
valueFormatter: function (v, data) {
return v + '%';
},
},
}}
data={d}
/>
</Wcontainer>
);
});
stories.add('百分比堆叠柱状图', () => {
const [d, setD] = useState(data);
useEffect(() => {
setTimeout(() => {
setD(data4);
}, 2000);
}, []);
return (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
percentage: true,
stack: true,
yAxis: {
max: 1,
min: 0,
labelFormatter(value) {
return (value * 100).toFixed(2) + '%';
},
},
}}
data={d}
/>
</Wcontainer>
);
});
stories.add('分组百分比堆叠柱状图', () => {
return (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
percentage: true,
dodgeStack: true,
yAxis: {
max: 1,
min: 0,
labelFormatter: function (value) {
return (value * 100).toFixed(2) + '%';
},
},
tooltip: {
nameFormatter: function (v, data) {
return data.dodge + '-' + v;
},
valueFormatter: function (v) {
return (v * 100).toFixed(2) + '%';
},
},
}}
data={data3}
/>
</Wcontainer>
);
});
stories.add('横向柱图(从右往左)', () => {
return (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
// maxSize: 24
// column: {
// reflect: true,
// },
guide: {
line: {
// 显示标题相关
text: {
title: '警戒线',
autoRotate: false,
},
status: 'error', // normal | success | warning | error
// 线位置
axis: 'y',
value: 50,
},
filter: {
status: 'error', // normal | success | warning | error
// 区域位置
axis: 'y',
value: [20, 'max'],
},
},
}}
data={data4}
/>
</Wcontainer>
);
});
const facetData = [
{
name: '柱1',
facet: '分面1',
data: [],
},
{
name: '柱2',
facet: '分面2',
data: [],
},
];
for (let i = 0; i < 8; i++) {
const name = i + '-' + i;
facetData[0].data.push([name, Math.round(Math.random() * 50 + 50 + i * 20)]);
facetData[1].data.push([name, Math.round(Math.random() * 50 + 50 + i * 10)]);
}
stories.add('分面柱状图', () => (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
column: false,
xAxis: {
visible: false,
},
facet: {
padding: [0, 0, 12, 0],
spacing: [0, 0],
},
}}
data={facetData}
/>
</Wcontainer>
));
const zeroData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
],
},
{
name: '柱2',
data: [
['一', 0],
['二', 0],
['三', 0],
['四', 0],
['五', 0],
['六', 0],
['七', 0],
['八', 0],
['九', 0],
],
},
];
stories.add('可筛选出全为0的柱状图', () => (
<Wcontainer className="demos">
<Wbar height="300" config={{}} data={zeroData} />
</Wcontainer>
));
const extremeData1 = [
{
name: 'test',
data: [
['slb1231212423523254123123123125212441', 400],
['vpc234232324', 200],
],
},
];
const extremeData2 = [
{
name: 'test',
data: [['slb', 400]],
},
];
stories.add('极端数据1(分类型)', () => (
<Wcontainer className="demos">
<Wbar height="300" data={extremeData1} force={{ extreme: false }} />
</Wcontainer>
));
stories.add('极端数据2(分类型)', () => (
<Wcontainer className="demos">
<Wbar height="300" data={extremeData2} />
</Wcontainer>
));
const extremeData3 = [
{
name: '机房A',
data: [
[1483372800000, 1592],
[1483459200000, 4092],
],
},
{
name: '机房B',
data: [[1483372800000, 3592]],
},
];
stories.add('极端数据(时间分类型)', () => (
<Wcontainer className="demos">
<Wbar height="300" config={{ xAxis: { type: 'timeCat' } }} data={extremeData3} />
</Wcontainer>
));
const manyData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
['十', 45],
['十一', 6],
['十二', 89],
['十三', 32],
],
},
];
const littleData = [
{
name: '柱1',
data: [['一', 59]],
},
];
stories.add('从多数据到少数据', () => {
const [d, setD] = useState(manyData);
useEffect(() => {
const timer = setTimeout(() => {
setD(littleData);
}, 2000);
return () => clearTimeout(timer);
}, []);
return (
<Wcontainer className="demos">
<Wbar height="300" data={d} />
</Wcontainer>
);
});
stories.add('从少数据到多数据', () => {
const [d, setD] = useState(littleData);
useEffect(() => {
const timer = setTimeout(() => {
setD(manyData);
}, 2000);
return () => clearTimeout(timer);
}, []);
return (
<Wcontainer className="demos">
<Wbar height="300" data={d} />
</Wcontainer>
);
});
const stackData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
],
},
{
name: '柱2',
data: [
['一', 92],
['二', 15],
['三', 4],
['四', 49],
['五', 64],
['六', 76],
['七', 21],
['八', 100],
['九', 71],
],
},
];
stories.add('极端数据+堆叠', () => {
const [d, setD] = useState(stackData);
return (
<Wcontainer className="demos">
<Wbar height="300" data={d} force={false} config={{ stack: true }} />
</Wcontainer>
);
});
const columnData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 100],
['七', 70],
['八', 61],
['九', 15],
],
},
{
name: '柱2',
data: [
['一', 92],
['二', 15],
['三', 4],
['四', 49],
['五', 64],
['六', 100],
['七', 21],
['八', 100],
['九', 71],
],
},
];
const dodgeData = [
{
name: '柱1',
dodge: '分组1',
data: [
['0-0', 400],
['1-1', 368.5774285541682],
['2-2', 319.46590450613223],
['3-3', 329.953581730495],
['4-4', 362.02255356841863],
['5-5', 356.18703843093465],
['6-6', 335.87491680258154],
['7-7', 347.8144190956929],
['8-8', 351.53314471631825],
['9-9', 336.78483141992774],
],
},
{
name: '柱2',
dodge: '分组2',
data: [
['0-0', 250],
['1-1', 102.26794216638983],
['2-2', 129.65457779136605],
['3-3', 101.56208526870452],
['4-4', 184.9464011197059],
['5-5', 124.09187080031035],
['6-6', 118.93167886564532],
['7-7', 137.38820946995082],
['8-8', 168.13065143306804],
['9-9', 124.41292025672496],
],
},
{
name: '柱3',
dodge: '分组2',
data: [
['0-0', 200],
['1-1', 143.42939580910783],
['2-2', 173.41042467473696],
['3-3', 163.71840146885077],
['4-4', 109.18016807137556],
['5-5', 127.9431338398262],
['6-6', 114.21569957269615],
['7-7', 140.8968365465857],
['8-8', 137.23695812901974],
['9-9', 192.66197147713766],
],
},
{
name: '柱4',
dodge: '分组2',
data: [
['0-0', 142.7422522597824],
['1-1', 119.8436301287528],
['2-2', 148.00924709470718],
['3-3', 186.78811186926157],
['4-4', 117.02442492535125],
['5-5', 121.99650120083685],
['6-6', 144.31875224249848],
['7-7', 141.91228581169287],
['8-8', 130.79706132099858],
['9-9', 158.64916171077135],
],
},
];
const periodData = [
{
name: '柱1',
data: [
['一', [12, 76]],
['二', [30, 68]],
['三', [36, 81]],
['四', [37, 77]],
['五', [12, 81]],
['六', [46, 100]],
['七', [30, 90]],
['八', [18, 79]],
['九', [8, 73]],
],
},
{
name: '柱2',
data: [
['一', [30, 92]],
['二', [2, 54]],
['三', [45, 76]],
['四', [20, 69]],
['五', [24, 88]],
['六', [0, 76]],
['七', [18, 41]],
['八', [28, 100]],
['九', [25, 96]],
],
},
];
stories.add('label padding测试', () => (
<>
<Wcontainer className="demos" title="横向柱图">
<Wbar
height="300"
config={{
column: false,
legend: false,
label: true,
}}
data={columnData}
/>
</Wcontainer>
<Wcontainer className="demos" title="堆叠图">
<Wbar
height="300"
config={{
legend: false,
stack: true,
label: true,
}}
data={columnData}
/>
</Wcontainer>
<Wcontainer className="demos" title="分组堆叠">
<Wbar
height="300"
config={{
legend: false,
dodgeStack: true,
label: true,
}}
data={dodgeData}
/>
</Wcontainer>
<Wcontainer className="demos" title="百分比堆叠">
<Wbar
height="300"
config={{
legend: false,
stack: true,
label: true,
percentage: true,
}}
data={columnData}
/>
</Wcontainer>
<Wcontainer className="demos" title="区间柱状图">
<Wbar
height="300"
config={{
legend: false,
label: true,
}}
data={periodData}
/>
</Wcontainer>
<Wcontainer className="demos" title="普通柱图">
<Wbar
height="300"
config={{
legend: {
position: 'bottom',
visible: true,
},
label: true,
}}
data={data}
/>
</Wcontainer>
</>
));
const changedData = [
{
name: '柱1',
data: [
['一', 59],
['二', 23],
['三', 19],
['四', 27],
['五', 77],
['六', 80],
['七', 70],
['八', 61],
['九', 15],
],
},
{
name: '柱2',
data: [
['一', 87],
['二', 15],
['三', 4],
['四', 49],
['五', 64],
['六', 76],
['七', 21],
['八', 79],
['九', 71],
],
},
];
stories.add('数据更新label测试', () => {
const [d, setD] = useState(data);
useEffect(() => {
setTimeout(() => {
setD(changedData);
}, 3000);
}, []);
return (
<Wcontainer className="demos">
<Wbar
height="300"
config={{
legend: {
position: 'bottom',
visible: true,
},
label: true,
}}
data={d}
/>
</Wcontainer>
);
});
const test111 = [
{
name: '机房A',
data: [
[1483372800000, 1592],
[1483459200000, 4092],
[1483545600000, 3714],
[1483632000000, 3984],
[1483718400000, 6514],
[1483804800000, 6666],
[1483891200000, 6023],
[1483977600000, 4018],
],
},
{
name: '机房B',
data: [
[1483372800000, 3592],
[1483459200000, 6092],
[1483545600000, 5714],
[1483632000000, 5984],
[1483718400000, 8514],
[1483804800000, 8666],
[1483891200000, 8023],
[1483977600000, 6018],
],
},
];
stories.add('event', () => (
<Wcontainer className="demos">
<Wbar
height="300"
data={test111}
config={{
xAxis: {
type: 'timeCat',
},
// label: {
// // 默认为 'top',标签显示在柱子上侧
// position: 'middle',
// // 正值向上偏移,负值向下偏移
// offset: -10,
// },
zoom: true,
stack: true,
}}
event={{
'zoom:end': (event) => {
console.log('zoom:end', event);
},
'interval:click': (event) => {
console.log('click', event);
},
}}
/>
</Wcontainer>
));