3d饼图lll

This commit is contained in:
lll 2023-11-27 11:22:29 +08:00
parent 8dcfbed942
commit 983f19f75d
5 changed files with 490 additions and 1 deletions

11
package-lock.json generated
View File

@ -13,6 +13,7 @@
"echarts-gl": "^2.0.9",
"element": "^0.1.4",
"element-ui": "^2.15.14",
"highcharts": "^11.2.0",
"postcss-pxtorem": "^6.0.0",
"register-service-worker": "^1.7.2",
"ui": "^0.2.4",
@ -7012,6 +7013,11 @@
"he": "bin/he"
}
},
"node_modules/highcharts": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-11.2.0.tgz",
"integrity": "sha512-9i650YK7ZBA1Mgtr3avMkLVCAI45RQvYnwi+eHsdFSaBGuQN6BHoa4j4lMkSJLv0V4LISTK1z7J7G82Lzd7zwg=="
},
"node_modules/highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",
@ -18384,6 +18390,11 @@
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true
},
"highcharts": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-11.2.0.tgz",
"integrity": "sha512-9i650YK7ZBA1Mgtr3avMkLVCAI45RQvYnwi+eHsdFSaBGuQN6BHoa4j4lMkSJLv0V4LISTK1z7J7G82Lzd7zwg=="
},
"highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",

View File

@ -12,6 +12,7 @@
"echarts-gl": "^2.0.9",
"element": "^0.1.4",
"element-ui": "^2.15.14",
"highcharts": "^11.2.0",
"postcss-pxtorem": "^6.0.0",
"register-service-worker": "^1.7.2",
"ui": "^0.2.4",

BIN
src/assets/img/底盘.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@ -10,6 +10,7 @@ import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
// 全局引入Echarts;
import * as echarts from "echarts";
import "echarts-gl";
// 然后挂载在vue原型上;
Vue.prototype.$echarts = echarts;

View File

@ -128,7 +128,9 @@
<p>负荷占比</p>
</div>
<div class="chartBox">
<div id="pdsjk"></div>
<div id="fhzb"></div>
<!-- 饼图下面的底座 -->
<div class="buttomCharts"></div>
</div>
</div>
<div class="pdsjk">
@ -172,6 +174,7 @@
</template>
<script>
import * as echarts from "echarts";
import highcharts from "highcharts";
export default {
data() {
return {
@ -427,6 +430,31 @@ export default {
date2: "12.22",
},
],
optionData: [
{
name: "破碎系统",
value: 38,
itemStyle: {
color: "rgba(1, 224, 239,0.9)",
},
},
{
name: "生料系统", //
value: 41, //
itemStyle: {
//
color: "rgba(26, 166, 228,0.9)",
},
},
{
name: "水泥磨系统",
value: 21,
itemStyle: {
color: "rgba(81, 244, 193,0.9)",
},
},
],
option: {},
};
},
watch: {
@ -808,16 +836,460 @@ export default {
this.defineEcharts("pdsydl", option);
},
//
init() {
//3d
let myChart = this.$echarts.init(document.getElementById("fhzb"));
// option ; getPie3D(01)
this.option = this.getPie3D(this.optionData, 0.5);
//
myChart.setOption(this.option);
//
this.bindListen(myChart);
},
// pieData internalDiameterRatio:
getPie3D(pieData, internalDiameterRatio) {
let that = this;
let series = [];
let sumValue = 0;
let startValue = 0;
let endValue = 0;
let legendData = [];
let legendBfb = [];
let k = 1 - internalDiameterRatio;
pieData.sort((a, b) => {
return b.value - a.value;
});
// series-surface()
for (let i = 0; i < pieData.length; i++) {
sumValue += pieData[i].value;
let seriesItem = {
//
name:
typeof pieData[i].name === "undefined"
? `series${i}`
: pieData[i].name,
type: "surface",
//
parametric: true,
//线
wireframe: {
show: false,
},
pieData: pieData[i],
pieStatus: {
selected: false,
hovered: false,
k: k,
},
//()
center: ["80%", "100%"],
radius: "60%",
};
//
if (typeof pieData[i].itemStyle != "undefined") {
let itemStyle = {};
typeof pieData[i].itemStyle.color != "undefined"
? (itemStyle.color = pieData[i].itemStyle.color)
: null;
typeof pieData[i].itemStyle.opacity != "undefined"
? (itemStyle.opacity = pieData[i].itemStyle.opacity)
: null;
seriesItem.itemStyle = itemStyle;
}
series.push(seriesItem);
}
// 使 sumValue getParametricEquation
// series-surface series-surface.parametricEquation
legendData = [];
legendBfb = [];
for (let i = 0; i < series.length; i++) {
endValue = startValue + series[i].pieData.value;
series[i].pieData.startRatio = startValue / sumValue;
series[i].pieData.endRatio = endValue / sumValue;
series[i].parametricEquation = that.getParametricEquation(
series[i].pieData.startRatio,
series[i].pieData.endRatio,
false,
false,
k,
series[i].pieData.value
);
// series[i].itemStyle.normal.label = {
// show: true,
// position: "outside",
// color: "#ddd",
// formatter: function (params) {
// var percent = 0;
// var total = 0;
// for (var i = 0; i < trafficWay.length; i++) {
// total += trafficWay[i].value;
// }
// percent = ((params.value / total) * 100).toFixed(0);
// if (params.name !== "") {
// return (
// "" +
// params.name +
// "\n" +
// "\n" +
// "" +
// percent +
// "%"
// );
// } else {
// return "";
// }
// },
// };
startValue = endValue;
let bfb = that.fomatFloat(series[i].pieData.value / sumValue, 4);
legendData.push({
name: series[i].name,
value: bfb,
});
legendBfb.push({
name: series[i].name,
value: bfb,
});
}
//()
let boxHeight = this.getHeight3D(series, 20); //3d/
// legendDataseries
let option = {
//( )
tooltip: {
formatter: (params) => {
if (
params.seriesName !== "mouseoutSeries" &&
params.seriesName !== "pie2d"
) {
let bfb = (
(this.option.series[params.seriesIndex].pieData.endRatio -
this.option.series[params.seriesIndex].pieData.startRatio) *
100
).toFixed(2);
return (
`${params.seriesName}<br/>` +
`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;"></span>` +
`${bfb}%`
);
}
},
},
labelLine: {
normal: {
show: true,
lineStyle: {
color: "#7BC0CB",
},
length: 0,
length2: 10,
},
},
label: {
normal: {
show: true,
position: "outside",
formatter: "{b} \n{c} {d}%",
},
},
//
xAxis3D: {
min: -1,
max: 1,
},
yAxis3D: {
min: -1,
max: 1,
},
zAxis3D: {
min: -1,
max: 1,
},
//
grid3D: {
show: false,
boxHeight: boxHeight, //
//
top: "-20.5%",
left: "-4%",
viewControl: {
//3d
alpha: 25, //( )
distance: 160, //zoom()
rotateSensitivity: 0, //0
zoomSensitivity: 0, //0
panSensitivity: 0, //0
autoRotate: false, //
},
},
series: series,
};
return option;
},
//3d
getHeight3D(series, height) {
series.sort((a, b) => {
return b.pieData.value - a.pieData.value;
});
return (height * 25) / series[0].pieData.value;
},
// series-surface.parametricEquation
getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
//
let midRatio = (startRatio + endRatio) / 2;
let startRadian = startRatio * Math.PI * 2;
let endRadian = endRatio * Math.PI * 2;
let midRadian = midRatio * Math.PI * 2;
//
if (startRatio === 0 && endRatio === 1) {
isSelected = false;
}
// / k 1/3
k = typeof k !== "undefined" ? k : 1 / 3;
// x y 0
let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
// 1
let hoverRate = isHovered ? 1.05 : 1;
//
return {
u: {
min: -Math.PI,
max: Math.PI * 3,
step: Math.PI / 32,
},
v: {
min: 0,
max: Math.PI * 2,
step: Math.PI / 20,
},
x: function (u, v) {
if (u < startRadian) {
return (
offsetX +
Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
);
}
if (u > endRadian) {
return (
offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
);
}
return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
},
y: function (u, v) {
if (u < startRadian) {
return (
offsetY +
Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
);
}
if (u > endRadian) {
return (
offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
);
}
return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
},
z: function (u, v) {
if (u < -Math.PI * 0.5) {
return Math.sin(u);
}
if (u > Math.PI * 2.5) {
return Math.sin(u) * h * 0.1;
}
return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
},
};
},
//
bindListen(myChart) {
let that = this;
let selectedIndex = "";
let hoveredIndex = "";
//
myChart.on("click", function (params) {
// option.series
let isSelected =
!that.option.series[params.seriesIndex].pieStatus.selected;
let isHovered =
that.option.series[params.seriesIndex].pieStatus.hovered;
let k = that.option.series[params.seriesIndex].pieStatus.k;
let startRatio =
that.option.series[params.seriesIndex].pieData.startRatio;
let endRatio = that.option.series[params.seriesIndex].pieData.endRatio;
// option
if (selectedIndex !== "" && selectedIndex !== params.seriesIndex) {
that.option.series[selectedIndex].parametricEquation =
that.getParametricEquation(
that.option.series[selectedIndex].pieData.startRatio,
that.option.series[selectedIndex].pieData.endRatio,
false,
false,
k,
that.option.series[selectedIndex].pieData.value
);
that.option.series[selectedIndex].pieStatus.selected = false;
}
// / option
that.option.series[params.seriesIndex].parametricEquation =
that.getParametricEquation(
startRatio,
endRatio,
isSelected,
isHovered,
k,
that.option.series[params.seriesIndex].pieData.value
);
that.option.series[params.seriesIndex].pieStatus.selected = isSelected;
// seriesIndex
isSelected ? (selectedIndex = params.seriesIndex) : null;
// 使 option
myChart.setOption(that.option);
});
// mouseover
myChart.on("mouseover", function (params) {
//
let isSelected;
let isHovered;
let startRatio;
let endRatio;
let k;
// mouseover
if (hoveredIndex === params.seriesIndex) {
return;
//
} else {
// option
if (hoveredIndex !== "") {
// option.series false
isSelected = that.option.series[hoveredIndex].pieStatus.selected;
isHovered = false;
startRatio = that.option.series[hoveredIndex].pieData.startRatio;
endRatio = that.option.series[hoveredIndex].pieData.endRatio;
k = that.option.series[hoveredIndex].pieStatus.k;
// option
that.option.series[hoveredIndex].parametricEquation =
that.getParametricEquation(
startRatio,
endRatio,
isSelected,
isHovered,
k,
that.option.series[hoveredIndex].pieData.value
);
that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
// seriesIndex
hoveredIndex = "";
}
// mouseover option
if (
params.seriesName !== "mouseoutSeries" &&
params.seriesName !== "pie2d"
) {
// option.series true
isSelected =
that.option.series[params.seriesIndex].pieStatus.selected;
isHovered = true;
startRatio =
that.option.series[params.seriesIndex].pieData.startRatio;
endRatio = that.option.series[params.seriesIndex].pieData.endRatio;
k = that.option.series[params.seriesIndex].pieStatus.k;
// option
that.option.series[params.seriesIndex].parametricEquation =
that.getParametricEquation(
startRatio,
endRatio,
isSelected,
isHovered,
k,
that.option.series[params.seriesIndex].pieData.value + 5
);
that.option.series[params.seriesIndex].pieStatus.hovered =
isHovered;
// seriesIndex
hoveredIndex = params.seriesIndex;
}
// 使 option
myChart.setOption(that.option);
}
});
// bug
myChart.on("globalout", function () {
//
let isSelected;
let isHovered;
let startRatio;
let endRatio;
let k;
if (hoveredIndex !== "") {
// option.series true
isSelected = that.option.series[hoveredIndex].pieStatus.selected;
isHovered = false;
k = that.option.series[hoveredIndex].pieStatus.k;
startRatio = that.option.series[hoveredIndex].pieData.startRatio;
endRatio = that.option.series[hoveredIndex].pieData.endRatio;
// option
that.option.series[hoveredIndex].parametricEquation =
that.getParametricEquation(
startRatio,
endRatio,
isSelected,
isHovered,
k,
that.option.series[hoveredIndex].pieData.value
);
that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
// seriesIndex
hoveredIndex = "";
}
// 使 option
myChart.setOption(that.option);
});
},
//
fomatFloat(num, n) {
var f = parseFloat(num);
if (isNaN(f)) {
return false;
}
f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); // n
var s = f.toString();
var rs = s.indexOf(".");
//0
if (rs < 0) {
rs = s.length;
s += ".";
}
while (s.length <= rs + n) {
s += "0";
}
return s;
},
},
mounted() {
this.defineEcharts("pdsssdh", this.option1);
// this.defineEcharts("pdsydl", this.option2);
this.pdsydl();
this.defineEcharts("pdstpt", this.option3);
this.init();
},
};
</script>
<style scoped lang="less">
//
.buttomCharts {
background: center top url("../../../assets/img/底盘.png") no-repeat;
background-size: 100% 100%;
height: 280px;
width: 800px;
margin-top: -290px;
margin-left: 12%;
}
.box {
width: 100%;
height: 100%;
@ -1095,6 +1567,10 @@ export default {
border-bottom: none;
}
}
#fhzb {
width: 1156px;
height: 500px;
}
}
}
}