HorizontalHistogram.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <!-- 横向柱状图 -->
  2. <template>
  3. <div class="wrap-container sn-container">
  4. <div class="sn-content">
  5. <div class="sn-title title">
  6. <div class="titleZn">{{ title }}</div>
  7. <div class="titleEn">{{ titleEn }}</div>
  8. </div>
  9. <div class="sn-body">
  10. <div class="wrap-container">
  11. <div class="chartsdom" id="Horizontal"></div>
  12. </div>
  13. </div>
  14. </div>
  15. </div>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. option: null,
  22. information: {},
  23. }
  24. },
  25. props: {
  26. barWidth: {
  27. type: Number,
  28. },
  29. area: {
  30. type: Array,
  31. },
  32. dataArray: {
  33. type: Object,
  34. },
  35. title: {
  36. type: String,
  37. default: ``,
  38. },
  39. titleEn: {
  40. type: String,
  41. default: `Tongren Tobacco Planting Digital Management Platform`,
  42. },
  43. unit: {
  44. type: String,
  45. },
  46. },
  47. mounted() {
  48. this.getEchart()
  49. },
  50. watch: {
  51. area() {
  52. this.getEchart()
  53. },
  54. },
  55. methods: {
  56. getEchart() {
  57. let myChart = echarts.init(document.getElementById(`Horizontal`))
  58. // 定义颜色数组
  59. const colorList = `#111`
  60. const colorListA = [`#40F8FF`, `#FFf`]
  61. const data = {
  62. label: this.area,
  63. value: this.dataArray.Done,
  64. value2: this.dataArray.Percentage,
  65. }
  66. this.option = {
  67. tooltip: {
  68. trigger: `axis`,
  69. backgroundColor: `rgba(21, 154, 255, 0.32)`,
  70. textStyle: {
  71. color: `#fff`,
  72. },
  73. borderColor: `#159AFF`,
  74. axisPointer: {
  75. lineStyle: {
  76. color: `transparent`,
  77. },
  78. },
  79. },
  80. grid: {
  81. containLabel: true,
  82. bottom: 20,
  83. left: 30,
  84. top: 20,
  85. right: 30,
  86. },
  87. xAxis: {
  88. type: `value`,
  89. axisLabel: {
  90. show: false,
  91. },
  92. axisLine: {
  93. show: false,
  94. },
  95. axisTick: {
  96. show: false,
  97. },
  98. splitLine: {
  99. show: false,
  100. },
  101. },
  102. yAxis: [
  103. {
  104. type: `category`,
  105. data: data.label,
  106. inverse: true,
  107. axisLabel: {
  108. margin: 10, // 刻度标签与轴线之间的距离
  109. formatter: function (value) {
  110. let k = data.label.indexOf(value)
  111. // let index = k < 9 ? "0" + (k + 1) : k + 1;
  112. let index = k < 9 ? k + 1 : k + 1
  113. return `{a|${value}}`
  114. },
  115. rich: {
  116. b: {
  117. // borderColor: "#fff",
  118. // borderWidth: 1,
  119. padding: [3, 1, 0, 1],
  120. color: `#fff`,
  121. fontSize: `80%`,
  122. },
  123. a: {
  124. fontSize: `80%`,
  125. color: `#D0DEEE`,
  126. padding: [4, 0, 0, 8],
  127. },
  128. },
  129. },
  130. axisLine: {
  131. show: false,
  132. },
  133. axisTick: {
  134. show: false,
  135. },
  136. splitLine: {
  137. show: false,
  138. },
  139. },
  140. {
  141. type: `category`,
  142. data: data.label,
  143. inverse: true,
  144. axisLabel: {
  145. margin: 15,
  146. formatter: function (value) {
  147. let k = data.label.indexOf(value)
  148. let index = k
  149. return `{a|${data.value[index]}}`
  150. },
  151. rich: {
  152. a: {
  153. fontSize: `90%`,
  154. color: `#fff`,
  155. padding: [4, 0, 0, 0],
  156. fontFamily: `DOUYU`,
  157. },
  158. },
  159. },
  160. axisLine: {
  161. show: false,
  162. },
  163. axisTick: {
  164. show: false,
  165. },
  166. splitLine: {
  167. show: false,
  168. },
  169. },
  170. {
  171. type: `category`,
  172. data: data.label,
  173. inverse: true,
  174. axisLabel: {
  175. margin: 2,
  176. formatter: function (value) {
  177. let k = data.label.indexOf(value)
  178. let index = k
  179. return `{a|${data.value2[index]} %}`
  180. },
  181. rich: {
  182. a: {
  183. fontSize: `90%`,
  184. color: `#fff`,
  185. padding: [4, 0, 0, 60],
  186. fontFamily: `DOUYU`,
  187. },
  188. },
  189. },
  190. axisLine: {
  191. show: false,
  192. },
  193. axisTick: {
  194. show: false,
  195. },
  196. splitLine: {
  197. show: false,
  198. },
  199. },
  200. ],
  201. series: [
  202. {
  203. data: data.value,
  204. type: `bar`,
  205. barWidth: 10, // 柱子宽度
  206. MaxSize: 0,
  207. showBackground: true,
  208. barBorderRadius: [30, 0, 0, 30],
  209. backgroundStyle: {
  210. color: `rgba(9, 68, 131, .2)`,
  211. },
  212. label: {
  213. show: false,
  214. offset: [60, -17],
  215. color: `#fff`,
  216. fontWeight: 500,
  217. position: `left`,
  218. align: `left`,
  219. fontSize: `80%`,
  220. formatter: function (params) {
  221. console.log(params)
  222. return params.data.name
  223. },
  224. },
  225. itemStyle: {
  226. // barBorderRadius: [3, 0, 0, 3],
  227. color: (params) => {
  228. return {
  229. type: `linear`,
  230. x: 0,
  231. y: 0,
  232. x2: 1,
  233. y2: 1,
  234. colorStops: [
  235. {
  236. offset: 0,
  237. color: colorListA[params.dataIndex <= 2 ? 0 : `1`],
  238. },
  239. {
  240. offset: 1,
  241. color: colorList,
  242. },
  243. ],
  244. }
  245. },
  246. },
  247. },
  248. {
  249. name: `外圆`,
  250. type: `scatter`,
  251. emphasis: {
  252. scale: false,
  253. },
  254. tooltip: {
  255. show: false,
  256. },
  257. symbol: `rect`,
  258. symbolSize: [3, 8], // 进度条白点
  259. itemStyle: {
  260. barBorderRadius: [30, 0, 0, 30],
  261. color: `#FFF`,
  262. shadowColor: `rgba(255, 255, 255, 0.5)`,
  263. shadowBlur: 5,
  264. borderWidth: 1,
  265. opacity: 1,
  266. },
  267. z: 2,
  268. data: data.value,
  269. animationDelay: 500,
  270. },
  271. ],
  272. }
  273. myChart.setOption(this.option, true)
  274. },
  275. },
  276. beforeDestroy() {},
  277. }
  278. </script>
  279. <style lang="scss" scoped>
  280. .sn-container {
  281. width: 401px;
  282. height: 300px;
  283. .title {
  284. display: flex;
  285. justify-content: space-between;
  286. .titleEn {
  287. width: 120px;
  288. font-size: 8px;
  289. text-align: right;
  290. word-break: break-all;
  291. line-height: 1;
  292. }
  293. }
  294. .chartsdom {
  295. width: 100%;
  296. height: 100%;
  297. }
  298. }
  299. </style>