@bizcharts/scaffold-cira-crowd
Version:
人群画像分析
100 lines (92 loc) • 2.31 kB
JSX
import React, { Component } from 'react';
import { Chart, Geom, Tooltip, Coord, Shape } from 'bizcharts';
const { DataSet } = window;
function getTextAttrs(cfg) {
return Object.assign({}, {
fillOpacity: cfg.opacity,
fontSize: cfg.origin._origin.size,
rotate: cfg.origin._origin.rotate,
text: cfg.origin._origin.text,
textAlign: 'center',
fontFamily: cfg.origin._origin.font,
fill: cfg.color,
textBaseline: 'Alphabetic',
}, cfg.style);
}
Shape.registerShape('point', 'cloud', {
drawShape(cfg, container) {
const attrs = getTextAttrs(cfg);
const { x, y } = cfg;
// 背景圆
container.addShape('circle', {
attrs: {
x,
y,
fill: cfg.origin._origin.bg,
r: cfg.origin._origin.size / 2 + attrs.fontSize + 10,
},
});
// 图片
const imgWidth = 26;
container.addShape('image', {
attrs: {
x: x - (imgWidth / 2),
y: y + (imgWidth / 2) - 10,
width: imgWidth,
height: imgWidth,
img: cfg.origin._origin.img,
},
});
return container.addShape('text', {
attrs: Object.assign(attrs, {
x,
y,
fill: '#ffffff',
}),
});
},
});
export default class circlecloud extends Component {
render() {
const { data } = this.props;
const scale = {
x: { nice: false },
y: { nice: false },
};
const dv = new DataSet.View().source(data);
const range = dv.range('size');
const min = range[0];
const max = range[1];
dv.transform({
type: 'tag-cloud',
fields: ['cate', 'size'],
size: [window.innerWidth, 400],
font: 'Verdana',
padding: 20,
timeInterval: 5000,
fontSize(d) {
if (d.size) {
return ((d.size - min) / (max - min)) * 14 + 12;
}
return 0;
},
rotate() {
return 0;
},
});
return (
<Chart
data={dv}
height={400}
padding={50}
scale={scale}
forceFit
onGetG2Instance={g2Chart => this.props.updateInstance && this.props.updateInstance(g2Chart)}
>
<Tooltip showTitle={false} />
<Coord reflect="y" />
<Geom type="point" position="x*y" color="key" shape="cloud" />
</Chart>
);
}
}