四好公路
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

260 lines
7.2 KiB

import complateF2 from './complateF2';
const F2 = complateF2();
export function barChart({ data, config = {} }) {
return (canvas, width, height) => {
const type = config.type ? config.type : null;
const typeColor = config.typeColor ? config.typeColor : 'type';
const xAxis = config.xAxis ? config.xAxis : 'kind';
const yAxis = config.yAxis ? config.yAxis : 'value';
const flag = config.flag ? config.flag : null;
const padding = config.padding ? config.padding : [25, 0, 20, 0];
const timeValue = config.timeValue || null //甘特图时间格式数据处理标识 { x: 'stageName', y: ['startTime', 'overTime'] }
const chart = new F2.Chart({
el: canvas,
width,
height,
// padding,
});
const dataCfg = {};
if (config.tickCountX) {
dataCfg[xAxis] = {
tickCount: config.tickCountX
}
}
if (config.tickCountY) {
dataCfg[yAxis] = {
tickCount: config.tickCountY
}
}
//柱状图90颠倒-> 甘特图
if (config.transposed) {
chart.coord({
transposed: true
});
}
if (!data.length) {
chart.guide().text({
position: ['50%', '50%'],
content: '暂无数据',
offsetY: -10,
style: {
fontSize: 12,
textAlign: 'center',
textBaseLine: 'middle',
},
});
}
//甘特图
if (type === 'gantt') {
if (timeValue) {
/**
* 处理时间格式
* 1.时间格式转时间戳
* 2.y轴lable展示处理
* 3.tooltip时间格式
*/
if (data.length) {
const minData = data.filter(item => item[timeValue.y[0]]).map(item => item[timeValue.y[0]]).sort() || []
const fistData = minData.length && new Date(minData[0]).getTime()
data.forEach((obj) => {
obj.x = obj[timeValue.x];
obj.y = [obj[timeValue.y[0]] ? new Date(obj[timeValue.y[0]]).getTime() - fistData : null, obj[timeValue.y[1]] ? new Date(obj[timeValue.y[1]]).getTime() - fistData : null];
});
chart.axis('y', {
label: (e, index, total) => {
const cfg = {
textAlign: 'center'
};
let time = e;
if (index === 0) {
time = new Date(Number(e) + Number(fistData));
cfg.textAlign = 'start';
} else if (index > 0 && index === total - 1) {
time = new Date(Number(e) + Number(fistData));
cfg.textAlign = 'end';
} else {
time = new Date(Number(e) + Number(fistData))
}
cfg.text = `${time.getFullYear()}-${time.getMonth() + 1}-${time.getDate()}`
return cfg
}
})
}
}
chart.tooltip({
showItemMarker: false,
onShow: function onShow(ev) {
const items = ev.items;
items[0].name = '时间';
const value = timeValue ? [items[0].origin[timeValue.y[0]], items[0].origin[timeValue.y[1]]] : items[0].origin[yAxis];
items[0].value = value[0] + ' 至 ' + value[1];
}
});
} else if (type === 'tipShowX') {
chart.tooltip({
onShow: function onShow(ev) {
const items = ev.items;
items[0].name = items[0].origin[xAxis];
}
});
}
chart.legend(false)
chart.source(data, dataCfg);
if (config.colors) {
chart.interval().position(`${xAxis}*${yAxis}`).color(xAxis, config.colors)
} else {
chart.interval().position(`${xAxis}*${yAxis}`);
}
chart.render();
return chart;
};
}
//时间甘特图
export function ganttBarChart({ data, config = {} }) {
return (canvas, width, height) => {
const type = config.type ? config.type : null;
const xAxis = config.xAxis ? config.xAxis : 'kind';
const yAxis = config.yAxis ? config.yAxis : 'value';
const chart = new F2.Chart({
el: canvas,
width,
height,
// padding,
});
const dataCfg = {};
if (config.tickCountX) {
dataCfg[xAxis] = {
tickCount: config.tickCountX
}
}
if (config.tickCountY) {
dataCfg[yAxis] = {
tickCount: config.tickCountY
}
}
const min = Math.min([].concat.apply([], data.map(val => val[yAxis].map(t => new Date(t).getTime()))));
console.log(min);
data.forEach(val => {
val[yAxis] = val[yAxis].map(t => {
})
})
chart.source(data, dataCfg);
chart.coord({
transposed: true
});
chart.tooltip({
showItemMarker: false,
onShow: function onShow(ev) {
const items = ev.items;
items[0].name = '时间';
const value = items[0].origin[yAxis];
items[0].value = value[0] + ' 至 ' + value[1];
}
});
if (config.colors) {
chart.interval().position(`${xAxis}*${yAxis}`).color(xAxis, config.colors)
} else {
chart.interval().position(`${xAxis}*${yAxis}`);
}
chart.render();
return chart;
};
}
export function groupBarChart({ data, config = {} }) {
// data = [{
// kind: '第一部',
// value: 38,
// typeColor: '2018年10月'
// }, {
// kind: '第二部',
// value: 92,
// typeColor: '2018年10月'
// }, {
// kind: '第一部',
// value: 18,
// typeColor: '2018年11月'
// }, {
// kind: '第二部',
// value: 22,
// typeColor: '2018年11月'
// }];
return (canvas, width, height) => {
const type = config.type ? config.type : null;
const typeColor = config.typeColor ? config.typeColor : 'type';
const xAxis = config.xAxis ? config.xAxis : 'kind';
const yAxis = config.yAxis ? config.yAxis : 'value';
const flag = config.flag ? config.flag : null;
const padding = config.padding ? config.padding : [25, 0, 20, 0];
const chart = new F2.Chart({
el: canvas,
width,
height,
padding: padding,
});
chart.source(data);
let label = {};
if (flag && flag == 'caseArea') {
label = {
rotate: Math.PI / 2,
textAlign: 'start',
textBaseline: 'middle',
};
}
chart.axis(xAxis, {
label,
});
chart.legend({
offsetY: -15,
});
chart.tooltip({
custom: true, // 自定义 tooltip 内容框
onChange: function onChange(obj) {
const legend = chart.get('legendController').legends.top[0];
const tooltipItems = obj.items;
const legendItems = legend.items;
const map = [];
for (const legendItem of legendItems) {
legendItem.value = '0';
}
for (const legendItem of legendItems) {
for (const tooltipItem of tooltipItems) {
if (legendItem.name == tooltipItem.name) {
legendItem.value = tooltipItem.value;
}
}
}
legend.setItems(legendItems);
},
onHide: function onHide() {
const legend = chart.get('legendController').legends.top[0];
legend.setItems(chart.getLegendItems().country);
},
});
chart.interval().position(`${xAxis}*${yAxis}`).color(typeColor).adjust({
type: 'dodge',
marginRatio: 0.05, // 设置分组间柱子的间距
});
chart.render();
return chart;
};
}