三维柱状图
<template>
<div class="container">
<div ref="barChart" style="width: 1000px; height: 700px"></div>
</div>
</template>
<script>
export default {
mounted() {
this.createChart();
},
methods: {
createChart() {
const myChart = this.$echarts.init(this.$refs.barChart);
const offsetX = 15; //bar宽
const offsetY = 5; //倾斜角度
const CubeLeft = this.$echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
// 会canvas的应该都能看得懂,shape是从custom传入的
const xAxisPoint = shape.xAxisPoint;
const c0 = [shape.x, shape.y];
const c1 = [shape.x - offsetX, shape.y - offsetY + 10]; // 左侧面 左上点
const c2 = [xAxisPoint[0] - offsetX, xAxisPoint[1] - offsetY + 5]; // 左侧面 左下点
const c3 = [xAxisPoint[0], xAxisPoint[1] + 0]; // 左侧面 右下点
ctx
.moveTo(c0[0], c0[1])
.lineTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.closePath();
},
});
// 绘制右侧面
const CubeRight = this.$echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const xAxisPoint = shape.xAxisPoint;
const c1 = [shape.x, shape.y];
const c2 = [xAxisPoint[0], xAxisPoint[1] + 0]; //右侧面 左下点
const c3 = [xAxisPoint[0] + offsetX, xAxisPoint[1] - offsetY + 5]; //右侧面 右下点
const c4 = [shape.x + offsetX, shape.y - offsetY + 10]; //右侧面 右上点
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
},
});
// 绘制顶面
const CubeTop = this.$echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const c1 = [shape.x, shape.y + 15]; //顶部菱形下点
const c2 = [shape.x + offsetX, shape.y - offsetY + 10]; //顶部菱形右点
const c3 = [shape.x, shape.y - offsetX + 10]; //顶部菱形上点
const c4 = [shape.x - offsetX, shape.y - offsetY + 10]; //顶部菱形左点
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
},
});
// 注册三个面图形
this.$echarts.graphic.registerShape("CubeLeft", CubeLeft);
this.$echarts.graphic.registerShape("CubeRight", CubeRight);
this.$echarts.graphic.registerShape("CubeTop", CubeTop);
const MAX = [800, 800, 800, 800, 800, 800, 800];
const VALUE = [210.9, 260.8, 204.2, 504.9, 740.5, 600.3, 119.0];
const option = {
backgroundColor: "rgba(17, 42, 62, 1)", //"#012366",
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
formatter: function (params, ticket, callback) {
const item = params[1];
return item.name + " : " + item.value;
},
},
grid: {
left: 40,
right: 40,
bottom: 100,
top: 100,
containLabel: true,
},
xAxis: {
type: "category",
data: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
axisLine: {
show: true,
lineStyle: {
color: "white",
},
},
offset: 25,
axisTick: {
show: false,
length: 9,
alignWithLabel: true,
lineStyle: {
color: "#7DFFFD",
},
},
axisLabel: {
show: true,
fontSize: 16,
},
},
yAxis: {
min: 0,
// max: 1200,
// interval: 200,
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
color: "rgba(255,255,255,0.1)",
},
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
fontSize: 16,
},
boundaryGap: ["20%", "20%"],
},
series: [
{
type: "custom",
renderItem: function (params, api) {
const location = api.coord([api.value(0), api.value(1)]);
return {
type: "group",
children: [
{
type: "CubeLeft",
shape: {
api,
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: "#18385A",
},
},
{
type: "CubeRight",
shape: {
api,
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: "#33718E",
},
},
{
type: "CubeTop",
shape: {
api,
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: "#307E8E",
},
},
],
};
},
data: MAX,
},
{
type: "custom",
renderItem: (params, api) => {
const location = api.coord([api.value(0), api.value(1)]);
const isLastTwoBars =
api.value(0) === VALUE.length - 2 ||
api.value(0) === VALUE.length - 1;
var color = isLastTwoBars
? "red"
: new this.$echarts.graphic.LinearGradient(1, 1, 1, 0, [
{
offset: 0,
color: " #0097C8", // 最左边
},
{
offset: 1,
color: "#4CF0F9",
},
]);
return {
type: "group",
children: [
{
type: "CubeLeft",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: color,
},
},
{
type: "CubeRight",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: color,
},
},
{
type: "CubeTop",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: color,
},
},
],
};
},
data: VALUE,
},
{
type: "bar",
itemStyle: {
color: "transparent",
},
tooltip: {},
data: MAX,
},
],
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
},
};
</script>
上一篇
文本复制功能
文本复制功能
版权声明:《 echarts的3d柱状图(vue2) 》为胡光喆原创文章,转载请注明出处!
最后编辑:2023-11-26 03:11:42