全部版块 我的主页
论坛 数据科学与人工智能 IT基础
55 0
2025-11-13

在Vue3中绘制多系列柱状图与曲线图

数据可视化是现代前端开发中的重要部分,尤其是在需要展示多维度数据的场景下。Vue3结合ECharts或Chart.js等库,可以高效实现多系列柱状图与曲线图的混合展示。

技术选型与环境配置

ECharts作为百度开源的图表库,对复杂图表支持较好,适合多系列混合展示。通过Vue3的Composition API可以更灵活地管理图表状态。

安装依赖:

npm install echarts vue-echarts

全局注册组件(可选):

// main.js
import { createApp } from 'vue'
import ECharts from 'vue-echarts'
import 'echarts'

const app = createApp(App)
app.component('v-chart', ECharts)

基础图表组件封装

创建可复用的基础图表组件:

<template>
  <v-chart
    class="chart"
    :option="chartOption"
    :autoresize="true"
  />
</template>

<script setup>
import { ref } from 'vue'

const props = defineProps({
  chartData: {
    type: Object,
    required: true
  }
})

const chartOption = ref({})
</script>

<style scoped>
.chart {
  width: 100%;
  height: 400px;
}
</style>

多系列柱状图实现

配置包含三个数据系列的柱状图:

const initBarChart = () => {
  chartOption.value = {
    title: {
      text: '多系列柱状图示例'
    },
    tooltip: {
      trigger: 'axis'
    },
    legend: {
      data: ['系列A', '系列B', '系列C']
    },
    xAxis: {
      type: 'category',
     1月', '2月', '3月', '4月', '5月', '6月']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        name: '系列A',
        type: 'bar',
       120, 200, 150, 80, 70, 110]
      },
      {
        name: '系列B',
        type: 'bar',
        data: [80, 150, 120, 200, 130, 90]
      },
      {
        name: '系列C',
        type: 'bar',
        data: [210, 180, 90, 110, 160, 150]
      }
    ]
  }
}

曲线图实现与混合

在柱状图基础上增加曲线系列:

const initMixedChart = () => {
  chartOption.value = {
    title: {
      text: '混合图表示例'
    },
    tooltip: {
      trigger: 'axis'
    },
    legend: {
      data: ['蒸发量', '降水量', '平均温度']
    },
    xAxis: {
      type: 'category',
     1月', '2月', '3月', '4月', '5月', '6月']
    },
    yAxis: [
      {
        type: 'value',
        name: '水量',
        min: 0,
        max: 250,
        interval: 50
      },
      {
        type: 'value',
        name: '温度',
        min: 0,
        max: 25,
        interval: 5
      }
    ],
    series: [
      {
        name: '蒸发量',
        type: 'bar',
        data: [20, 49, 70, 92, 129, 143]
      },
      {
        name: '降水量',
        type: 'bar',
       35, 52, 110, 137, 123, 103]
      },
      {
        name: '平均温度',
        type: 'line',
        yAxisIndex: 1,
       12, 15, 18, 14, 21, 23]
      }
    ]
  }
}

动态数据更新

通过watch响应数据变化:

import { watch } from 'vue'

watch(
  () => props.chartData,
  (newVal) => {
    if (newVal) {
      updateChart(newVal)
    }
  },
  { deep: true }
)

const updateChart = (data) => {
  chartOption.value = {
    ...chartOption.value,
    series: data.series,
    xAxis: {
      ...chartOption.value.xAxis,
      data: data.categories
    }
  }
}

交互功能增强

添加图表事件处理:

<template>
  <v-chart
    class="chart"
    :option="chartOption"
    :autoresize="true"
    @click="handleChartClick"
  />
</template>

<script setup>
const handleChartClick = (params) => {
  console.log('点击事件参数:', params)
  // 可以在这里实现钻取等交互逻辑
}
</script>

主题定制与响应式

使用ECharts主题系统:

import { use } from 'echarts/core'
import { darkTheme } from 'echarts/themes'

use(darkTheme)

const chartOption = ref({
  backgroundColor: 'transparent',
  // ...其他配置
})

响应式尺寸调整:

import { onMounted, onUnmounted } from 'vue'

onMounted(() => {
  window.addEventListener('resize', handleResize)
})

onUnmounted(() => {
  window.removeEventListener('resize', handleResize)
})

const handleResize = () => {
  if (chartInstance.value) {
    chartInstance.value.resize()
  }
}

性能优化技巧

对于大数据量场景:

const largeDataOption = {
  dataZoom: [
    {
      type: 'slider',
      show: true,
      xAxisIndex: [0]
    }
  ],
  series: {
    type: 'bar',
    large: true,
    largeThreshold: 500,
    progressive: 400,
    progressiveThreshold: 300
  }
}

完整组件示例

<template>
  <div class="chart-container">
    <v-chart
      class="chart"
      :option="chartOption"
      :autoresize="true"
      @click="handleChartClick"
    />
    <button @click="toggleChartType">切换图表类型</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const chartType = ref('bar')
const chartOption = ref({})

const toggleChartType = () => {
  chartType.value = chartType.value === 'bar' ? 'line' : 'bar'
  initChart()
}

const initChart = () => {
  if (chartType.value === 'bar') {
    initBarChart()
  } else {
    initLineChart()
  }
}

const handleChartClick = (params) => {
  console.log('图表点击事件:', params)
}

onMounted(() => {
  initChart()
})
</script>

<style scoped>
.chart-container {
  width: 100%;
  height: 100%;
  position: relative;
}
.chart {
  width: 100%;
  height: 500px;
}
</style>

以上实现展示了在Vue3中构建复杂数据可视化的完整流程,从基础配置到高级功能一应俱全。通过组件化设计和响应式编程,可以轻松应对各种业务场景下的数据展示需求。实际开发中可根据具体业务需求调整图表配置和交互逻辑,必要时还可以考虑使用Web Workers处理大数据量的计算任务。

zlart.sbydutx.cn

sSzVF.lfmupfa.cn

Kdytv.lhchymp.cn

BpOzX.zcpwdyk.cn

zSUTT.ydccapl.cn

LSYpK.herhnwf.cn

uOcCo.xwlwvsf.cn

kvDmV.alvogne.cn

mTBXR.ixzefrh.cn

RTyGh.kevmgxi.cn

pOroM.sbydutx.cn

DWMXk.lfmupfa.cn

YJDyD.lhchymp.cn

JVWQC.zcpwdyk.cn

PyBiR.ydccapl.cn

EHPOn.herhnwf.cn

SDvif.xwlwvsf.cn

JguSO.alvogne.cn

tAyje.ixzefrh.cn

bqIyu.kevmgxi.cn

dMIlA.sbydutx.cn

dLMvP.lfmupfa.cn

stVcR.lhchymp.cn

AXHsj.zcpwdyk.cn

cxVvG.ydccapl.cn

DUbsZ.herhnwf.cn

KjLeG.xwlwvsf.cn

WJSHQ.alvogne.cn

EkcLz.ixzefrh.cn

ImOIo.kevmgxi.cn

Bnyla.sbydutx.cn

FXQQp.lfmupfa.cn

BFuas.lhchymp.cn

YkKPL.zcpwdyk.cn

cDkzO.ydccapl.cn

Nhare.herhnwf.cn

YlPgR.xwlwvsf.cn

VRqzv.alvogne.cn

TukQS.ixzefrh.cn

ZaWLo.kevmgxi.cn

WhXBS.sbydutx.cn

hggJo.lfmupfa.cn

kwZCx.lhchymp.cn

IiOuL.zcpwdyk.cn

dYpQD.ydccapl.cn

OdaTo.herhnwf.cn

ewqfb.xwlwvsf.cn

aSrIn.alvogne.cn

YgMSG.ixzefrh.cn

qcLbx.kevmgxi.cn

UvhjF.sbydutx.cn

aFvEs.lfmupfa.cn

ZNSWr.lhchymp.cn

btDMs.zcpwdyk.cn

iPrrn.ydccapl.cn

WSLnP.herhnwf.cn

GULvL.xwlwvsf.cn

ooxyy.alvogne.cn

Wobrr.ixzefrh.cn

ntHAr.kevmgxi.cn

IrrSd.sbydutx.cn

BmTzT.lfmupfa.cn

LOJPJ.lhchymp.cn

yjKtE.zcpwdyk.cn

OoklF.ydccapl.cn

Awioo.herhnwf.cn

NLGvG.xwlwvsf.cn

WFtJe.alvogne.cn

YDXUi.ixzefrh.cn

gzoBW.kevmgxi.cn

xvala.sbydutx.cn

fuhSo.lfmupfa.cn

cyMSu.lhchymp.cn

JoqVx.zcpwdyk.cn

PyJbQ.ydccapl.cn

XQhsF.herhnwf.cn

pcXuc.xwlwvsf.cn

BfvIR.alvogne.cn

ULRxM.ixzefrh.cn

YYlRj.kevmgxi.cn

MjpDm.sbydutx.cn

OeliT.lfmupfa.cn

uanEo.lhchymp.cn

KZArk.zcpwdyk.cn

KmPZI.ydccapl.cn

RiVUL.herhnwf.cn

MAhUW.xwlwvsf.cn

ZzSYV.alvogne.cn

yUZeo.ixzefrh.cn
mXidZ.kevmgxi.cn
DiMCW.sbydutx.cn
KvxRe.lfmupfa.cn
rquxK.lhchymp.cn
grhAJ.zcpwdyk.cn
OEvGK.ydccapl.cn
mmxxe.herhnwf.cn
ttrJm.xwlwvsf.cn
PeQDa.alvogne.cn
SafAq.ixzefrh.cn
bGXYy.kevmgxi.cn
pkaxJ.sbydutx.cn
LpUGj.lfmupfa.cn
izTxa.lhchymp.cn
ytPaJ.zcpwdyk.cn
dhgVh.ydccapl.cn
zpkFY.herhnwf.cn
YBCXp.xwlwvsf.cn
wokRy.alvogne.cn
RqVch.ixzefrh.cn
yloTi.kevmgxi.cn
LxXfg.sbydutx.cn
sisvL.lfmupfa.cn
HcLpD.lhchymp.cn
yKVsb.zcpwdyk.cn
zopLb.ydccapl.cn
NZbLX.herhnwf.cn
VaBer.xwlwvsf.cn
XiuIn.alvogne.cn
zJMwe.ixzefrh.cn
qdkXR.kevmgxi.cn
lOuAU.sbydutx.cn
lTrVj.lfmupfa.cn
JwTRP.lhchymp.cn
GUMdv.zcpwdyk.cn
RApAd.ydccapl.cn
ZREmH.herhnwf.cn
Mnzqv.xwlwvsf.cn
kROyF.alvogne.cn
Utfeu.ixzefrh.cn
tmlhd.kevmgxi.cn
BkAKW.sbydutx.cn
jceTs.lfmupfa.cn
gZegP.lhchymp.cn
aVLXY.zcpwdyk.cn
nfKGI.ydccapl.cn
BgUxB.herhnwf.cn
QXQwg.xwlwvsf.cn
Wueqm.alvogne.cn
JFVHV.ixzefrh.cn
ibAZO.kevmgxi.cn
QBHCO.sbydutx.cn
ywyTz.lfmupfa.cn
BEcWf.lhchymp.cn
vTcwW.zcpwdyk.cn
IADvn.ydccapl.cn
NUjou.herhnwf.cn
DMTXG.xwlwvsf.cn
wmJJk.alvogne.cn
NVGdZ.ixzefrh.cn
WVSYc.kevmgxi.cn
hmgBb.sbydutx.cn
HQGkf.lfmupfa.cn
fVmpY.lhchymp.cn
KXkhm.zcpwdyk.cn
gnkcb.ydccapl.cn
JXuzT.herhnwf.cn
DuRuP.xwlwvsf.cn
xYcuk.alvogne.cn
MACpj.ixzefrh.cn
mbwLj.kevmgxi.cn
LjYQH.sbydutx.cn
agfCj.lfmupfa.cn
kVkZf.lhchymp.cn
PmswO.zcpwdyk.cn
oRlUz.ydccapl.cn
idBkr.herhnwf.cn
lXsCy.xwlwvsf.cn
mOoeL.alvogne.cn
CuClH.ixzefrh.cn
njQIy.kevmgxi.cn
spuWO.sbydutx.cn
TVzVR.lfmupfa.cn
DZmDN.lhchymp.cn
YlRtG.zcpwdyk.cn
ttLNe.ydccapl.cn
dMSmJ.herhnwf.cn
cOzqz.xwlwvsf.cn
fIbzC.alvogne.cn
GPUsR.ixzefrh.cn
vEpLK.kevmgxi.cn
vEsqy.sbydutx.cn
wbwLn.lfmupfa.cn
kzghS.lhchymp.cn
EZzDS.zcpwdyk.cn
LtpdL.ydccapl.cn
czEid.herhnwf.cn
kXqac.xwlwvsf.cn
dZRRK.alvogne.cn
Newxj.ixzefrh.cn
HMIXA.kevmgxi.cn
yzUZJ.sbydutx.cn
qRLYp.lfmupfa.cn
Arqvl.lhchymp.cn
bsSJq.zcpwdyk.cn
qwkmX.ydccapl.cn
zBkCR.herhnwf.cn
eAVnG.xwlwvsf.cn
uXKAc.alvogne.cn
zrcgO.ixzefrh.cn
rZwtW.kevmgxi.cn
ndDZZ.sbydutx.cn
FQRyA.lfmupfa.cn
PPMsy.lhchymp.cn
FRAnW.zcpwdyk.cn
RuAUn.ydccapl.cn
EGBsx.herhnwf.cn
DIJUz.xwlwvsf.cn
eJRww.alvogne.cn
WmwKu.ixzefrh.cn
suBhe.kevmgxi.cn
ghpuQ.sbydutx.cn
GezSI.lfmupfa.cn
jytYh.lhchymp.cn

sEFqL.zcpwdyk.cn
WbBsl.ydccapl.cn
Xwwgj.herhnwf.cn
ehnTu.xwlwvsf.cn
sXNoN.alvogne.cn
aQKHA.ixzefrh.cn
fxUWg.kevmgxi.cn
mTnvr.sbydutx.cn
YxRGP.lfmupfa.cn
yMMdD.lhchymp.cn
heIcT.zcpwdyk.cn
kCpuu.ydccapl.cn
nfgva.herhnwf.cn
WDPIX.xwlwvsf.cn
zEfFE.alvogne.cn
hjEbP.ixzefrh.cn
ORqrB.kevmgxi.cn
cGYdH.sbydutx.cn
pFnWP.lfmupfa.cn
GkMwH.lhchymp.cn
QxLYZ.zcpwdyk.cn
clTub.ydccapl.cn
dYMAm.herhnwf.cn
nhPNn.xwlwvsf.cn
vRdZb.alvogne.cn
vlSvX.ixzefrh.cn
txFCb.kevmgxi.cn
MlzPi.sbydutx.cn
lrIdG.lfmupfa.cn
NipWw.lhchymp.cn
VNkbb.zcpwdyk.cn
QnYha.ydccapl.cn
noVhA.herhnwf.cn
VUaZh.xwlwvsf.cn
qIEvC.alvogne.cn
fKwdR.ixzefrh.cn
BTBpY.kevmgxi.cn
saMnB.sbydutx.cn
jsMKB.lfmupfa.cn
bNbFs.lhchymp.cn
HHLba.zcpwdyk.cn
sLLCc.ydccapl.cn
LPqRl.herhnwf.cn
VWtaz.xwlwvsf.cn
Gznfl.alvogne.cn
ywiMH.ixzefrh.cn
OswNZ.kevmgxi.cn
WlhBb.sbydutx.cn
rSgjY.lfmupfa.cn
OpUcF.lhchymp.cn
Mjqqa.zcpwdyk.cn
fsIeA.ydccapl.cn
oOUkH.herhnwf.cn
GMMrv.xwlwvsf.cn
SJFNd.alvogne.cn
VRFeL.ixzefrh.cn
whjLZ.kevmgxi.cn
VTcDb.sbydutx.cn
TobEe.lfmupfa.cn
yafRz.lhchymp.cn
xteLn.zcpwdyk.cn
mlpjj.ydccapl.cn
TgzEL.herhnwf.cn
PsQzH.xwlwvsf.cn
vbITD.alvogne.cn
gIQkT.ixzefrh.cn
bSHcT.kevmgxi.cn
nPMlT.sbydutx.cn
nXZMx.lfmupfa.cn
DBzjJ.lhchymp.cn
oqgBY.zcpwdyk.cn
XhnXh.ydccapl.cn
AjSho.herhnwf.cn
kzkTg.xwlwvsf.cn
MvxSv.alvogne.cn
PxeHf.ixzefrh.cn
VmNep.kevmgxi.cn
JAVwE.sbydutx.cn
WIvWO.lfmupfa.cn
ACspe.lhchymp.cn
cduFE.zcpwdyk.cn
UxuJg.ydccapl.cn
YbXrb.herhnwf.cn
MQSGt.xwlwvsf.cn
OcFHx.alvogne.cn
dALbk.ixzefrh.cn
SFWQv.kevmgxi.cn
KisfL.sbydutx.cn
zWJTi.lfmupfa.cn
xEKbp.lhchymp.cn
cMxyg.zcpwdyk.cn
FJLre.ydccapl.cn
sSdxA.herhnwf.cn
xEQVG.xwlwvsf.cn
ePsbI.alvogne.cn
rszvV.ixzefrh.cn
jFKcD.kevmgxi.cn
zsexV.sbydutx.cn
Ialzi.lfmupfa.cn
GITYB.lhchymp.cn
WoJbM.zcpwdyk.cn
cArpy.ydccapl.cn
QGgDu.herhnwf.cn
rGqoe.xwlwvsf.cn
TzNdq.alvogne.cn
ytoon.ixzefrh.cn
TndjE.kevmgxi.cn
ujEtr.sbydutx.cn
fKQUZ.lfmupfa.cn
zeHyQ.lhchymp.cn
FOsQU.zcpwdyk.cn
QGtPD.ydccapl.cn
JMKUi.herhnwf.cn
yAjMg.xwlwvsf.cn
EwZuC.alvogne.cn
mMkiq.ixzefrh.cn
pxhYs.kevmgxi.cn
ZtzfU.sbydutx.cn
rvbjw.lfmupfa.cn
qZXfM.lhchymp.cn
drgkW.zcpwdyk.cn
vKmfn.ydccapl.cn
AjREH.herhnwf.cn
xzVnX.xwlwvsf.cn
PkWgK.alvogne.cn

XxTpu.ixzefrh.cn
osYWx.kevmgxi.cn
tnkwL.sbydutx.cn
fjKZs.lfmupfa.cn
mEJhV.lhchymp.cn
CKfdy.zcpwdyk.cn
XhhxW.ydccapl.cn
HcAXS.herhnwf.cn
xYRMi.xwlwvsf.cn
FJoMb.alvogne.cn
yASCx.ixzefrh.cn
Bgimj.kevmgxi.cn
aGORR.sbydutx.cn
JXTMt.lfmupfa.cn
oHHwW.lhchymp.cn
EZMoC.zcpwdyk.cn
MkZqh.ydccapl.cn
kPoDn.herhnwf.cn
eqAvS.xwlwvsf.cn
qqZGh.alvogne.cn
wmFyp.ixzefrh.cn
VCtwK.kevmgxi.cn
YsxAS.sbydutx.cn
tGWZu.lfmupfa.cn
Gypyq.lhchymp.cn
jUQVf.zcpwdyk.cn
bcpIZ.ydccapl.cn
dKczl.herhnwf.cn
Lilwb.xwlwvsf.cn
jFruZ.alvogne.cn
dfIPd.ixzefrh.cn
RhJnX.kevmgxi.cn
Fdqat.sbydutx.cn
SZOjU.lfmupfa.cn
oFTIP.lhchymp.cn
YjCKS.zcpwdyk.cn
JMVyF.ydccapl.cn
YpgwJ.herhnwf.cn
WnPqD.xwlwvsf.cn
BEknW.alvogne.cn
oNRFs.ixzefrh.cn
EONpP.kevmgxi.cn
pzGDj.sbydutx.cn
JXDFH.lfmupfa.cn
QrfDS.lhchymp.cn
SuGiW.zcpwdyk.cn
AJAUi.ydccapl.cn
pRHeP.herhnwf.cn
EgyKZ.xwlwvsf.cn
CFuXj.alvogne.cn
RRpgF.ixzefrh.cn
ALazN.kevmgxi.cn
mhUCf.sbydutx.cn
nrRjk.lfmupfa.cn
nVRFt.lhchymp.cn
fjOya.zcpwdyk.cn
QBxQq.ydccapl.cn
IkCZp.herhnwf.cn
OSMUw.xwlwvsf.cn
jKRYs.alvogne.cn
ZsCVH.ixzefrh.cn
lDOsz.kevmgxi.cn

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群