当前位置:   article > 正文

[echarts]vue2项目中折柱图-柱形图伪3d效果实现_vue2中用echarts画一个折柱图

vue2中用echarts画一个折柱图

不知道是不是现在的版本更新了,echarts-gl在vue2项目中不能适配使用,难蹦

0417-- 今日偶然发现用命令直接安装5.5.0版本的echarts就可以和gl兼容,改日空了可以试试3d柱状以及折线图

一.需求分析与设计思路

项目当中遇到改版升级,想要实现如下的一下折柱图的立体效果

想在原来平面柱状图的基础上,有立体的效果.本来打算用echarts-gl库来实现3d版的柱形图,但是引入和配置后,浏览器总是报不能识别的错误,为了尽快实现类似效果,就换做左右色差来做效果.

二.环境准备与依赖引入

主要组件库还是基于echarts 库,没有安装的直接在终端输入以下代码安装

npm i echarts

然后在你封装或者使用图表的地方引入使用即可

import * as echarts from 'echarts';

三.构建伪3d柱形图

1.首先按照惯例创建图表元素

  1. <!-- 折线图 -->
  2. <template>
  3. <div id="bar3d" style="width: 100%; height: 110%; padding-top: 20px; padding-left: 10px"></div>
  4. </template>

当然,行内调整样式根据自己的情况

2.引入echarts,配置该组件需要接收的参数,我个人项目中的情况如下

  1. import echartMixins from './echartMixins';
  2. import * as echarts from 'echarts';
  3. import echartMixins from './echartMixins';
  4. //引入的混入中,主要封装了父组件需要往子组件中传递的x轴信息,y轴最大值信息,以及不同柱形以及折线的y轴信息
  5. //依次为xAxisData,values,maxX
  6. //声明下面变量来控制图表是否已经初始化
  7. data() {
  8. return {
  9. hasInitChart: false,
  10. };
  11. },

3.具体思路及代码实时

第一版的时候,我是想采用拼接的方法来达到立体的效果,具体就是在配置每个y轴柱形的数据时,将每个柱形分为3部分组成, 上部-中部-下部,设置头部/底部为椭圆效果,中部为左右色差效果,具体效果和代码如下图

  1. methods: {
  2. init() {
  3. //绿色
  4. const data = [1700, 800, 1700, 600, 800, 1700];
  5. //蓝色
  6. const data2 = [2600, 1400, 3350, 1400, 1400, 3350];
  7. const sideData = data.map((item) => item + 90);
  8. const sideData2 = data.map((item) => item + 90);
  9. var serveTBar = echarts.init(document.getElementById('bar3d'));
  10. serveTBar.setOption(getEcharts3DBar());
  11. function getEcharts3DBar() {
  12. //蓝色
  13. var colorArr2 = ['rgba(11, 83, 128)', 'rgba(2, 143, 224)'];
  14. //绿色
  15. var colorArr = ['rgb(12, 109, 122)', 'rgba(1, 241, 228)'];
  16. //绿色
  17. var color = {
  18. type: 'linear',
  19. x: 0,
  20. x2: 1,
  21. y: 0,
  22. y2: 0,
  23. colorStops: [
  24. {
  25. offset: 0,
  26. color: colorArr[0],
  27. },
  28. {
  29. offset: 0.5,
  30. color: colorArr[0],
  31. },
  32. {
  33. offset: 0.5,
  34. color: colorArr[1],
  35. },
  36. {
  37. offset: 1,
  38. color: colorArr[1],
  39. },
  40. ],
  41. };
  42. var color2 = {
  43. type: 'linear',
  44. x: 0,
  45. x2: 1,
  46. y: 0,
  47. y2: 0,
  48. colorStops: [
  49. {
  50. offset: 0,
  51. color: colorArr2[0],
  52. },
  53. {
  54. offset: 0.5,
  55. color: colorArr2[0],
  56. },
  57. {
  58. offset: 0.5,
  59. color: colorArr2[1],
  60. },
  61. {
  62. offset: 1,
  63. color: colorArr2[1],
  64. },
  65. ],
  66. };
  67. var barWidth = 15;
  68. var option = {
  69. tooltip: {
  70. trigger: 'axis',
  71. formatter: function (params) {
  72. var str = params[0].name + ':';
  73. params.filter(function (item) {
  74. if (item.componentSubType == 'bar') {
  75. str += '<br/>' + item.seriesName + ':' + item.value;
  76. }
  77. });
  78. return str;
  79. },
  80. },
  81. //图表大小位置限制
  82. grid: {
  83. x: '10%',
  84. x2: '5%',
  85. y: '15%',
  86. y2: '15%',
  87. },
  88. xAxis: {
  89. data: ['1月', '2月', '3月', '4月', '5月', '6月'],
  90. //坐标轴
  91. axisLine: {
  92. show: true,
  93. lineStyle: {
  94. width: 1,
  95. color: '#214776',
  96. },
  97. textStyle: {
  98. color: '#fff',
  99. fontSize: '10',
  100. },
  101. },
  102. type: 'category',
  103. axisLabel: {
  104. textStyle: {
  105. color: '#C5DFFB',
  106. fontWeight: 500,
  107. fontSize: '14',
  108. },
  109. },
  110. axisTick: {
  111. textStyle: {
  112. color: '#fff',
  113. fontSize: '16',
  114. },
  115. show: false,
  116. },
  117. axisLine: {
  118. show: true,
  119. lineStyle: {
  120. type: 'dashed', //线的类型 虚线
  121. color: '#DEDEDE',
  122. },
  123. },
  124. },
  125. yAxis: {
  126. name: '自定义显示',
  127. nameTextStyle: {
  128. color: '#DEDEDE',
  129. fontSize: 12,
  130. padding: 10,
  131. },
  132. min: 0, //最小
  133. max: 3500, //最大
  134. interval: 500, //相差
  135. type: 'value',
  136. splitLine: {
  137. show: true,
  138. lineStyle: {
  139. type: 'dashed', //线的类型 虚线0
  140. opacity: 0.2, //透明度
  141. },
  142. },
  143. axisTick: {
  144. show: false,
  145. },
  146. axisLine: {
  147. show: false,
  148. },
  149. //坐标值标注
  150. axisLabel: {
  151. show: true,
  152. textStyle: {
  153. color: '#C5DFFB',
  154. },
  155. },
  156. },
  157. series: [
  158. //中
  159. {
  160. z: 1,
  161. name: '绿色',
  162. type: 'bar',
  163. barWidth: barWidth,
  164. barGap: '0%',
  165. data: data,
  166. itemStyle: {
  167. normal: {
  168. color: color,
  169. //柱形图上方标题
  170. label: {
  171. show: true,
  172. position: 'top',
  173. textStyle: {
  174. color: 'rgb(1, 255, 250)',
  175. fontSize: 8,
  176. },
  177. },
  178. },
  179. },
  180. },
  181. //下
  182. {
  183. z: 2,
  184. name: '绿色',
  185. type: 'pictorialBar',
  186. data: sideData,
  187. symbol: 'roundRect',
  188. symbolOffset: ['-75%', '50%'],
  189. symbolSize: [barWidth, 10],
  190. itemStyle: {
  191. normal: {
  192. color: color,
  193. },
  194. },
  195. tooltip: {
  196. show: false,
  197. },
  198. },
  199. //上
  200. {
  201. z: 3,
  202. name: '绿色',
  203. type: 'pictorialBar',
  204. symbolPosition: 'end',
  205. data: data,
  206. symbol: 'roundRect',
  207. symbolOffset: ['-75%', '-50%'],
  208. symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
  209. itemStyle: {
  210. normal: {
  211. borderWidth: 2,
  212. color: colorArr[2],
  213. },
  214. },
  215. tooltip: {
  216. show: false,
  217. },
  218. },
  219. {
  220. z: 1,
  221. name: '蓝色',
  222. type: 'bar',
  223. barWidth: barWidth,
  224. barGap: '50%',
  225. data: data2,
  226. itemStyle: {
  227. normal: {
  228. color: color2,
  229. //柱形图上方标题
  230. label: {
  231. show: true,
  232. position: 'top',
  233. textStyle: {
  234. color: 'rgb(2, 157, 246)',
  235. fontSize: 8,
  236. },
  237. },
  238. },
  239. },
  240. },
  241. {
  242. z: 2,
  243. name: '蓝色',
  244. type: 'pictorialBar',
  245. data: sideData2,
  246. symbol: 'roundRect',
  247. symbolOffset: ['75%', '50%'],
  248. symbolSize: [barWidth, 10],
  249. itemStyle: {
  250. normal: {
  251. color: color2,
  252. },
  253. },
  254. tooltip: {
  255. show: false,
  256. },
  257. },
  258. {
  259. z: 3,
  260. name: '蓝色',
  261. type: 'pictorialBar',
  262. symbolPosition: 'end',
  263. data: data2,
  264. symbol: 'roundRect',
  265. symbolOffset: ['75%', '-50%'],
  266. symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
  267. itemStyle: {
  268. normal: {
  269. borderWidth: 2,
  270. color: colorArr2[2],
  271. },
  272. },
  273. tooltip: {
  274. show: false,
  275. },
  276. },
  277. ],
  278. };
  279. return option;
  280. }
  281. },
  282. },

但是这样设置静态柱形图,微调下看着或许是没有什么影响,但是当你多个柱形的时候,点击上方的legend标签来控制柱形的显示与隐藏时,每个柱形原本的上部和下部就会偏移,不能很好的控制上和下部的相对定位,于是边保留了部分代码,换做下面的一种类似效果

第二版效果如下

去除上部和下部的组合,只保留了色差的效果,代码如下

  1. initChart(xAxisData, values, maxX) {
  2. var serveTBar = echarts.init(document.getElementById('bar3d'));
  3. serveTBar.setOption(getEcharts3DBar());
  4. function getEcharts3DBar() {
  5. //提醒数
  6. var colorArr2 = ['rgba(232, 137, 187,1)', 'rgba(232, 137, 187,0.7)'];
  7. //预加载
  8. var colorArr = ['rgba(249, 218, 142,1)', 'rgba(240, 234, 142,0.7)'];
  9. //互认数
  10. var colorArr3 = ['rgba(89, 172, 176,1)', 'rgba(89, 172, 176,0.7)'];
  11. //引用数
  12. var colorArr4 = ['rgba(104, 221, 250,1)', 'rgba(104, 221, 250,0.7)'];
  13. //颜色设置
  14. var color = {
  15. type: 'linear',
  16. x: 0,
  17. x2: 1,
  18. y: 0,
  19. y2: 0,
  20. colorStops: [
  21. {
  22. offset: 0,
  23. color: colorArr[1], // 不透明
  24. },
  25. {
  26. offset: 0.5,
  27. color: colorArr[1], // 不透明
  28. },
  29. {
  30. offset: 0.5,
  31. color: colorArr[0], // 更透明
  32. },
  33. {
  34. offset: 1,
  35. color: colorArr[0], // 更透明
  36. },
  37. ],
  38. };
  39. var color2 = {
  40. type: 'linear',
  41. x: 0,
  42. x2: 1,
  43. y: 0,
  44. y2: 0,
  45. colorStops: [
  46. {
  47. offset: 0,
  48. color: colorArr2[1],
  49. },
  50. {
  51. offset: 0.5,
  52. color: colorArr2[1],
  53. },
  54. {
  55. offset: 0.5,
  56. color: colorArr2[0],
  57. },
  58. {
  59. offset: 1,
  60. color: colorArr2[0],
  61. },
  62. ],
  63. };
  64. var color3 = {
  65. type: 'linear',
  66. x: 0,
  67. x2: 1,
  68. y: 0,
  69. y2: 0,
  70. colorStops: [
  71. {
  72. offset: 0,
  73. color: colorArr3[1],
  74. },
  75. {
  76. offset: 0.5,
  77. color: colorArr3[1],
  78. },
  79. {
  80. offset: 0.5,
  81. color: colorArr3[0],
  82. },
  83. {
  84. offset: 1,
  85. color: colorArr3[0],
  86. },
  87. ],
  88. };
  89. var color4 = {
  90. type: 'linear',
  91. x: 0,
  92. x2: 1,
  93. y: 0,
  94. y2: 0,
  95. colorStops: [
  96. {
  97. offset: 0,
  98. color: colorArr4[1],
  99. },
  100. {
  101. offset: 0.5,
  102. color: colorArr4[1],
  103. },
  104. {
  105. offset: 0.5,
  106. color: colorArr4[0],
  107. },
  108. {
  109. offset: 1,
  110. color: colorArr4[0],
  111. },
  112. ],
  113. };
  114. //柱子宽度
  115. var barWidth = 10;
  116. var option = {
  117. tooltip: {
  118. trigger: 'axis',
  119. axisPointer: {
  120. type: 'cross',
  121. crossStyle: {
  122. color: '#999',
  123. },
  124. },
  125. backgroundColor: 'rgba(16, 29, 66,0.8)',
  126. textStyle: {
  127. color: '#fff',
  128. },
  129. borderColor: '#63acf3',
  130. },
  131. grid: {
  132. x: '10%',
  133. x2: '15%',
  134. y: '20%',
  135. y2: '25%',
  136. },
  137. legend: {
  138. data: ['预加载', '提醒数', '互认数', '引用数', '互认率'],
  139. textStyle: {
  140. color: '#fff',
  141. },
  142. itemWidth: 6,
  143. itemHeight: 3,
  144. },
  145. xAxis: {
  146. data: xAxisData,
  147. type: 'category',
  148. axisPointer: {
  149. type: 'shadow',
  150. },
  151. //字体颜色
  152. axisLabel: {
  153. textStyle: {
  154. color: '#fff',
  155. },
  156. },
  157. axisLabel: {
  158. interval: 0,
  159. textStyle: {
  160. color: 'fff',
  161. fontWeight: 500,
  162. fontSize: '12',
  163. },
  164. },
  165. },
  166. yAxis: [
  167. {
  168. type: 'value',
  169. name: '次',
  170. nameTextStyle: {
  171. color: '#fff', // 白色
  172. },
  173. min: 0,
  174. max: maxX,
  175. interval: maxX / 5,
  176. axisLabel: {
  177. formatter: function (value) {
  178. return value / 10000 + '万';
  179. },
  180. textStyle: {
  181. color: '#fff', // 白色
  182. },
  183. },
  184. },
  185. {
  186. type: 'value',
  187. name: '',
  188. nameTextStyle: {
  189. color: '#fff', // 白色
  190. },
  191. min: 0,
  192. max: 100,
  193. interval: 20,
  194. axisLabel: {
  195. formatter: '{value} %',
  196. textStyle: {
  197. color: '#fff', // 白色
  198. },
  199. },
  200. },
  201. ],
  202. series: [
  203. {
  204. name: '预加载',
  205. type: 'bar',
  206. barWidth: barWidth,
  207. barGap: '15%',
  208. data: values[3],
  209. symbol: 'roundRect',
  210. itemStyle: {
  211. normal: {
  212. color: color,
  213. },
  214. },
  215. tooltip: {
  216. valueFormatter: function (value) {
  217. return value + ' 次';
  218. },
  219. },
  220. },
  221. {
  222. name: '提醒数',
  223. type: 'bar',
  224. barWidth: barWidth,
  225. barGap: '15%',
  226. data: values[1],
  227. symbol: 'roundRect',
  228. itemStyle: {
  229. normal: {
  230. color: color2,
  231. },
  232. },
  233. tooltip: {
  234. valueFormatter: function (value) {
  235. return value + ' 次';
  236. },
  237. },
  238. },
  239. {
  240. name: '互认数',
  241. type: 'bar',
  242. barWidth: barWidth,
  243. barGap: '15%',
  244. data: values[0],
  245. symbol: 'roundRect',
  246. itemStyle: {
  247. normal: {
  248. color: color3,
  249. },
  250. },
  251. tooltip: {
  252. valueFormatter: function (value) {
  253. return value + ' 次';
  254. },
  255. },
  256. },
  257. {
  258. name: '引用数',
  259. type: 'bar',
  260. barWidth: barWidth,
  261. barGap: '15%',
  262. data: values[2],
  263. symbol: 'roundRect',
  264. itemStyle: {
  265. normal: {
  266. color: color4,
  267. },
  268. },
  269. tooltip: {
  270. valueFormatter: function (value) {
  271. return value + ' 次';
  272. },
  273. },
  274. },
  275. {
  276. name: '互认率',
  277. type: 'line',
  278. yAxisIndex: 1,
  279. data: values[4],
  280. color: 'rgba(241, 161, 105,0.9)',
  281. tooltip: {
  282. valueFormatter: function (value) {
  283. return value + ' %';
  284. },
  285. },
  286. },
  287. ],
  288. };
  289. return option;
  290. }
  291. },

四、最终小结

比较匆忙哈,相信肯定还有好的方法,有好的方法的大佬欢迎指点迷津.

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

闽ICP备14008679号