From d4441e068cbe8f1132962d7a76eb01a647ddaba0 Mon Sep 17 00:00:00 2001 From: duanhao Date: Tue, 12 Aug 2025 15:21:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A4=BE=E5=9B=A2=E6=A0=B7=E5=BC=8F=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../character-Interaction-hidden-node.png | Bin 0 -> 7194 bytes .../icon/character-hidden-node.png | Bin 0 -> 7028 bytes .../linkPrediction/icon/hidden-node.png | Bin 0 -> 7164 bytes .../linkPrediction/icon/normal-group-node.png | Bin 0 -> 3433 bytes .../linkPrediction/icon/prediction-node.png | Bin 0 -> 4415 bytes .../components/communityNode.vue | 19 +++++--- .../components/graph/bridgeCommunityGraph.vue | 7 ++- .../characterInteraction/index.vue | 3 ++ .../charactersHiddenInteraction/index.vue | 4 ++ .../components/communityNode.vue | 41 ++++++++++++++-- src/views/LinkPrediction/components/graph.vue | 5 ++ .../socialGroups/components/communityNode.vue | 44 +++++++++--------- 12 files changed, 87 insertions(+), 36 deletions(-) create mode 100644 src/assets/images/linkPrediction/icon/character-Interaction-hidden-node.png create mode 100644 src/assets/images/linkPrediction/icon/character-hidden-node.png create mode 100644 src/assets/images/linkPrediction/icon/hidden-node.png create mode 100644 src/assets/images/linkPrediction/icon/normal-group-node.png create mode 100644 src/assets/images/linkPrediction/icon/prediction-node.png diff --git a/src/assets/images/linkPrediction/icon/character-Interaction-hidden-node.png b/src/assets/images/linkPrediction/icon/character-Interaction-hidden-node.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd666fe77e4076be911e96212060dd9ecffc33c GIT binary patch literal 7194 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 LNkvXXu0mjflv##{ literal 0 HcmV?d00001 diff --git a/src/assets/images/linkPrediction/icon/prediction-node.png b/src/assets/images/linkPrediction/icon/prediction-node.png new file mode 100644 index 0000000000000000000000000000000000000000..364f0da989c2c645ea9c208f11baae794c7cf12d GIT binary patch literal 4415 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 FV1gi+dpH09 literal 0 HcmV?d00001 diff --git a/src/views/KeyNodeDiscern/anchorRecommendation/components/communityNode.vue b/src/views/KeyNodeDiscern/anchorRecommendation/components/communityNode.vue index f529e8c..96383be 100644 --- a/src/views/KeyNodeDiscern/anchorRecommendation/components/communityNode.vue +++ b/src/views/KeyNodeDiscern/anchorRecommendation/components/communityNode.vue @@ -10,6 +10,8 @@ import * as echarts from "echarts" import anchor from "@/assets/json/anchor_community.json" import community from "@/assets/json/community_nodes.json" import nodeHoverImg from "@/assets/images/nodeHover.png" +import predictionNodeImg from "@/assets/images/linkPrediction/icon/prediction-node.png" +import normalGroupNodeImg from "@/assets/images/linkPrediction/icon/normal-group-node.png" import { storeToRefs } from "pinia" import { useKeyNodeRecognitionStore } from "@/store/keyNodeRecognition/index" import csvUrl from "@/assets/json/community_edges1.csv?url" @@ -86,7 +88,8 @@ const initChart = async () => { ([communityId, anchorList]) => ({ name: parseInt(communityId), // 社团id anchorCount: anchorList.length, // 该社团包含锚点的个数 - anchorList: anchorList // 该社团包含的锚点id数组 + anchorList: anchorList, // 该社团包含的锚点id数组 + symbol: `image://${new URL(predictionNodeImg, import.meta.url)}` }) ) @@ -96,7 +99,8 @@ const initChart = async () => { //筛选出不包含锚点的社团(不闪烁的蓝色节点) const uncontainedAnchorCommunity = Object.keys(community) .filter((node) => !includedCommunityId.includes(node)) - .map((node) => ({ name: parseInt(node), anchorCount: 0 })) + .map((node) => ({ name: parseInt(node), anchorCount: 0, symbol: `image://${new URL(normalGroupNodeImg, import.meta.url)}` })) + //合并成功后,统一设置id,避免重复id出现导致echarts渲染失败,并且取出每个社团中有多少个节点 const nodes = includeAnchorCommunity.concat(uncontainedAnchorCommunity).map((node, index) => ({ @@ -129,8 +133,8 @@ const initChart = async () => { const data = { nodes, links } const categories = [ - { name: "普通社团", category: 0 }, - { name: "含锚点社团", category: 1 } + { name: "普通社团", category: 0, icon: `image://${new URL(normalGroupNodeImg, import.meta.url)}` }, + { name: "含锚点社团", category: 1, icon: `image://${new URL(predictionNodeImg, import.meta.url)}` } ] // // 初始选项 const option = { @@ -139,7 +143,7 @@ const initChart = async () => { { data: categories.map((c) => ({ name: c.name, - itemStyle: { + /* itemStyle: { color: c.category === 0 ? new echarts.graphic.LinearGradient(1, 0, 0, 0, [ @@ -152,7 +156,8 @@ const initChart = async () => { { offset: 0.37, color: "#aef295" }, { offset: 1, color: "#c2f989" } ]) - } + }, */ + icon: c.icon, })), right: 15, bottom: 13, @@ -245,7 +250,7 @@ const initChart = async () => { animationDurationUpdate: 3500, // 节点移动更平滑 data: data.nodes.map((node) => ({ ...node, - symbolSize: node.total / 20 < 30 ? 30 : node.total / 20, + symbolSize: node.total / 20 < 30 ? 50 : (node.total / 20) + 20, itemStyle: { color: node.anchorCount === 0 diff --git a/src/views/KeyNodeDiscern/bridgeCommunication/components/graph/bridgeCommunityGraph.vue b/src/views/KeyNodeDiscern/bridgeCommunication/components/graph/bridgeCommunityGraph.vue index 153f5ac..ead6365 100644 --- a/src/views/KeyNodeDiscern/bridgeCommunication/components/graph/bridgeCommunityGraph.vue +++ b/src/views/KeyNodeDiscern/bridgeCommunication/components/graph/bridgeCommunityGraph.vue @@ -9,6 +9,8 @@ import bridgeData from '@/assets/json/bridge_neighbors_communities.json'; import bridgeNodeHoverBgImg from '@/assets/images/bridge_node_hoverbgimg.png' import { useKeyNodeStore2 } from '@/store/keyNodeStore2'; // 引入store import { cropToCircleAsync } from "@/utils/transform"; // 引入头像处理 +import normalGroupNodeImg from '@/assets/images/linkPrediction/icon/normal-group-node.png' + // 接收父组件传递的timestamp const props = defineProps({ @@ -34,7 +36,7 @@ const processData = async() => { const nodes = []; const links = []; const addedCommunities = new Set(); - // 新增:存储已处理的桥梁节点ID + // 存储已处理的桥梁节点ID const addedBridgeNodes = new Set(); // 获取store实例 const keyNodeStore2 = useKeyNodeStore2(); @@ -114,6 +116,7 @@ const processData = async() => { nodes.push({ id: communityKey, category: 1, + symbol: `image://${new URL(normalGroupNodeImg, import.meta.url)}`, symbolSize: size }); addedCommunities.add(communityKey); @@ -333,7 +336,7 @@ const initChart = async() => { // 添加自定义图标 icon: c.category === 0 ? `image://${new URL('@/assets/images/icon/bridge_node_legend.png', import.meta.url)}` - : `image://${new URL('@/assets/images/icon/community_node_legend.png', import.meta.url)}` + : `image://${new URL(normalGroupNodeImg, import.meta.url)}` })), right: 15, bottom: 13, diff --git a/src/views/LinkPrediction/characterInteraction/index.vue b/src/views/LinkPrediction/characterInteraction/index.vue index 974f619..3c6ea92 100644 --- a/src/views/LinkPrediction/characterInteraction/index.vue +++ b/src/views/LinkPrediction/characterInteraction/index.vue @@ -17,6 +17,7 @@ @@ -137,6 +138,8 @@ const interactionStore = useCharacterInteractionStore() const userInfoDialog = ref(false) const curSelectedUser = ref(null) +const storeId = "characterInteraction" + //选择某个用户组,更新贴文列表 && 更新关系图二级界面 const handleSelectedUserGroup = (group) => { interactionStore.curComponent = "detailNode" diff --git a/src/views/LinkPrediction/charactersHiddenInteraction/index.vue b/src/views/LinkPrediction/charactersHiddenInteraction/index.vue index 45410a1..008d01e 100644 --- a/src/views/LinkPrediction/charactersHiddenInteraction/index.vue +++ b/src/views/LinkPrediction/charactersHiddenInteraction/index.vue @@ -16,6 +16,7 @@
@@ -135,6 +136,9 @@ const characterHiddenStore = useCharacterHiddenStore() const userInfoDialog = ref(false) const curSelectedUser = ref(null) +const storeId = "characterHidden" + + const handleOpenUserInfoDialog = (params) => { userInfoDialog.value = params.userInfoDialog curSelectedUser.value = params.curSelectedUser diff --git a/src/views/LinkPrediction/components/communityNode.vue b/src/views/LinkPrediction/components/communityNode.vue index b6efcf3..3d94bf8 100644 --- a/src/views/LinkPrediction/components/communityNode.vue +++ b/src/views/LinkPrediction/components/communityNode.vue @@ -15,6 +15,10 @@ import { onMounted, defineEmits, inject, defineProps } from "vue" import * as echarts from "echarts" import nodeHoverImg from "@/assets/images/nodeHover.png" +import predictionNodeImg from "@/assets/images/linkPrediction/icon/prediction-node.png" +import charHiddenNodeImg from "@/assets/images/linkPrediction/icon/character-hidden-node.png" +import charInteractionHiddenNodeImg from "@/assets/images/linkPrediction/icon/character-Interaction-hidden-node.png" +import normalGroupNodeImg from "@/assets/images/linkPrediction/icon/normal-group-node.png" let chart = null const emit = defineEmits(["click:node", "click:edge"]) const statisticsList = inject("statisticsList") @@ -22,11 +26,39 @@ const props = defineProps({ interactionStore: { type: Object, required: true + }, + storeId: { + type: String, + default: "" } }) +console.log(props.storeId) const initChart = () => { chart = echarts.init(document.getElementById("container")) + const imageSelect = (node) => { + if (props.storeId == "characterInteraction") { + if (node.isIncludePredictNodes) { + if (node.selfIncludeImplicitRelationship) { + return `image://${new URL(predictionNodeImg, import.meta.url)}` + } else { + return `image://${new URL(charInteractionHiddenNodeImg, import.meta.url)}` + } + } else { + return `image://${new URL(normalGroupNodeImg, import.meta.url)}` + } + } else if (props.storeId == "characterHidden") { + if (node.isIncludePredictNodes) { + if (node.selfIncludeImplicitRelationship) { + return `image://${new URL(predictionNodeImg, import.meta.url)}` + } else { + return `image://${new URL(charHiddenNodeImg, import.meta.url)}` + } + } else { + return `image://${new URL(normalGroupNodeImg, import.meta.url)}` + } + } + } //处理社团节点 const nodes = Object.values(inject("communityNodeList") ?? []).map((item) => ({ id: item.id, @@ -35,7 +67,8 @@ const initChart = () => { nodesNum: item.nodesNum, neighbors: item.neighbors, category: item.isIncludePredictNodes ? 1 : 0, - + symbol: imageSelect(item), + symbolSize: 30, selfIncludeImplicitRelationship: item.neighbors.map((nei) => nei.id).includes(item.id) && //若该社团的id在该社团邻居中可以找到,说明自己这个社团中有互动隐关系 item.neighbors.find((nei) => nei.id == item.id).isHidden @@ -65,8 +98,8 @@ const initChart = () => { const data = { nodes, links } const categories = [ - { name: "普通社团", category: 0, icon: "circle" }, - { name: "含预测节点社团", category: 1, icon: "circle" }, + { name: "普通社团", category: 0, icon: `image://${new URL(normalGroupNodeImg, import.meta.url)}` }, + { name: "含预测节点社团", category: 1, icon: `image://${new URL(predictionNodeImg, import.meta.url)}` }, { name: props.interactionStore.predictionLegendContent, category: 2, @@ -184,7 +217,7 @@ const initChart = () => { animationDurationUpdate: 3500, // 节点移动更平滑 data: data.nodes.map((node) => ({ ...node, - symbolSize: node.nodesNum / 40 < 30 ? 40 : node.nodesNum / 40, + symbolSize: node.nodesNum / 10 < 30 ? 50 : 70, itemStyle: { color: node.isIncludePredictNodes === false diff --git a/src/views/LinkPrediction/components/graph.vue b/src/views/LinkPrediction/components/graph.vue index 5b085b7..5a9fec4 100644 --- a/src/views/LinkPrediction/components/graph.vue +++ b/src/views/LinkPrediction/components/graph.vue @@ -7,6 +7,7 @@ @click:node="handleClickNode" @click:edge="handleClickEdge" :interaction-store="interactionStore" + :storeId="storeId" > { chart = echarts.init(document.getElementById("container")) + const imageSelect = (node) => { + if (node.isIncludePredictNodes) { + if (node.selfIncludeImplicitRelationship) { + return `image://${new URL(predictionNodeImg, import.meta.url)}` + } else { + return `image://${new URL(hiddenNodeImg, import.meta.url)}` + } + } else { + return `image://${new URL(normalGroupNodeImg, import.meta.url)}` + } + } + //处理社团节点 const nodes = Object.values(communityNodeList).map((item) => ({ id: (item.id), name: (item.id), + symbol: imageSelect(item), + symbolSize: 30, isIncludePredictNodes: item.isIncludePredictNodes, nodesNum: item.nodesNum, neighbors: item.neighbors.map((nei) => ({ ...nei, name: parseInt(nei.id) })), @@ -65,8 +83,8 @@ const initChart = async () => { const data = { nodes, links } const categories = [ - { name: "普通社团", category: 0, icon: `image://${new URL('@/assets/images/linkPrediction/icon/node-legend-icon.png', import.meta.url)}`}, - { name: "含预测节点社团", category: 1, icon: `image://${new URL('@/assets/images/linkPrediction/icon/community-legend-icon.png', import.meta.url)}`}, + { name: "普通社团", category: 0, icon: `image://${new URL(normalGroupNodeImg, import.meta.url)}`}, + { name: "含预测节点社团", category: 1, icon: `image://${new URL(predictionNodeImg, import.meta.url)}`}, { name: "紧密团体关系", category: 2, icon: `image://${new URL('@/assets/images/linkPrediction/icon/tight-community-legend-icon.png', import.meta.url)}`} ] const option = { @@ -75,26 +93,6 @@ const initChart = async () => { { data: categories.map((c) => ({ name: c.name, - itemStyle: { - color: - c.category === 0 - ? new echarts.graphic.LinearGradient(1, 0, 0, 0, [ - { offset: 1, color: "#1a3860" }, // 深蓝渐变 - { offset: 0.5, color: "#38546b" }, - { offset: 0, color: "#5fb3b3" } - ]) - : c.category === 1 - ? new echarts.graphic.LinearGradient(1, 0, 0, 0, [ - { offset: 0, color: "#9eec9c" }, // 绿色渐变 - { offset: 0.37, color: "#aef295" }, - { offset: 1, color: "#c2f989" } - ]) - : new echarts.graphic.LinearGradient(1, 0, 0, 0, [ - { offset: 0, color: "#ff9a9e" }, // 红色渐变(用于 category === 2) - { offset: 0.5, color: "#fad0c4" }, - { offset: 1, color: "#fbc2eb" } - ]) - }, icon: c.icon })), right: 15, @@ -185,7 +183,7 @@ const initChart = async () => { animationDurationUpdate: 3500, // 节点移动更平滑 data: data.nodes.map((node) => ({ ...node, - symbolSize: node.nodesNum / 40 < 30 ? 40 : node.nodesNum / 40, + symbolSize: node.nodesNum / 10 < 30 ? 50 : 70, itemStyle: { color: node.isIncludePredictNodes === false