浏览代码

显示所有数据点

任一存 3 年之前
父节点
当前提交
e807bd6cb7
共有 9 个文件被更改,包括 48460 次插入8748 次删除
  1. 2 1
      .eslintrc.js
  2. 3520 0
      input-data/data.js
  3. 4074 0
      input-data/data2.js
  4. 4074 0
      input-data/data2a.js
  5. 27629 0
      package-lock.json
  6. 1 0
      package.json
  7. 86 6
      src/App.vue
  8. 0 58
      src/components/HelloWorld.vue
  9. 9074 8683
      yarn.lock

+ 2 - 1
.eslintrc.js

@@ -12,6 +12,7 @@ module.exports = {
   },
   rules: {
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-unused-vars': 'off'
   }
 }

文件差异内容过多而无法显示
+ 3520 - 0
input-data/data.js


文件差异内容过多而无法显示
+ 4074 - 0
input-data/data2.js


文件差异内容过多而无法显示
+ 4074 - 0
input-data/data2a.js


文件差异内容过多而无法显示
+ 27629 - 0
package-lock.json


+ 1 - 0
package.json

@@ -9,6 +9,7 @@
   },
   "dependencies": {
     "core-js": "^3.6.5",
+    "d3": "^7.3.0",
     "vue": "^3.0.0"
   },
   "devDependencies": {

+ 86 - 6
src/App.vue

@@ -1,15 +1,96 @@
+/**
+
+ */
+
 <template>
-  <img alt="Vue logo" src="./assets/logo.png">
-  <HelloWorld msg="Welcome to Your Vue.js App"/>
+  info: {{infoTest}}
+  <div class="svgWrapper"></div>
 </template>
 
 <script>
-import HelloWorld from './components/HelloWorld.vue'
+import * as d3 from "d3";
+
+// 原始数据处理成二维数组
+import rawInputData from "../input-data/data.js";
+let inputPointArray = rawInputData.data.map((eachString) => {
+  return eachString.split(' ')
+})
+console.log('inputPointArray: ', inputPointArray);
+
+// 各个点的分布情况
+let xArray = inputPointArray.map((eachPoint) => {
+  return eachPoint[0]
+})
+let xLength = Math.max(...xArray) - Math.min(...xArray)
+let xCenter = (Math.max(...xArray) + Math.min(...xArray)) / 2
+
+let yArray = inputPointArray.map((eachPoint) => {
+  return eachPoint[1]
+})
+let yLength = Math.max(...yArray) - Math.min(...yArray)
+let yCenter = (Math.max(...yArray) + Math.min(...yArray)) / 2
+
+let areaRatio = xLength / yLength
+
+// 视口尺寸
+let viewportWidth = document.documentElement.clientWidth
+let viewportHeight = document.documentElement.clientHeight
+let viewportRatio = viewportWidth / viewportHeight
+
+// 各个点坐标映射到视口坐标
+let pxPerUnitLength = 0 // 原始单位长度对应的像素数
+if (viewportRatio >= areaRatio) { // 视口高度应略小于y轴方向分布幅度
+  pxPerUnitLength = viewportHeight / yLength * 0.9
+} else { // 视口宽度应略小于x轴方向分布幅度
+  pxPerUnitLength = viewportWidth / xLength * 0.9
+}
+let xArrayInPx = xArray.map((eachX) => {
+  return (eachX - xCenter) * pxPerUnitLength + viewportWidth / 2
+})
+let yArrayInPx = yArray.map((eachY) => {
+  return (eachY - yCenter) * pxPerUnitLength + viewportHeight / 2
+})
+
+// 组合成最终数据用来渲染
+let dataForRender = []
+for (let index = 0; index < xArrayInPx.length; index++) {
+  dataForRender.push([xArrayInPx[index], yArrayInPx[index], ...inputPointArray[index], index])
+}
 
 export default {
   name: 'App',
-  components: {
-    HelloWorld
+  data() {
+    return {
+      inputPointArray,
+      colNum: 15,
+      infoText: 'adsf'
+    }
+  },
+  computed: {
+  },
+  mounted() {
+    d3.select('.svgWrapper').append("svg").attr("width", document.documentElement.clientWidth).attr('height', document.documentElement.clientHeight)
+    d3.select('svg').selectAll('circle').data(dataForRender).enter().append('circle')
+      .attr('cx', (d) => d[0])
+      .attr('cy', (d) => d[1])
+      .attr('r', 0.36 * pxPerUnitLength / 2)
+      .attr('render-data', (d) => {
+        return d
+      })
+    d3.select('svg').selectAll('circle').on('mouseover', function(e) {
+      d3.select(this).attr('fill', 'orange')
+      let renderDataItem = e.target.attributes['render-data'].value.split(',')
+      console.log('数据点index(从0数起):', renderDataItem[15])
+      console.log(`数据点各项值: ${renderDataItem[2]}, ${renderDataItem[3]}, ${renderDataItem[4]}, ${renderDataItem[5]}, ${renderDataItem[6]}, ${renderDataItem[7]}, ${renderDataItem[8]}, ${renderDataItem[9]}, ${renderDataItem[10]}, ${renderDataItem[11]}, ${renderDataItem[12]}, ${renderDataItem[13]}`);
+    }).on('mouseleave', function (e) {
+      d3.select(this).attr('fill', 'black')
+    })
+
+    // d3.select('svg').selectAll('text').data(dataForRender).enter().append('text').text((item) => {
+    //   return item[item.length - 1]
+    // })
+    //   .attr('x', (item) => item[0])
+    //   .attr('y', (item) => item[1])
   }
 }
 </script>
@@ -21,6 +102,5 @@ export default {
   -moz-osx-font-smoothing: grayscale;
   text-align: center;
   color: #2c3e50;
-  margin-top: 60px;
 }
 </style>

+ 0 - 58
src/components/HelloWorld.vue

@@ -1,58 +0,0 @@
-<template>
-  <div class="hello">
-    <h1>{{ msg }}</h1>
-    <p>
-      For a guide and recipes on how to configure / customize this project,<br>
-      check out the
-      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
-    </p>
-    <h3>Installed CLI Plugins</h3>
-    <ul>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
-    </ul>
-    <h3>Essential Links</h3>
-    <ul>
-      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
-      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
-      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
-      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
-      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
-    </ul>
-    <h3>Ecosystem</h3>
-    <ul>
-      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
-      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
-      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
-      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
-      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
-    </ul>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'HelloWorld',
-  props: {
-    msg: String
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped>
-h3 {
-  margin: 40px 0 0;
-}
-ul {
-  list-style-type: none;
-  padding: 0;
-}
-li {
-  display: inline-block;
-  margin: 0 10px;
-}
-a {
-  color: #42b983;
-}
-</style>

文件差异内容过多而无法显示
+ 9074 - 8683
yarn.lock