|
@@ -21,21 +21,12 @@ import { graphic } from "echarts/core"
|
|
|
const option = ref({})
|
|
|
let myChart
|
|
|
|
|
|
-let vars = ref(['变量1','变量2'])
|
|
|
+let vars = ref([])
|
|
|
let vals = ref([])
|
|
|
let series = ref([
|
|
|
- {
|
|
|
- name: "变量1",
|
|
|
- type: "scatter",
|
|
|
- data: [10, 20, 30, 40] // y轴对应数据
|
|
|
- },
|
|
|
- {
|
|
|
- name: "变量2",
|
|
|
- type: "scatter",
|
|
|
- data: [20, 10, 40, 30] // y轴对应数据
|
|
|
- }
|
|
|
+
|
|
|
])
|
|
|
-let xdata = ref(['-0.25','0.00','0.25','0.50','0.75','1.00'])
|
|
|
+let xdata = ref([])
|
|
|
let chartContainer = ref(null)
|
|
|
let chartDom = ref()
|
|
|
let convergeDate = ref([])
|
|
@@ -142,6 +133,148 @@ const getsockechart = (data) => {
|
|
|
}
|
|
|
|
|
|
|
|
|
+// 绘制所有数据曲线,X轴为行索引
|
|
|
+const getshuju = (dataheader, data) => {
|
|
|
+ console.log("散点图曲线数据1:", data);
|
|
|
+
|
|
|
+ curvedata.value = data;
|
|
|
+ series.value = [];
|
|
|
+ xdata.value = [];
|
|
|
+
|
|
|
+ vars.value = dataheader; // dataheader 是包含 label 和 prop 的数组
|
|
|
+ vals.value = data;
|
|
|
+
|
|
|
+ // 生成 x 轴数据(这里假设 x 轴是从 0 开始递增的索引)
|
|
|
+ for (let i = 0; i < vals.value.length; i++) {
|
|
|
+ xdata.value.push(i); // x 轴数据为行索引
|
|
|
+ }
|
|
|
+
|
|
|
+ // 为每个字段生成一条曲线
|
|
|
+ for (let colIndex = 0; colIndex < vars.value.length; colIndex++) {
|
|
|
+ const prop = vars.value[colIndex].prop; // 获取当前列的字段名
|
|
|
+ const label = vars.value[colIndex].label; // 获取当前列的显示名称
|
|
|
+
|
|
|
+ let seriesData = [];
|
|
|
+
|
|
|
+ // 遍历每一行,提取该列的数据
|
|
|
+ for (let rowIndex = 0; rowIndex < vals.value.length; rowIndex++) {
|
|
|
+ let value = vals.value[rowIndex][prop]; // 获取当前列的值
|
|
|
+ seriesData.push([xdata.value[rowIndex], value]); // 添加到 seriesData
|
|
|
+ }
|
|
|
+
|
|
|
+ // 为每列数据生成一条曲线,使用 label 作为曲线的名字
|
|
|
+ series.value.push({
|
|
|
+ name: label, // 使用 label 作为曲线名
|
|
|
+ type: "scatter", // 散点图类型
|
|
|
+ data: seriesData,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理 ECharts 图表配置
|
|
|
+ const myChart = echarts.init(chartContainer.value);
|
|
|
+
|
|
|
+ myChart.setOption({
|
|
|
+ legend: {
|
|
|
+ data: vars.value.map(item => item.label), // 图例数据是列名
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: "category", // 设置为 "category" 表示 x 轴为分类数据
|
|
|
+ data: xdata.value, // x 轴数据为索引
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: "value", // y 轴是数值型
|
|
|
+ },
|
|
|
+ series: series.value, // 使用生成的 series 数据
|
|
|
+ });
|
|
|
+
|
|
|
+ console.log("初始化后的 series:", series.value);
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+const selectshuju = (listcbval,listcbval2,dataheader, data) => {
|
|
|
+ console.log("散点图曲线数据1:", data);
|
|
|
+
|
|
|
+ curvedata.value = data;
|
|
|
+ series.value = [];
|
|
|
+ xdata.value = [];
|
|
|
+ const ydata = ref([]);
|
|
|
+
|
|
|
+ vars.value = dataheader; // dataheader 是包含 label 和 prop 的数组
|
|
|
+ vals.value = data; // vals 是表格数据
|
|
|
+
|
|
|
+ // 生成 X 轴数据和 Y 轴数据
|
|
|
+ const xColumns = listcbval.value; // 获取 listcbval 中选择的列,作为 X 轴
|
|
|
+ const yColumns = listcbval2.value; // 获取 listcbval2 中选择的列,作为 Y 轴
|
|
|
+
|
|
|
+ if (xColumns.length === 0 || yColumns.length === 0) {
|
|
|
+ console.error('请先选择 X 轴和 Y 轴的变量');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历每一行数据,为每对 X 和 Y 轴选择的列生成数据
|
|
|
+ for (let i = 0; i < vals.value.length; i++) {
|
|
|
+ let xValue = [];
|
|
|
+ let yValue = [];
|
|
|
+
|
|
|
+ // 对于每个 X 轴选择的列,提取该列数据
|
|
|
+ for (let xCol of xColumns) {
|
|
|
+ let xColumnData = vals.value[i][xCol]; // 获取当前行的 X 列数据
|
|
|
+ xValue.push(xColumnData);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 对于每个 Y 轴选择的列,提取该列数据
|
|
|
+ for (let yCol of yColumns) {
|
|
|
+ let yColumnData = vals.value[i][yCol]; // 获取当前行的 Y 列数据
|
|
|
+ yValue.push(yColumnData);
|
|
|
+ }
|
|
|
+
|
|
|
+ xdata.value.push(xValue);
|
|
|
+ ydata.value.push(yValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 为每个 Y 轴数据列生成一条曲线
|
|
|
+ for (let yColIndex = 0; yColIndex < yColumns.length; yColIndex++) {
|
|
|
+ const label = yColumns[yColIndex]; // 使用 Y 轴列名作为曲线的标签
|
|
|
+ let seriesData = [];
|
|
|
+
|
|
|
+ for (let rowIndex = 0; rowIndex < vals.value.length; rowIndex++) {
|
|
|
+ let xValues = xdata.value[rowIndex]; // 获取当前行的 X 轴数据
|
|
|
+ let yValue = ydata.value[rowIndex][yColIndex]; // 获取当前行的 Y 轴数据
|
|
|
+
|
|
|
+ // 将 X 和 Y 的数据组成成对的数据,传给 seriesData
|
|
|
+ for (let xVal of xValues) {
|
|
|
+ seriesData.push([xVal, yValue]); // 每对 (X, Y) 数据
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成曲线的数据
|
|
|
+ series.value.push({
|
|
|
+ name: label, // 使用列名作为曲线名
|
|
|
+ type: "scatter", // 散点图类型
|
|
|
+ data: seriesData,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理 ECharts 图表配置
|
|
|
+ const myChart = echarts.init(chartContainer.value);
|
|
|
+
|
|
|
+ myChart.setOption({
|
|
|
+ legend: {
|
|
|
+ data: yColumns, // 图例数据使用 Y 轴的列名
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: "category", // 设置为 "category" 表示 x 轴为分类数据
|
|
|
+ data: xdata.value, // x 轴数据为 X 轴数据
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: "value", // y 轴是数值型
|
|
|
+ },
|
|
|
+ series: series.value, // 使用生成的 series 数据
|
|
|
+ });
|
|
|
+
|
|
|
+ console.log("初始化后的 series:", series.value);
|
|
|
+};
|
|
|
+
|
|
|
const setOptionfunc = async () => {
|
|
|
option.value = {
|
|
|
title: {
|
|
@@ -159,13 +292,17 @@ const setOptionfunc = async () => {
|
|
|
show: true,
|
|
|
data: vars.value,
|
|
|
orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
|
|
|
- right: "4%",
|
|
|
- top: "2%"
|
|
|
+ right: "0%",
|
|
|
+ top: "2%",
|
|
|
+ itemWidth: 30,
|
|
|
+ pageButtonItemGap: 10,
|
|
|
+ pageButtonPosition: 'end',
|
|
|
+ type: 'scroll',
|
|
|
},
|
|
|
grid: {
|
|
|
show: false,
|
|
|
left: "5%",
|
|
|
- right: "4%",
|
|
|
+ right: "14%",
|
|
|
bottom: "15%",
|
|
|
containLabel: true
|
|
|
},
|
|
@@ -179,9 +316,9 @@ const setOptionfunc = async () => {
|
|
|
},
|
|
|
xAxis: [
|
|
|
{
|
|
|
- type: "category",
|
|
|
+ type: "value",
|
|
|
boundaryGap: false,
|
|
|
- name: "cd",
|
|
|
+ name: "x/c",
|
|
|
nameGap:30,
|
|
|
nameTextStyle:{
|
|
|
fontSize: 16,
|
|
@@ -207,7 +344,7 @@ const setOptionfunc = async () => {
|
|
|
|
|
|
yAxis: {
|
|
|
type: "value",
|
|
|
- name:'-cl',
|
|
|
+ name:'cp',
|
|
|
nameGap:40,
|
|
|
nameTextStyle:{
|
|
|
fontSize: 16,
|
|
@@ -231,16 +368,16 @@ const setOptionfunc = async () => {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
- dataZoom: [
|
|
|
- {
|
|
|
- type: "inside", // 鼠标滚轮缩放
|
|
|
- xAxisIndex: [0], // 针对 X 轴
|
|
|
- },
|
|
|
- {
|
|
|
- type: "slider", // 滑动条缩放
|
|
|
- xAxisIndex: [0],
|
|
|
- }
|
|
|
- ],
|
|
|
+ // dataZoom: [
|
|
|
+ // {
|
|
|
+ // type: "inside", // 鼠标滚轮缩放
|
|
|
+ // xAxisIndex: [0], // 针对 X 轴
|
|
|
+ // },
|
|
|
+ // {
|
|
|
+ // type: "slider", // 滑动条缩放
|
|
|
+ // xAxisIndex: [0],
|
|
|
+ // }
|
|
|
+ // ],
|
|
|
series: series.value
|
|
|
}
|
|
|
option.value && myChart.setOption(option.value)
|
|
@@ -249,7 +386,7 @@ const setOptionfunc = async () => {
|
|
|
myChart.resize()
|
|
|
}
|
|
|
}
|
|
|
-defineExpose({ getsockechart, echatinit })
|
|
|
+defineExpose({ getsockechart,getshuju, echatinit,selectshuju })
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
</style>
|