echarts绘制一个柱状折线图

其他echarts: 

echarts绘制一个环形图

 echarts绘制一个饼图 

echarts绘制一个环形图2

效果:

代码:

<template>
  <div class="wrapper">
    <!-- 柱状图 -->
    <div v-if="type == 'new_bar'" ref="barChart" id="barChart"></div>
    <!-- 柱状图加折线图 -->
    <div v-else ref="barChart2" id="barChart2"></div>
  </div>
</template>

<script>
export default {
  mixins: [],
  components: {},
  props: {
    table: {
      type: Object,
      default: {
        datas: {},
        color: [],
      },
    },
    type: {
      type: String,
      default: "new_bar",
    },
  },
  data() {
    return {
      lineData: null,
      legendData: [], //一共有几个数据
      xAxis: {}, // X轴的显示
      yAxis: [], // Y轴的显示
      series: [],
    };
  },
  created() {},
  mounted() {},
  watch: {
    table: {
      handler(newVal) {
        if (newVal) {
          // 进行数据处理操作
          // console.log("柱状图", newVal);
          if (this.type == "new_barLine") {
            // 去重判断一共有几组数据
            this.legendData = this.$common.distinct(newVal.datas, "COL");
            this.legendData = this.legendData.map((item) => {
              return item.COL;
            });
            // 将所有数据根据col属性名相同的合并为一个新的对象
            this.lineData = this.$common.groupByProperty(newVal.datas, "COL");
            this.xAxis = [
              {
                type: "category",
                data: this.lineData[this.legendData[0]].map((item) => {
                  return item.NAME;
                }),
                axisLabel: {
                  rotate: 45, // 设置 x 轴名称逆时针旋转角度
                },
                axisPointer: {
                  type: "shadow",
                },
              },
            ];
            this.legendData.forEach((item, index) => {
              if (index > 0) {
                // 确定Y轴
                this.yAxis.push({
                  type: "value",
                  min: 0,
                  // interval: 5,
                  axisLabel: {
                    formatter: "{value}",
                  },
                });
                // 增加线
                this.series.push({
                  name: item,
                  type: "line",
                  smooth: true, //线变得有弧度
                  symbol: "none", //隐藏小圆点
                  color: newVal.color[index],
                  areaStyle: {
                    //折线图下边阴影
                    color: {
                      type: "linear",
                      x: 0,
                      y: 0,
                      x2: 0,
                      y2: 1,
                      colorStops: [
                        {
                          offset: 0,
                          color: newVal.color[index] + "4C", // 渐变起始颜色
                        },
                        {
                          offset: 1,
                          color: newVal.color[index] + "19", // 渐变结束颜色
                        },
                      ],
                    },
                  },
                  tooltip: {
                    valueFormatter: (value) => {
                      return value + "";
                    },
                  },
                  data: this.lineData[item].map((item, index) => {
                    return item.VALUE || item.NUM ? item.VALUE || item.NUM : 0;
                  }),
                });
              }
            });
          } else {
            this.xAxis = [
              {
                type: "category",
                data: this.table.datas.map((item, index) => {
                  return item.NAME;
                }),
                axisLabel: {
                  rotate: 45, // 设置 x 轴名称逆时针旋转角度
                },
                axisPointer: {
                  type: "shadow",
                },
              },
            ];
            this.yAxis.push({
              type: "value",
              min: 0,
              // interval: 5,
              axisLabel: {
                formatter: "{value}",
              },
            });
          }
          setTimeout(() => {
            this.init();
          });
        }
      },
    },
  },
  methods: {
    init() {
      let option = {
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "cross",
            crossStyle: {
              color: "#999",
            },
          },
          formatter: (params) => {
            // 如果是单一的柱状图就从空开始加等于
            let result =
              params[0].name + (this.type == "new_bar" ? "" : ":<br>");
            for (let i = 0; i < params.length; i++) {
              let seriesName = params[i].seriesName; // 获取系列名称
              let value = params[i].value; // 获取当前数据的value
              // 根据系列名称进行判断,执行不同的逻辑
              result += seriesName + ": " + (value ? value : 0) + "<br>";
            }
            return result;
          },
        },
        grid: {
          top: "30",
          left: "40", // 调整y轴距离左侧的距离
          bottom: "25%",
        },
        toolbox: {
          feature: {
            // dataView: { show: true, readOnly: false },
            // magicType: { show: true, type: ["line", "bar"] },
            // restore: { show: true },
            // saveAsImage: { show: true },
          },
        },
        legend: {
          data: this.legendData,
        },
        xAxis: this.xAxis,
        yAxis: this.yAxis,
        series: [
          {
            name: this.lineData ? this.lineData[this.legendData[0]][0].COL : "",
            type: "bar",
            color: this.table.color[0],
            label: {
              show: false, // 显示标签
              position: "top", // 标签位置
              formatter: "{c}", // 标签内容格式化
              color: "black", // 标签颜色
            },
            tooltip: {
              valueFormatter: (value) => {
                return value + "";
              },
            },
            itemStyle: {
              borderRadius: [10, 10, 0, 0],
              // color: this.table.color[0],
            },
            data: this.table.datas.map((item, index) => {
              return item.VALUE || item.NUM ? item.VALUE || item.NUM : 0;
            }),
          },
          ...this.series,
          // {
          //   name: "护士",
          //   type: "line",
          //   smooth: true, //线变得有弧度
          //   symbol: "none", //隐藏小圆点
          //   color: this.table.color[1],
          //   areaStyle: {
          //     //折线图下边阴影
          //     color: {
          //       type: "linear",
          //       x: 0,
          //       y: 0,
          //       x2: 0,
          //       y2: 1,
          //       colorStops: [
          //         {
          //           offset: 0,
          //           color: this.table.color[1] + "4C", // 渐变起始颜色
          //         },
          //         {
          //           offset: 1,
          //           color: this.table.color[1] + "19", // 渐变结束颜色
          //         },
          //       ],
          //     },
          //   },
          //   tooltip: {
          //     valueFormatter: function (value) {
          //       return value + "";
          //     },
          //   },
          //   data: [
          //     2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0,
          //     2.3,
          //   ],
          // },
          // {
          //   name: "患者",
          //   type: "line",
          //   smooth: true, //线变得有弧度
          //   symbol: "none", //隐藏小圆点
          //   color: this.table.color[2],
          //   areaStyle: {
          //     //折线图下边阴影
          //     color: {
          //       type: "linear",
          //       x: 0,
          //       y: 0,
          //       x2: 0,
          //       y2: 1,
          //       colorStops: [
          //         {
          //           offset: 0,
          //           color: this.table.color[2] + "4C", // 渐变起始颜色
          //         },
          //         {
          //           offset: 1,
          //           color: this.table.color[2] + "19", // 渐变结束颜色
          //         },
          //       ],
          //     },
          //   },
          //   tooltip: {
          //     valueFormatter: function (value) {
          //       return value + " °C";
          //     },
          //   },
          //   data: [
          //     2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2,
          //   ],
          // },
        ],
      };
      let chartDom =
        this.$refs[this.type == "new_bar" ? "barChart" : "barChart2"];
      let myChart = this.$E.init(chartDom);
      myChart.setOption(option);
      myChart.on("click", function (params) {
        console.log(params.seriesIndex);
        if (params.componentType === "series") {
          var dataIndex = params.dataIndex; // 获取点击的数据索引
          var data = option.series[params.seriesIndex].data[dataIndex]; // 获取点击的数据对象
          console.log(data);
        }
      });
    },
  },
};
</script>
<style scoped lang="scss">
.wrapper {
  width: 100%;
  height: 100%;
  position: relative;
  #barChart,
  #barChart2 {
    width: 100%;
    height: 100%;
  }
}
</style>

调用:

<NewBarChart
  :table="table"
  :style="{ height: heightNew }"
  :type="style[0]"
/>
// heightNew : 动态计算的高度
// new_bar : new_bar / new_barLine
// table:
/**
 * {
  "color": [
    "#5470c6",
    "#91cc75",
    "#fac858",
    "#ee6666",
    "#73c0de",
    "#3ba272",
    "#fc8452",
    "#9a60b4",
    "#ea7ccc",
    "#8364FF",
    "#36F4D7",
    "#FBB03C"
  ],
  "datas": [
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "47病区(骨科)",
      "VALUE": 24
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "59病区(全科医学科)",
      "VALUE": 11
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "45病区(神外、眼科)",
      "VALUE": 30
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "40病区(泌尿外、肾内科)",
      "VALUE": 26
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "38病区(普外科)",
      "VALUE": 29
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "46病区(心胸外、介入科)",
      "VALUE": 28
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "52病区(康复科)",
      "VALUE": 29
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "31病区(产科)",
      "VALUE": 49
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "37病区(骨科)",
      "VALUE": 24
    },
    {
      "COL": "护士",
      "PXXH": 2,
      "NAME": "35病区(妇科、眼科)",
      "VALUE": 22
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "47病区(骨科)",
      "VALUE": 42
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "59病区(全科医学科)",
      "VALUE": 26
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "45病区(神外、眼科)",
      "VALUE": 50
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "40病区(泌尿外、肾内科)",
      "VALUE": 50
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "46病区(心胸外、介入科)",
      "VALUE": 50
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "38病区(普外科)",
      "VALUE": 50
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "52病区(康复科)",
      "VALUE": 44
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "31病区(产科)",
      "VALUE": 40
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "37病区(骨科)",
      "VALUE": 42
    },
    {
      "COL": "床位",
      "PXXH": 1,
      "NAME": "35病区(妇科、眼科)",
      "VALUE": 50
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "47病区(骨科)",
      "VALUE": 72
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "59病区(全科医学科)",
      "VALUE": 28
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "45病区(神外、眼科)",
      "VALUE": 51
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "40病区(泌尿外、肾内科)",
      "VALUE": 120
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "46病区(心胸外、介入科)",
      "VALUE": 69
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "38病区(普外科)",
      "VALUE": 91
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "52病区(康复科)",
      "VALUE": 48
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "31病区(产科)",
      "VALUE": 148
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "37病区(骨科)",
      "VALUE": 73
    },
    {
      "COL": "患者",
      "PXXH": 3,
      "NAME": "35病区(妇科、眼科)",
      "VALUE": 147
    }
  ]
}
 */

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值