Charts图表

Ant Design Pro 提供的业务中常用的图表类型,都是基于 G2 按照 Ant Design 图表规范封装,需要注意的是 Ant Design Pro 的图表组件以套件形式提供,可以任意组合实现复杂的业务需求。

因为结合了 Ant Design 的标准设计,本着极简的设计思想以及开箱即用的理念,简化了大量 API 配置,所以如果需要灵活定制图表,可以参考 Ant Design Pro 图表实现,自行基于 G2 封装图表组件使用。

引用方式:

  1. import Charts from 'ant-design-pro/lib/Charts';

详细使用方式请参照:独立使用 pro 组件

代码演示

Charts 图表 - 图1

图表套件组合展示

利用 Ant Design Pro 提供的图表套件,可以灵活组合符合设计规范的图表来满足复杂的业务需求。

  1. import { ChartCard, Field, MiniArea, MiniBar, MiniProgress } from 'ant-design-pro/lib/Charts';
  2. import Trend from 'ant-design-pro/lib/Trend';
  3. import NumberInfo from 'ant-design-pro/lib/NumberInfo';
  4. import { Row, Col, Icon, Tooltip } from 'antd';
  5. import numeral from 'numeral';
  6. import moment from 'moment';
  7. const visitData = [];
  8. const beginDay = new Date().getTime();
  9. for (let i = 0; i < 20; i += 1) {
  10. visitData.push({
  11. x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
  12. y: Math.floor(Math.random() * 100) + 10,
  13. });
  14. }
  15. ReactDOM.render(
  16. <Row>
  17. <Col span={24}>
  18. <ChartCard title="搜索用户数量" total={numeral(8846).format('0,0')} contentHeight={134}>
  19. <NumberInfo
  20. subTitle={<span>本周访问</span>}
  21. total={numeral(12321).format('0,0')}
  22. status="up"
  23. subTotal={17.1}
  24. />
  25. <MiniArea line height={45} data={visitData} />
  26. </ChartCard>
  27. </Col>
  28. <Col span={24} style={{ marginTop: 24 }}>
  29. <ChartCard
  30. title="访问量"
  31. action={
  32. <Tooltip title="指标说明">
  33. <Icon type="info-circle-o" />
  34. </Tooltip>
  35. }
  36. total={numeral(8846).format('0,0')}
  37. footer={<Field label="日访问量" value={numeral(1234).format('0,0')} />}
  38. contentHeight={46}
  39. >
  40. <MiniBar height={46} data={visitData} />
  41. </ChartCard>
  42. </Col>
  43. <Col span={24} style={{ marginTop: 24 }}>
  44. <ChartCard
  45. title="线上购物转化率"
  46. action={
  47. <Tooltip title="指标说明">
  48. <Icon type="info-circle-o" />
  49. </Tooltip>
  50. }
  51. total="78%"
  52. footer={
  53. <div>
  54. <span>
  55. 周同比
  56. <Trend flag="up" style={{ marginLeft: 8, color: 'rgba(0,0,0,.85)' }}>
  57. 12%
  58. </Trend>
  59. </span>
  60. <span style={{ marginLeft: 16 }}>
  61. 日环比
  62. <Trend flag="down" style={{ marginLeft: 8, color: 'rgba(0,0,0,.85)' }}>
  63. 11%
  64. </Trend>
  65. </span>
  66. </div>
  67. }
  68. contentHeight={46}
  69. >
  70. <MiniProgress percent={78} strokeWidth={8} target={80} />
  71. </ChartCard>
  72. </Col>
  73. </Row>,
  74. mountNode
  75. );

Charts 图表 - 图2

迷你柱状图

迷你区域图

  1. import { MiniArea } from 'ant-design-pro/lib/Charts';
  2. import moment from 'moment';
  3. const visitData = [];
  4. const beginDay = new Date().getTime();
  5. for (let i = 0; i < 20; i += 1) {
  6. visitData.push({
  7. x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
  8. y: Math.floor(Math.random() * 100) + 10,
  9. });
  10. }
  11. ReactDOM.render(<MiniArea line color="#cceafe" height={45} data={visitData} />, mountNode);

Charts 图表 - 图3

迷你进度条

迷你进度条

  1. import { MiniProgress } from 'ant-design-pro/lib/Charts';
  2. ReactDOM.render(<MiniProgress percent={78} strokeWidth={8} target={80} />, mountNode);

Charts 图表 - 图4

饼状图

饼状图

  1. import { Pie, yuan } from 'ant-design-pro/lib/Charts';
  2. const salesPieData = [
  3. {
  4. x: '家用电器',
  5. y: 4544,
  6. },
  7. {
  8. x: '食用酒水',
  9. y: 3321,
  10. },
  11. {
  12. x: '个护健康',
  13. y: 3113,
  14. },
  15. {
  16. x: '服饰箱包',
  17. y: 2341,
  18. },
  19. {
  20. x: '母婴产品',
  21. y: 1231,
  22. },
  23. {
  24. x: '其他',
  25. y: 1231,
  26. },
  27. ];
  28. ReactDOM.render(
  29. <Pie
  30. hasLegend
  31. title="销售额"
  32. subTitle="销售额"
  33. total={() => (
  34. <span
  35. dangerouslySetInnerHTML={{
  36. __html: yuan(salesPieData.reduce((pre, now) => now.y + pre, 0)),
  37. }}
  38. />
  39. )}
  40. data={salesPieData}
  41. valueFormat={val => <span dangerouslySetInnerHTML={{ __html: yuan(val) }} />}
  42. height={294}
  43. />,
  44. mountNode
  45. );

Charts 图表 - 图5

雷达图

雷达图

  1. import { Radar, ChartCard } from 'ant-design-pro/lib/Charts';
  2. const radarOriginData = [
  3. {
  4. name: '个人',
  5. ref: 10,
  6. koubei: 8,
  7. output: 4,
  8. contribute: 5,
  9. hot: 7,
  10. },
  11. {
  12. name: '团队',
  13. ref: 3,
  14. koubei: 9,
  15. output: 6,
  16. contribute: 3,
  17. hot: 1,
  18. },
  19. {
  20. name: '部门',
  21. ref: 4,
  22. koubei: 1,
  23. output: 6,
  24. contribute: 5,
  25. hot: 7,
  26. },
  27. ];
  28. const radarData = [];
  29. const radarTitleMap = {
  30. ref: '引用',
  31. koubei: '口碑',
  32. output: '产量',
  33. contribute: '贡献',
  34. hot: '热度',
  35. };
  36. radarOriginData.forEach(item => {
  37. Object.keys(item).forEach(key => {
  38. if (key !== 'name') {
  39. radarData.push({
  40. name: item.name,
  41. label: radarTitleMap[key],
  42. value: item[key],
  43. });
  44. }
  45. });
  46. });
  47. ReactDOM.render(
  48. <ChartCard title="数据比例">
  49. <Radar hasLegend height={286} data={radarData} />
  50. </ChartCard>,
  51. mountNode
  52. );

Charts 图表 - 图6

水波图

水波图是一种比例的展示方式,可以更直观的展示关键值的占比。

  1. import { WaterWave } from 'ant-design-pro/lib/Charts';
  2. ReactDOM.render(
  3. <div style={{ textAlign: 'center' }}>
  4. <WaterWave height={161} title="补贴资金剩余" percent={34} />
  5. </div>,
  6. mountNode
  7. );

Charts 图表 - 图7

标签云

标签云是一套相关的标签以及与此相应的权重展示方式,一般典型的标签云有 30 至 150 个标签,而权重影响使用的字体大小或其他视觉效果。

  1. import { TagCloud } from 'ant-design-pro/lib/Charts';
  2. const tags = [];
  3. for (let i = 0; i < 50; i += 1) {
  4. tags.push({
  5. name: `TagClout-Title-${i}`,
  6. value: Math.floor(Math.random() * 50) + 20,
  7. });
  8. }
  9. ReactDOM.render(<TagCloud data={tags} height={200} />, mountNode);

Charts 图表 - 图8

图表卡片

用于展示图表的卡片容器,可以方便的配合其它图表套件展示丰富信息。

  1. import { ChartCard, yuan, Field } from 'ant-design-pro/lib/Charts';
  2. import Trend from 'ant-design-pro/lib/Trend';
  3. import { Row, Col, Icon, Tooltip } from 'antd';
  4. import numeral from 'numeral';
  5. ReactDOM.render(
  6. <Row>
  7. <Col span={24}>
  8. <ChartCard
  9. title="销售额"
  10. action={
  11. <Tooltip title="指标说明">
  12. <Icon type="info-circle-o" />
  13. </Tooltip>
  14. }
  15. total={() => <span dangerouslySetInnerHTML={{ __html: yuan(126560) }} />}
  16. footer={<Field label="日均销售额" value={numeral(12423).format('0,0')} />}
  17. contentHeight={46}
  18. >
  19. <span>
  20. 周同比
  21. <Trend flag="up" style={{ marginLeft: 8, color: 'rgba(0,0,0,.85)' }}>
  22. 12%
  23. </Trend>
  24. </span>
  25. <span style={{ marginLeft: 16 }}>
  26. 日环比
  27. <Trend flag="down" style={{ marginLeft: 8, color: 'rgba(0,0,0,.85)' }}>
  28. 11%
  29. </Trend>
  30. </span>
  31. </ChartCard>
  32. </Col>
  33. <Col span={24} style={{ marginTop: 24 }}>
  34. <ChartCard
  35. title="移动指标"
  36. avatar={
  37. <img
  38. style={{ width: 56, height: 56 }}
  39. src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png"
  40. alt="indicator"
  41. />
  42. }
  43. action={
  44. <Tooltip title="指标说明">
  45. <Icon type="info-circle-o" />
  46. </Tooltip>
  47. }
  48. total={() => <span dangerouslySetInnerHTML={{ __html: yuan(126560) }} />}
  49. footer={<Field label="日均销售额" value={numeral(12423).format('0,0')} />}
  50. />
  51. </Col>
  52. <Col span={24} style={{ marginTop: 24 }}>
  53. <ChartCard
  54. title="移动指标"
  55. avatar={
  56. <img
  57. alt="indicator"
  58. style={{ width: 56, height: 56 }}
  59. src="https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png"
  60. />
  61. }
  62. action={
  63. <Tooltip title="指标说明">
  64. <Icon type="info-circle-o" />
  65. </Tooltip>
  66. }
  67. total={() => <span dangerouslySetInnerHTML={{ __html: yuan(126560) }} />}
  68. />
  69. </Col>
  70. </Row>,
  71. mountNode
  72. );

Charts 图表 - 图9

迷你区域图

迷你柱状图更适合展示简单的区间数据,简洁的表现方式可以很好的减少大数据量的视觉展现压力。

  1. import { MiniBar } from 'ant-design-pro/lib/Charts';
  2. import moment from 'moment';
  3. const visitData = [];
  4. const beginDay = new Date().getTime();
  5. for (let i = 0; i < 20; i += 1) {
  6. visitData.push({
  7. x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
  8. y: Math.floor(Math.random() * 100) + 10,
  9. });
  10. }
  11. ReactDOM.render(<MiniBar height={45} data={visitData} />, mountNode);

Charts 图表 - 图10

柱状图

通过设置 xy 属性,可以快速的构建出一个漂亮的柱状图,各种纬度的关系则是通过自定义的数据展现。

  1. import { Bar } from 'ant-design-pro/lib/Charts';
  2. const salesData = [];
  3. for (let i = 0; i < 12; i += 1) {
  4. salesData.push({
  5. x: `${i + 1}月`,
  6. y: Math.floor(Math.random() * 1000) + 200,
  7. });
  8. }
  9. ReactDOM.render(<Bar height={200} title="销售额趋势" data={salesData} />, mountNode);

Charts 图表 - 图11

迷你饼状图

通过简化 Pie 属性的设置,可以快速的实现极简的饼状图,可配合 ChartCard 组合展现更多业务场景。

  1. import { Pie } from 'ant-design-pro/lib/Charts';
  2. ReactDOM.render(<Pie percent={28} subTitle="中式快餐" total="28%" height={140} />, mountNode);

Charts 图表 - 图12

仪表盘

仪表盘是一种进度展示方式,可以更直观的展示当前的进展情况,通常也可表示占比。

  1. import { Gauge } from 'ant-design-pro/lib/Charts';
  2. ReactDOM.render(<Gauge title="核销率" height={164} percent={87} />, mountNode);

Charts 图表 - 图13

带有时间轴的图表

使用 TimelineChart 组件可以实现带有时间轴的柱状图展现,而其中的 x 属性,则是时间值的指向,默认最多支持同时展现两个指标,分别是 y1y2

  1. import { TimelineChart } from 'ant-design-pro/lib/Charts';
  2. const chartData = [];
  3. for (let i = 0; i < 20; i += 1) {
  4. chartData.push({
  5. x: new Date().getTime() + 1000 * 60 * 30 * i,
  6. y1: Math.floor(Math.random() * 100) + 1000,
  7. y2: Math.floor(Math.random() * 100) + 10,
  8. });
  9. }
  10. ReactDOM.render(
  11. <TimelineChart height={200} data={chartData} titleMap={{ y1: '客流量', y2: '支付笔数' }} />,
  12. mountNode
  13. );

API

ChartCard

参数说明类型默认值
title卡片标题ReactNode|string-
action卡片操作ReactNode-
total数据总量ReactNode | number | function-
footer卡片底部ReactNode-
contentHeight内容区域高度number-
avatar右侧图标React.ReactNode-

MiniBar

参数说明类型默认值
color图表颜色string#1890FF
height图表高度number-
data数据array<{x, y}>-

MiniArea

参数说明类型默认值
color图表颜色stringrgba(24, 144, 255, 0.2)
borderColor图表边颜色string#1890FF
height图表高度number-
line是否显示描边booleanfalse
animate是否显示动画booleantrue
xAxisx 轴配置object-
yAxisy 轴配置object-
data数据array<{x, y}>-

MiniProgress

参数说明类型默认值
target目标比例number-
color进度条颜色string-
strokeWidth进度条高度number-
percent进度比例number-

Bar

参数说明类型默认值
title图表标题ReactNode|string-
color图表颜色stringrgba(24, 144, 255, 0.85)
padding图表内部间距array'auto'
height图表高度number-
data数据array<{x, y}>-
autoLabel在宽度不足时,自动隐藏 x 轴的 labelbooleantrue

Pie

参数说明类型默认值
animate是否显示动画booleantrue
color图表颜色stringrgba(24, 144, 255, 0.85)
height图表高度number-
hasLegend是否显示 legendbooleanfalse
padding图表内部间距array'auto'
percent占比number-
tooltip是否显示 tooltipbooleantrue
valueFormat显示值的格式化函数function-
title图表标题ReactNode|string-
subTitle图表子标题ReactNode|string-
total图标中央的总数stringfunction

Radar

参数说明类型默认值
title图表标题ReactNode|string-
height图表高度number-
hasLegend是否显示 legendbooleanfalse
padding图表内部间距array'auto'
data图标数据array<{name,label,value}>-

Gauge

参数说明类型默认值
title图表标题ReactNode|string-
height图表高度number-
color图表颜色string#2F9CFF
bgColor图表背景颜色string#F0F2F5
percent进度比例number-

WaterWave

参数说明类型默认值
title图表标题ReactNode|string-
height图表高度number-
color图表颜色string#1890FF
percent进度比例number-

TagCloud

参数说明类型默认值
data标题Array<name, value>-
height高度值number-

TimelineChart

参数说明类型默认值
data标题Array<x, y1, y2>-
titleMap指标别名Object{y1: '客流量', y2: '支付笔数'}-
height高度值number400

Field

参数说明类型默认值
label标题ReactNode|string-
valueReactNode|string-