当前位置:   article > 正文

uni-app中使用echarts教程_uniapp echarts

uniapp echarts

涉及到的几个目录

一、下载echart

   方法一:从下载的源代码或编译产物安装

        

  方法二:从 npm 安装

       npm install echarts

  方法三:选择需要的模块,在线定制下载

     下载 - Apache ECharts

      即echarts.min.js  下载

二、引入

import echarts from '@/components/echarts/echarts.vue';

下面的是 echarts.vue的代码   您可以在components 创建一个echarts的文件夹里面放echarts.vue

代码里script.src = './static/echarts.min.js'   (更改路径不行的话,还是建议使用此路径) 在【4里面】

  1. <template>
  2. <view>
  3. <view class="echarts" :prop="option" :change:prop="echarts.update"></view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'Echarts',
  9. props: {
  10. option: {
  11. type: Object,
  12. required: true
  13. }
  14. }
  15. }
  16. </script>
  17. <script module="echarts" lang="renderjs">
  18. export default {
  19. data() {
  20. return {
  21. chart: null
  22. }
  23. },
  24. mounted() {
  25. if (typeof window.echarts === 'object') {
  26. this.init()
  27. } else {
  28. // 动态引入类库
  29. const script = document.createElement('script')
  30. script.src = './static/echarts.min.js'
  31. // script.src = './static/echarts/echarts.min.js'
  32. script.onload = this.init
  33. document.head.appendChild(script)
  34. }
  35. },
  36. methods: {
  37. /**
  38. * 初始化echarts
  39. */
  40. init() {
  41. this.chart = echarts.init(this.$el)
  42. this.update(this.option)
  43. },
  44. /**
  45. * 监测数据更新
  46. * @param {Object} option
  47. */
  48. update(option) {
  49. if (this.chart) {
  50. // 因App端,回调函数无法从renderjs外传递,故在此自定义设置相关回调函数
  51. if (option) {
  52. // tooltip
  53. if (option.tooltip) {
  54. // 判断是否设置tooltip的位置
  55. if (option.tooltip.positionStatus) {
  56. option.tooltip.position = this.tooltipPosition()
  57. }
  58. // 判断是否格式化tooltip
  59. if (option.tooltip.formatterStatus) {
  60. option.tooltip.formatter = this.tooltipFormatter(option.tooltip.formatterUnit, option.tooltip.formatFloat2, option.tooltip.formatThousands)
  61. }
  62. }
  63. // 设置新的option
  64. this.chart.setOption(option, option.notMerge)
  65. }
  66. }
  67. },
  68. /**
  69. * 设置tooltip的位置,防止超出画布
  70. */
  71. tooltipPosition() {
  72. return (point, params, dom, rect, size) => {
  73. //其中point为当前鼠标的位置,size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小
  74. let x = point[0]
  75. let y = point[1]
  76. let viewWidth = size.viewSize[0]
  77. let viewHeight = size.viewSize[1]
  78. let boxWidth = size.contentSize[0]
  79. let boxHeight = size.contentSize[1]
  80. let posX = 0 //x坐标位置
  81. let posY = 0 //y坐标位置
  82. if (x < boxWidth) { //左边放不开
  83. posX = 5
  84. } else { //左边放的下
  85. posX = x - boxWidth
  86. }
  87. if (y < boxHeight) { //上边放不开
  88. posY = 5
  89. } else { //上边放得下
  90. posY = y - boxHeight
  91. }
  92. return [posX, posY]
  93. }
  94. },
  95. /**
  96. * tooltip格式化
  97. * @param {Object} unit 数值后的单位
  98. * @param {Object} formatFloat2 是否保留两位小数
  99. * @param {Object} formatThousands 是否添加千分位
  100. */
  101. tooltipFormatter(unit, formatFloat2, formatThousands) {
  102. return params => {
  103. let result = ''
  104. unit = unit ? unit : ''
  105. for (let i in params) {
  106. if (i == 0) {
  107. result += params[i].axisValueLabel
  108. }
  109. let value = '--'
  110. if (params[i].data !== null) {
  111. value = params[i].data
  112. // 保留两位小数
  113. if (formatFloat2) {
  114. value = this.formatFloat2(value)
  115. }
  116. // 添加千分位
  117. if (formatThousands) {
  118. value = this.formatThousands(value)
  119. }
  120. }
  121. // #ifdef H5
  122. result += '\n' + params[i].seriesName + ':' + value + ' ' + unit
  123. // #endif
  124. // #ifdef APP-PLUS
  125. result += '<br/>' + params[i].marker + params[i].seriesName + ':' + value + ' ' + unit
  126. // #endif
  127. }
  128. return result
  129. }
  130. },
  131. /**
  132. * 保留两位小数
  133. * @param {Object} value
  134. */
  135. formatFloat2(value) {
  136. let temp = Math.round(parseFloat(value) * 100) / 100
  137. let xsd = temp.toString().split('.')
  138. if (xsd.length === 1) {
  139. temp = (isNaN(temp) ? '0' : temp.toString()) + '.00'
  140. return temp
  141. }
  142. if (xsd.length > 1) {
  143. if (xsd[1].length < 2) {
  144. temp = temp.toString() + '0'
  145. }
  146. return temp
  147. }
  148. },
  149. /**
  150. * 添加千分位
  151. * @param {Object} value
  152. */
  153. formatThousands(value) {
  154. if (value === undefined || value === null) {
  155. value = ''
  156. }
  157. if (!isNaN(value)) {
  158. value = value + ''
  159. }
  160. let re = /\d{1,3}(?=(\d{3})+$)/g
  161. let n1 = value.replace(/^(\d+)((\.\d+)?)$/, function(s, s1, s2) {
  162. return s1.replace(re, '$&,') + s2
  163. })
  164. return n1
  165. }
  166. }
  167. }
  168. </script>
  169. <style lang="scss" scoped>
  170. .echarts {
  171. width: 100%;
  172. height: 100%;
  173. }
  174. </style>

5、随便起一个Vue页面 复制下面代码demo测试

  1. <template>
  2. <view class="viewimg">
  3. <view>
  4. <view>echarts示列</view>
  5. <echarts :option="option" style="height: 300px;"></echarts>
  6. <button @click="updateClick">更新数据</button>
  7. </view>
  8. <view>
  9. <echarts :option="optionone" style="height: 400px;"></echarts>
  10. </view>
  11. <view>
  12. <echarts :option="optiontwo" style="height: 400px;"></echarts>
  13. </view>
  14. </view>
  15. </template>
  16. <script>
  17. import echarts from '@/components/echarts/echarts.vue';
  18. export default {
  19. data() {
  20. return {
  21. option: {},
  22. optionone: {},
  23. optiontwo: {}
  24. };
  25. },
  26. onLoad() {
  27. // console.log(777777);
  28. },
  29. components: {
  30. echarts
  31. },
  32. mounted() {
  33. this.logstatrt();
  34. this.logstatrtone();
  35. this.logstatrttwo();
  36. },
  37. methods: {
  38. logstatrt() {
  39. // console.log('初次调用');
  40. this.option = {
  41. backgroundColor: '#011246',
  42. tooltip: {
  43. trigger: 'axis',
  44. axisPointer: {
  45. type: 'shadow'
  46. }
  47. },
  48. grid: {
  49. top: '25%',
  50. right: '45',
  51. bottom: '20',
  52. left: '30'
  53. },
  54. legend: {
  55. data: [{
  56. name: '人保'
  57. }, {
  58. name: '太保'
  59. }, {
  60. name: '平安'
  61. }, {
  62. name: '人保增速'
  63. }, {
  64. name: '太保增速'
  65. }, {
  66. name: '平安增速'
  67. }],
  68. top: '0%',
  69. textStyle: {
  70. color: 'rgba(255,255,255,0.9)' //图例文字
  71. }
  72. },
  73. dataZoom: [{
  74. type: 'slider',
  75. realtime: true,
  76. //移动端展示方式
  77. handleSize: '100%', //滑动条两侧的大小
  78. start: 0,
  79. end: 50
  80. }],
  81. grid: {
  82. left: '3%',
  83. right: '4%',
  84. bottom: '15%',
  85. height: '70%',
  86. containLabel: true
  87. },
  88. xAxis: [{
  89. type: 'category',
  90. data: ['2015', '2016', '2017', '2018', '2019'],
  91. axisLine: {
  92. lineStyle: {
  93. color: 'rgba(255,255,255,.1)'
  94. }
  95. },
  96. axisLabel: {
  97. textStyle: {
  98. color: 'rgba(255,255,255,.7)',
  99. fontSize: '14'
  100. }
  101. }
  102. }],
  103. yAxis: [{
  104. type: 'value',
  105. name: '单位万',
  106. splitLine: {
  107. show: false
  108. },
  109. axisLabel: {
  110. show: true,
  111. fontSize: 14,
  112. color: 'rgba(255,255,255,.6)'
  113. },
  114. axisLine: {
  115. min: 0,
  116. max: 10,
  117. lineStyle: {
  118. color: 'rgba(255,255,255,.4)'
  119. }
  120. } //左线色
  121. },
  122. {
  123. type: 'value',
  124. name: '增速',
  125. show: true,
  126. axisLabel: {
  127. show: true,
  128. fontSize: 14,
  129. formatter: '{value} %',
  130. color: 'rgba(255,255,255,.6)'
  131. },
  132. axisLine: {
  133. lineStyle: {
  134. color: 'rgba(255,255,255,.4)'
  135. }
  136. }, //右线色
  137. splitLine: {
  138. show: true,
  139. lineStyle: {
  140. color: 'rgba(255,255,255,.1)'
  141. }
  142. } //x轴线
  143. }
  144. ],
  145. series: [{
  146. name: '人保',
  147. type: 'bar',
  148. data: [35, 36.6, 38.8, 40.84, 41.6],
  149. // "barWidth": "30",
  150. itemStyle: {
  151. normal: {
  152. color: {
  153. type: 'linear',
  154. x: 0.5,
  155. y: 0.5,
  156. r: 0.5,
  157. colorStops: [{
  158. offset: 0,
  159. color: '#00FFE3' // 0% 处的颜色
  160. },
  161. {
  162. offset: 1,
  163. color: '#4693EC' // 100% 处的颜色
  164. }
  165. ],
  166. globalCoord: false // 缺省为 false
  167. }
  168. }
  169. }
  170. // "barGap": "0.2"
  171. },
  172. {
  173. name: '太保',
  174. type: 'bar',
  175. data: [16, 14.8, 14.1, 15, 16.3],
  176. color: {
  177. type: 'linear',
  178. x: 0.5,
  179. y: 0.5,
  180. r: 0.5,
  181. colorStops: [{
  182. offset: 0,
  183. color: '#248ff7' // 0% 处的颜色
  184. },
  185. {
  186. offset: 1,
  187. color: '#6851f1' // 100% 处的颜色
  188. }
  189. ],
  190. globalCoord: false // 缺省为 false
  191. }
  192. },
  193. {
  194. name: '平安',
  195. type: 'bar',
  196. data: [10.2, 9.2, 9.1, 9.85, 8.9],
  197. color: {
  198. type: 'linear',
  199. x: 0.5,
  200. y: 0.5,
  201. r: 0.5,
  202. colorStops: [{
  203. offset: 0,
  204. color: '#fccb05' // 0% 处的颜色
  205. },
  206. {
  207. offset: 1,
  208. color: '#f5804d' // 100% 处的颜色
  209. }
  210. ],
  211. globalCoord: false // 缺省为 false
  212. }
  213. },
  214. {
  215. name: '人保增速',
  216. type: 'line',
  217. yAxisIndex: 1,
  218. data: [0, 6.01, 5.26, 1.48],
  219. lineStyle: {
  220. normal: {
  221. width: 2
  222. }
  223. },
  224. itemStyle: {
  225. normal: {
  226. color: '#86d370'
  227. }
  228. },
  229. smooth: true
  230. },
  231. {
  232. name: '太保增速',
  233. type: 'line',
  234. yAxisIndex: 1,
  235. data: [0, -4.73, 6.38, 8.67],
  236. lineStyle: {
  237. normal: {
  238. width: 2
  239. }
  240. },
  241. itemStyle: {
  242. normal: {
  243. color: '#3496f8'
  244. }
  245. },
  246. smooth: true
  247. },
  248. {
  249. name: '平安增速',
  250. type: 'line',
  251. yAxisIndex: 1,
  252. data: [0, -1.09, 8.24, -9.64],
  253. lineStyle: {
  254. normal: {
  255. width: 2
  256. }
  257. },
  258. itemStyle: {
  259. normal: {
  260. color: '#fbc30d'
  261. }
  262. },
  263. smooth: true
  264. }
  265. ]
  266. };
  267. },
  268. logstatrtone() {
  269. this.optionone = {
  270. backgroundColor: '#0c1e55',
  271. color: ['#00a0fc', '#ffe400', '#ff9a09', '#ef1e5f', '#23cbe5', '#ec561b', '#ffa500', '#dddf00', '#b23aee',
  272. '#50b332'
  273. ],
  274. tooltip: {
  275. trigger: 'item',
  276. // formatter: " {a} <br/>{b} : {c} ({d}%)"
  277. formatter: " 企业数:{c}"
  278. },
  279. legend: { // 图例-图上面的分类
  280. // orient: 'vertical',
  281. // right: 30,
  282. // icon: 'rect',//长方形
  283. icon: 'circle',
  284. top: "1%",
  285. itemWidth: 10,
  286. itemHeight: 10,
  287. // itemGap: 13,
  288. data: ['16℃以下', '16-18℃', '18-20℃', '20-22℃', '22-24℃', '24-26℃', '26℃以上'],
  289. // right: '56%',
  290. textStyle: {
  291. fontSize: 14,
  292. color: '#a6cde8',
  293. lineHeight: 49
  294. },
  295. formatter: function(name) {
  296. return "" + name + ""
  297. },
  298. padding: [2, 2]
  299. },
  300. grid: {
  301. top: '20%',
  302. left: '53%',
  303. right: '10%',
  304. bottom: '6%',
  305. containLabel: true
  306. },
  307. series: [{
  308. label: {
  309. normal: {
  310. formatter: '{b|{b}:} {c} \n {per|{d}%} ',
  311. rich: {}
  312. },
  313. emphasis: {
  314. show: true,
  315. }
  316. },
  317. // labelLine: {
  318. // normal: {
  319. // show: false
  320. // }
  321. // },
  322. name: '访问来源',
  323. type: 'pie',
  324. radius: '55%',
  325. center: ['50%', '60%'],
  326. data: [{
  327. value: 195,
  328. name: '16℃以下'
  329. },
  330. {
  331. value: 185,
  332. name: '16-18℃'
  333. },
  334. {
  335. value: 260,
  336. name: '18-20℃'
  337. },
  338. {
  339. value: 213,
  340. name: '20-22℃'
  341. },
  342. {
  343. value: 52,
  344. name: '22-24℃'
  345. },
  346. {
  347. value: 35,
  348. name: '24-26℃'
  349. },
  350. {
  351. value: 46,
  352. name: '26℃以上'
  353. },
  354. ],
  355. itemStyle: {
  356. emphasis: {
  357. shadowBlur: 10,
  358. shadowOffsetX: 0,
  359. shadowColor: 'rgba(0, 0, 0, 0.5)'
  360. }
  361. },
  362. labelLine: {
  363. normal: {
  364. length: 5,
  365. length2: 1,
  366. smooth: true,
  367. }
  368. },
  369. }]
  370. };
  371. },
  372. logstatrttwo() {
  373. var m2R2Data = [{
  374. value: 335,
  375. value1: 234,
  376. legendname: 'Ⅰ类',
  377. name: "Ⅰ类",
  378. itemStyle: {
  379. color: "#8d7fec"
  380. }
  381. },
  382. {
  383. value: 310,
  384. value1: 314,
  385. legendname: 'Ⅱ类',
  386. name: "Ⅱ类",
  387. itemStyle: {
  388. color: "#5085f2"
  389. }
  390. },
  391. {
  392. value: 234,
  393. value1: 235,
  394. legendname: 'Ⅲ类',
  395. name: "Ⅲ类",
  396. itemStyle: {
  397. color: "#e75fc3"
  398. }
  399. },
  400. {
  401. value: 154,
  402. value1: 213,
  403. legendname: 'Ⅳ类',
  404. name: "Ⅳ类",
  405. itemStyle: {
  406. color: "#f87be2"
  407. }
  408. },
  409. {
  410. value: 335,
  411. value1: 321,
  412. legendname: 'Ⅴ类',
  413. name: "Ⅴ类",
  414. itemStyle: {
  415. color: "#f2719a"
  416. }
  417. },
  418. ];
  419. this.optiontwo = {
  420. title: [{
  421. text: '全网调控情况',
  422. textStyle: {
  423. fontSize: 16,
  424. color: "black"
  425. },
  426. left: "35%"
  427. },
  428. {
  429. text: '全网均温',
  430. subtext: 44.5 + '℃',
  431. textStyle: {
  432. fontSize: 15,
  433. color: "black"
  434. },
  435. subtextStyle: {
  436. fontSize: 20,
  437. color: 'black'
  438. },
  439. textAlign: "center",
  440. x: '40%',
  441. y: '44%',
  442. }
  443. ],
  444. tooltip: {
  445. trigger: 'item',
  446. formatter: function(parms) {
  447. var str = parms.seriesName + "</br>" +
  448. parms.marker + "" + parms.data.legendname + "</br>" +
  449. "当前温度:" + parms.data.value + "</br>" +
  450. "目标温度:" + parms.data.value1 + "</br>" +
  451. "占比:" + parms.percent + "%";
  452. return str;
  453. }
  454. },
  455. legend: {
  456. type: "scroll",
  457. orient: 'vertical',
  458. left: '80%',
  459. align: 'left',
  460. top: 'middle',
  461. textStyle: {
  462. color: '#8C8C8C'
  463. },
  464. },
  465. series: [{
  466. name: '全网调控情况',
  467. type: 'pie',
  468. center: ['40%', '50%'],
  469. radius: ['40%', '65%'],
  470. clockwise: false, //饼图的扇区是否是顺时针排布
  471. avoidLabelOverlap: false,
  472. itemStyle: { //图形样式
  473. normal: {
  474. borderColor: '#ffffff',
  475. borderWidth: 1,
  476. },
  477. },
  478. label: {
  479. normal: {
  480. show: true,
  481. position: 'outter',
  482. formatter: function(parms) {
  483. return parms.data.legendname
  484. }
  485. }
  486. },
  487. labelLine: {
  488. normal: {
  489. length: 15,
  490. length2: 13,
  491. smooth: true,
  492. }
  493. },
  494. data: m2R2Data
  495. }]
  496. };
  497. },
  498. /**
  499. * 更新数据
  500. */
  501. updateClick() {
  502. this.option.series=[{
  503. name: '人保',
  504. type: 'bar',
  505. data: [10, 10, 10, 10, 10],
  506. // "barWidth": "30",
  507. itemStyle: {
  508. normal: {
  509. color: {
  510. type: 'linear',
  511. x: 0.5,
  512. y: 0.5,
  513. r: 0.5,
  514. colorStops: [{
  515. offset: 0,
  516. color: '#00FFE3' // 0% 处的颜色
  517. },
  518. {
  519. offset: 1,
  520. color: '#4693EC' // 100% 处的颜色
  521. }
  522. ],
  523. globalCoord: false // 缺省为 false
  524. }
  525. }
  526. }
  527. // "barGap": "0.2"
  528. },
  529. {
  530. name: '太保',
  531. type: 'bar',
  532. data: [16, 14.8, 14.1, 15, 16.3],
  533. color: {
  534. type: 'linear',
  535. x: 0.5,
  536. y: 0.5,
  537. r: 0.5,
  538. colorStops: [{
  539. offset: 0,
  540. color: '#248ff7' // 0% 处的颜色
  541. },
  542. {
  543. offset: 1,
  544. color: '#6851f1' // 100% 处的颜色
  545. }
  546. ],
  547. globalCoord: false // 缺省为 false
  548. }
  549. },
  550. {
  551. name: '平安',
  552. type: 'bar',
  553. data: [10.2, 9.2, 9.1, 9.85, 8.9],
  554. color: {
  555. type: 'linear',
  556. x: 0.5,
  557. y: 0.5,
  558. r: 0.5,
  559. colorStops: [{
  560. offset: 0,
  561. color: '#fccb05' // 0% 处的颜色
  562. },
  563. {
  564. offset: 1,
  565. color: '#f5804d' // 100% 处的颜色
  566. }
  567. ],
  568. globalCoord: false // 缺省为 false
  569. }
  570. },
  571. {
  572. name: '人保增速',
  573. type: 'line',
  574. yAxisIndex: 1,
  575. data: [0, 6.01, 5.26, 1.48],
  576. lineStyle: {
  577. normal: {
  578. width: 2
  579. }
  580. },
  581. itemStyle: {
  582. normal: {
  583. color: '#86d370'
  584. }
  585. },
  586. smooth: true
  587. },
  588. {
  589. name: '太保增速',
  590. type: 'line',
  591. yAxisIndex: 1,
  592. data: [0, -4.73, 6.38, 8.67],
  593. lineStyle: {
  594. normal: {
  595. width: 2
  596. }
  597. },
  598. itemStyle: {
  599. normal: {
  600. color: '#3496f8'
  601. }
  602. },
  603. smooth: true
  604. },
  605. {
  606. name: '平安增速',
  607. type: 'line',
  608. yAxisIndex: 1,
  609. data: [0, -1.09, 8.24, -9.64],
  610. lineStyle: {
  611. normal: {
  612. width: 2
  613. }
  614. },
  615. itemStyle: {
  616. normal: {
  617. color: '#fbc30d'
  618. }
  619. },
  620. smooth: true
  621. }
  622. ]
  623. // this.option = {
  624. // notMerge: true, // 自定义变量:true代表不合并数据,比如从折线图变为柱形图则需设置为truefalse或不写代表合并
  625. // xAxis: {
  626. // type: 'category',
  627. // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  628. // },
  629. // yAxis: {
  630. // type: 'value'
  631. // },
  632. // series: [{
  633. // data: [120, 200, 150, 80, 70, 110, 130],
  634. // type: 'bar',
  635. // showBackground: true,
  636. // backgroundStyle: {
  637. // color: 'rgba(220, 220, 220, 0.8)'
  638. // }
  639. // }]
  640. // };
  641. }
  642. }
  643. };
  644. </script>
  645. <style>
  646. .viewimg {
  647. height: 100%;
  648. /* background: #d1e9e9; */
  649. }
  650. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/123939
推荐阅读