src/Whexagonal/index.tsx (96 lines of code) (raw):

'use strict'; import { Chart, Types, BaseChartConfig, Colors } from '../common/types'; import Base from '../common/Base'; import { DataSet } from '@antv/data-set/lib/data-set'; import errorWrap from '../common/errorWrap'; import themes from '../themes/index'; import { propertyAssign, propertyMap } from '../common/common'; import rectXAxis, { XAxisConfig } from '../common/rectXAxis'; import rectYAxis, { YAxisConfig } from '../common/rectYAxis'; import rectTooltip, { TooltipConfig } from '../common/rectTooltip'; import rectLegend, { LegendConfig } from '../common/rectLegend'; import { LabelConfig } from '../common/label'; import geomSize, { GeomSizeConfig } from '../common/geomSize'; import geomStyle, { GeomStyleConfig } from '../common/geomStyle'; import '@antv/data-set/lib/api/statistics'; import '@antv/data-set/lib/transform/bin/hexagon'; export interface WhexagonalConfig extends BaseChartConfig { colors?: Colors; xAxis?: (Types.ScaleOption & XAxisConfig) | false; yAxis?: (Types.ScaleOption & YAxisConfig) | false; legend?: LegendConfig | boolean; tooltip?: TooltipConfig | boolean; label?: LabelConfig | boolean; size?: GeomSizeConfig; geomStyle?: GeomStyleConfig; } export class Hexagonal extends Base<WhexagonalConfig> { chartName = 'G2Hexagonal'; getDefaultConfig(): WhexagonalConfig { return { colors: themes.order_10, tooltip: { titleFormatter: null, nameFormatter: null, valueFormatter: null, }, legend: { align: 'left', nameFormatter: null, // 可以强制覆盖,手动设置label }, }; } init(chart: Chart, config: WhexagonalConfig, data: any) { // 设置数据度量 const defs: Record<string, Types.ScaleOption> = { // x: propertyAssign( // propertyMap.axis, // { // type: 'cat', // }, // { // visible: false, // }, // ), y: propertyAssign( propertyMap.axis, {}, { visible: false, nice: true }, ), count: { nice: true } }; chart.scale(defs); const ds = new DataSet({ state: { sizeEncoding: false, }, }); const hexagonalDataView = ds .createView() .source(this.rawData) .transform({ // sizeByCount: '$state.sizeEncoding', // calculate bin size by binning count type: 'bin.hexagon', fields: ['x', 'y'], // 对应坐标轴上的一个点 bins: [10, 5], }); chart.data(hexagonalDataView.rows); // 设置X轴 rectXAxis(this, chart, config); rectYAxis(this, chart, config); // 设置图例 rectLegend(this, chart, config, {}, 'multiple', 'count'); // tooltip rectTooltip(this, chart, config, {}, null, { showCrosshairs: false, showMarkers: false, }); drawHexagonal(chart, config, config.colors); } } const Whexagonal: typeof Hexagonal = errorWrap(Hexagonal); export default Whexagonal; function drawHexagonal(chart: Chart, config: WhexagonalConfig, colors: Colors, field = 'count') { const { size } = config; const geom = chart.polygon().position(['x', 'y']).color(field, colors); geomSize(geom, size, null, 'y', 'y*count*extra'); geomStyle( geom, config.geomStyle, { lineWidth: 2, }, 'y*count*extra', ); }