index.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <div class="chart-wrap">
  3. <v-chart autoresize :option="option"/>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'SyjhdxqkChart',
  9. data() {
  10. return {
  11. option: {}
  12. }
  13. },
  14. created() {
  15. this.getOption()
  16. },
  17. methods: {
  18. getOption() {
  19. const data = [{
  20. name: '第一季度',
  21. value: 40
  22. }, {
  23. name: '第二季度',
  24. value: 30
  25. }, {
  26. name: '第三季度',
  27. value: 20
  28. }, {
  29. name: '第四季度',
  30. value: 10
  31. }]
  32. const name = data.map((item) => item.name)
  33. const value = data.map((item) => item.value)
  34. const sum = value.reduce((a, b) => {
  35. return a + b
  36. })
  37. const colors = [
  38. [
  39. new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: 'rgb(82, 113, 195)' }, {
  40. offset: 1,
  41. color: 'rgb(120, 142, 237)'
  42. }], false),
  43. new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: 'rgb(81, 129, 192)' }, {
  44. offset: 1,
  45. color: 'rgb(123, 148, 234)'
  46. }], false),
  47. new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: 'rgb(89, 137, 188)' }, {
  48. offset: 1,
  49. color: 'rgb(113, 173, 229)'
  50. }], false),
  51. new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: 'rgb(88, 166, 191)' }, {
  52. offset: 1,
  53. color: 'rgb(128, 230, 226)'
  54. }], false)
  55. ],
  56. ['rgb(41, 73, 110)',
  57. 'rgb(41, 73, 110)',
  58. 'rgb(41, 73, 110)',
  59. 'rgb(41, 73, 110)'
  60. ]
  61. ]
  62. const series = []
  63. const yAxis = []
  64. for (let i = 0; i < data.length; i++) {
  65. series.push({
  66. name: '',
  67. type: 'pie',
  68. clockWise: false, // 顺时加载
  69. hoverAnimation: false, // 鼠标移入变大
  70. radius: [90 - i * 10 + '%', 86 - i * 10 + '%'],
  71. center: ['50%', '50%'],
  72. label: {
  73. show: false
  74. },
  75. itemStyle: {
  76. label: {
  77. show: false
  78. },
  79. labelLine: {
  80. show: false
  81. },
  82. borderRadius: 60 // 设置每一段子项目的圆角
  83. },
  84. data: [{
  85. value: data[i].value,
  86. name: data[i].name
  87. },
  88. {
  89. value: sum - data[i].value,
  90. name: '',
  91. itemStyle: {
  92. color: 'transparent',
  93. borderRadius: 60 // 设置每一段子项目的圆角
  94. },
  95. tooltip: {
  96. show: false
  97. },
  98. hoverAnimation: false
  99. }
  100. ]
  101. })
  102. series.push({
  103. name: '',
  104. type: 'pie',
  105. silent: true,
  106. z: 1,
  107. clockWise: false, // 顺时加载
  108. hoverAnimation: false, // 鼠标移入变大
  109. radius: [90 - i * 10 + '%', 86 - i * 10 + '%'],
  110. center: ['50%', '50%'],
  111. label: {
  112. show: false
  113. },
  114. itemStyle: {
  115. label: {
  116. show: false
  117. },
  118. labelLine: {
  119. show: false
  120. },
  121. borderRadius: 60 // 设置每一段子项目的圆角
  122. },
  123. data: [{
  124. value: 7.5,
  125. itemStyle: {
  126. color: colors[1][i]
  127. },
  128. tooltip: {
  129. show: false
  130. },
  131. hoverAnimation: false
  132. },
  133. {
  134. value: 2.5,
  135. itemStyle: {
  136. color: 'rgba(0,0,0,0)',
  137. borderWidth: 0,
  138. borderRadius: 60 // 设置每一段子项目的圆角
  139. },
  140. tooltip: {
  141. show: false
  142. },
  143. hoverAnimation: false
  144. }
  145. ]
  146. })
  147. yAxis.push(((data[i].value / sum) * 100).toFixed(2) + '%')
  148. }
  149. this.option = {
  150. backgroundColor: '#012248',
  151. color: colors[0],
  152. legend: {
  153. show: true,
  154. icon: 'circle',
  155. top: '15%',
  156. left: '60%',
  157. width: '40%',
  158. height: '60%',
  159. data: name,
  160. orient: 'vertical',
  161. formatter: (name) => {
  162. return (
  163. '{title|' + name + '} {value|' + data.find((item) => {
  164. return item.name === name
  165. }).value + '}'
  166. )
  167. },
  168. textStyle: {
  169. rich: {
  170. title: {
  171. fontSize: 14,
  172. lineHeight: 30,
  173. color: 'rgb(0, 178, 246)'
  174. },
  175. value: {
  176. fontSize: 14,
  177. lineHeight: 30,
  178. color: '#fff'
  179. }
  180. }
  181. }
  182. },
  183. tooltip: {
  184. show: true,
  185. trigger: 'item',
  186. formatter: '{a}<br>{b}:{c}({d}%)'
  187. },
  188. grid: {
  189. top: '3%',
  190. left: '50%',
  191. width: '40%',
  192. height: '21%',
  193. containLabel: false
  194. },
  195. yAxis: [{
  196. type: 'category',
  197. inverse: true,
  198. axisLine: {
  199. show: false
  200. },
  201. axisTick: {
  202. show: false
  203. },
  204. axisLabel: {
  205. interval: 0,
  206. inside: true,
  207. textStyle: {
  208. color: '#fff',
  209. fontSize: 14
  210. },
  211. show: true
  212. },
  213. data: yAxis
  214. }],
  215. xAxis: [{
  216. show: false
  217. }],
  218. series: series
  219. }
  220. }
  221. }
  222. }
  223. </script>
  224. <style scoped lang="scss">
  225. $xHeight: 120px;
  226. .chart-wrap {
  227. width: 100%;
  228. height: 100%;
  229. .left-bar {
  230. width: 35px;
  231. display: inline-block;
  232. }
  233. .right-conent {
  234. width: calc(100% - 35px);
  235. height: 100%;
  236. display: grid;
  237. grid-template-columns: 1fr 1fr 1fr 1fr;
  238. grid-template-rows: auto $xHeight;
  239. }
  240. }
  241. </style>