Pie.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <template>
  2. <v-chart :forceFit="true" :height="height" :data="data" :scale="scale" :onClick="handleClick">
  3. <v-tooltip :showTitle="false" dataKey="item*percent"/>
  4. <v-axis/>
  5. <v-legend dataKey="item"/>
  6. <v-pie position="percent" color="item" :v-style="pieStyle" :label="labelConfig"/>
  7. <v-coord type="theta"/>
  8. </v-chart>
  9. </template>
  10. <script>
  11. const DataSet = require('@antv/data-set')
  12. import { ChartEventMixins } from './mixins/ChartMixins'
  13. export default {
  14. name: 'Pie',
  15. mixins: [ChartEventMixins],
  16. props: {
  17. title: {
  18. type: String,
  19. default: ''
  20. },
  21. height: {
  22. type: Number,
  23. default: 254
  24. },
  25. dataSource: {
  26. type: Array,
  27. default: () => [
  28. { item: '示例一', count: 40 },
  29. { item: '示例二', count: 21 },
  30. { item: '示例三', count: 17 },
  31. { item: '示例四', count: 13 },
  32. { item: '示例五', count: 9 }
  33. ]
  34. }
  35. },
  36. data() {
  37. return {
  38. scale: [{
  39. dataKey: 'percent',
  40. min: 0,
  41. formatter: '.0%'
  42. }],
  43. pieStyle: {
  44. stroke: '#fff',
  45. lineWidth: 1
  46. },
  47. labelConfig: ['percent', {
  48. formatter: (val, item) => {
  49. return item.point.item + ': ' + val
  50. }
  51. }]
  52. }
  53. },
  54. computed: {
  55. data() {
  56. let dv = new DataSet.View().source(this.dataSource)
  57. // 计算数据百分比
  58. dv.transform({
  59. type: 'percent',
  60. field: 'count',
  61. dimension: 'item',
  62. as: 'percent'
  63. })
  64. return dv.rows
  65. }
  66. }
  67. }
  68. </script>