server_table/src/Chart.tsx

68 lines
2.0 KiB
TypeScript
Raw Normal View History

import {
2018-07-01 14:12:00 +00:00
PieChart, Pie, ResponsiveContainer, Tooltip, Cell
} from 'recharts';
import * as React from 'react';
2018-07-01 14:12:00 +00:00
import * as _ from 'lodash';
import { Container, Title } from 'bloomer';
const randomColor = require('randomcolor');
import * as Papa from 'papaparse';
export class Chart extends React.Component<any, any> {
constructor(props: any) {
super(props);
2018-07-01 14:12:00 +00:00
this.state = { data: [] };
const loaded = (results: any) => {
const local = this;
local.setState({
headers: results.meta.fields,
data: results.data,
});
}
Papa.parse(this.props.csvFile, {
header: true,
download: true,
skipEmptyLines: true,
dynamicTyping: true,
complete: loaded
});
}
public render() {
2018-07-01 14:12:00 +00:00
const data = this.state.data;
const countMap = _.countBy(data, (o: any) => _.get<any>(o, this.props.chartColumn))
const chartData = _.map(_.keys(countMap), (k: any) => {
return {
2018-07-01 15:31:27 +00:00
name: k,
2018-07-01 14:12:00 +00:00
value: countMap[k],
}
})
2018-07-01 15:31:27 +00:00
const RADIAN = Math.PI / 180;
const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, index }:any) => {
const radius = innerRadius + (outerRadius - innerRadius) * 0.5;
const x = cx + radius * Math.cos(-midAngle * RADIAN);
const y = cy + radius * Math.sin(-midAngle * RADIAN);
return (
<text x={x} y={y} fill="white" textAnchor='middle' dominantBaseline="central">
{chartData[index].name}
</text>
);
};
return (
2018-07-01 14:12:00 +00:00
<Container>
<Title isSize={4}>Plotting {_.capitalize(this.props.chartColumn)}</Title>
<ResponsiveContainer width="100%" height={200}>
<PieChart>
2018-07-01 15:31:27 +00:00
<Pie data={chartData} dataKey='value' outerRadius={100} label={renderCustomizedLabel}>
2018-07-01 14:12:00 +00:00
{
chartData.map((_0, _1) => <Cell key={_1} fill={randomColor()} />)
}
</Pie>
<Tooltip />
</PieChart>
</ResponsiveContainer>
</Container>
)
}
}