Skip to content

Commit a22438b

Browse files
committed
[gephi-lite] Improves Louvain ambiguity display
Details: - Adds new bridge-ness edges score - Colorizes bridges as black - Removes node labels
1 parent 50f3676 commit a22438b

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

packages/gephi-lite/src/core/metrics/mixed/louvainEdgeAmbiguity.tsx

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ function computeLouvainEdgeScores(
4545
}
4646

4747
const coMembershipEdgeScores = mapValues(edgeScores, (v) => v / runs);
48+
const bridgeNessEdgeScores = mapValues(coMembershipEdgeScores, (v) => 1 - v);
4849
const ambiguityEdgeScores = mapValues(coMembershipEdgeScores, (v) => v * (1 - v) * 4);
4950
const nodes = graph.nodes();
5051
const meanAmbiguityNodeScores = zipObject(
@@ -54,6 +55,7 @@ function computeLouvainEdgeScores(
5455

5556
return {
5657
coMembershipEdgeScores,
58+
bridgeNessEdgeScores,
5759
ambiguityEdgeScores,
5860
meanAmbiguityNodeScores,
5961
};
@@ -93,25 +95,31 @@ const VisualizeAmbiguityForm: FC<{
9395
maxSize: 15,
9496
missingSize: 2,
9597
},
98+
nodesLabel: {
99+
type: "none",
100+
},
96101
edgesColor: {
97102
type: "partition",
98103
field: { field: attributeNames["sourceCommunityId"] },
99-
colorPalette: getPalette(values),
104+
colorPalette: { ...getPalette(values), bridge: "#000000" },
100105
missingColor: DEFAULT_NODE_COLOR,
101106
},
102107
edgesShadingColor: {
103108
type: "shading",
104109
field: { field: attributeNames["ambiguityScore"] },
105-
factor: 0.8,
110+
factor: 1,
106111
targetColor: "#ffffff",
107112
},
108113
edgesSize: {
109-
type: "fixed",
110-
value: 3,
114+
type: "ranking",
115+
field: { field: attributeNames["ambiguityScore"] },
116+
minSize: 1,
117+
maxSize: 5,
118+
missingSize: 2,
111119
},
112120
edgesZIndex: {
113121
type: "field",
114-
field: { field: attributeNames["coMembershipScore"] },
122+
field: { field: attributeNames["ambiguityScore"] },
115123
reversed: false,
116124
},
117125
backgroundColor: "#666666",
@@ -145,7 +153,7 @@ const VisualizeAmbiguityForm: FC<{
145153
};
146154

147155
export const louvainEdgeAmbiguity: Metric<{
148-
edges: ["coMembershipScore", "ambiguityScore", "sourceCommunityId"];
156+
edges: ["coMembershipScore", "bridgeNessEdgeScore", "ambiguityScore", "sourceCommunityId"];
149157
nodes: ["meanAmbiguityScore"];
150158
}> = {
151159
id: "louvainEdgeAmbiguity",
@@ -155,6 +163,7 @@ export const louvainEdgeAmbiguity: Metric<{
155163
coMembershipScore: quantitativeOnly,
156164
ambiguityScore: quantitativeOnly,
157165
sourceCommunityId: qualitativeOnly,
166+
bridgeNessEdgeScore: quantitativeOnly,
158167
},
159168
nodes: { meanAmbiguityScore: quantitativeOnly },
160169
},
@@ -179,32 +188,29 @@ export const louvainEdgeAmbiguity: Metric<{
179188
fn(
180189
parameters: {
181190
runs: number;
182-
scoreType: "coMembership" | "ambiguity";
183191
getEdgeWeight?: string;
184-
fastLocalMoves: boolean;
185-
randomWalk: boolean;
186192
resolution: number;
187193
},
188194
graph: FullGraph,
189195
) {
190-
const { coMembershipEdgeScores, ambiguityEdgeScores, meanAmbiguityNodeScores } = computeLouvainEdgeScores(
191-
graph,
192-
parameters,
193-
);
196+
const { coMembershipEdgeScores, bridgeNessEdgeScores, ambiguityEdgeScores, meanAmbiguityNodeScores } =
197+
computeLouvainEdgeScores(graph, parameters);
194198

195199
// Run Louvain once more, with the same setup, to get some community classes (for coloring, basically):
196200
const communities = louvain(graph, {
197201
resolution: parameters.resolution,
198202
getEdgeWeight: parameters.getEdgeWeight || null,
199203
});
200-
const edgeCommunities: Record<string, number> = {};
204+
const edgeCommunities: Record<string, string> = {};
201205
graph.forEachEdge((edge, _, source) => {
202-
edgeCommunities[edge] = communities[source];
206+
const coMembership = coMembershipEdgeScores[edge];
207+
edgeCommunities[edge] = coMembership > 0.5 ? communities[source] + "" : "bridge";
203208
});
204209

205210
return {
206211
edges: {
207212
coMembershipScore: coMembershipEdgeScores,
213+
bridgeNessEdgeScore: bridgeNessEdgeScores,
208214
ambiguityScore: ambiguityEdgeScores,
209215
sourceCommunityId: edgeCommunities,
210216
},

packages/gephi-lite/src/locales/dev.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@
562562
"description": "This algorithm helps exploring ambiguity in Louvain community detection. It runs the Louvain algorithm N times, and analyzes how consistent Louvain is along multiple runs, looking on each edge if its extremities are in the same cluster or not..",
563563
"attributes": {
564564
"coMembershipScore": "Edge co-membership attribute name (i.e. the percentage of times Louvain set the same community for both of its extremities)",
565+
"bridgeNessEdgeScore": "Edge bridge-ness attribute name (i.e. 1 - the co-membership score)",
565566
"ambiguityScore": "Edge ambiguity score name (the inverse of the consensus of all the Louvain runs, 0 when all Louvain runs agree, and 1 when they disagree the most)",
566567
"meanAmbiguityScore": "Node average linked edges ambiguity score attribute name",
567568
"sourceCommunityId": "Edge source modularity classes (for coloring purpose in the preview only)"

packages/gephi-lite/src/locales/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@
559559
"description": "Cet algorithme permet d'explorer l'ambiguïté dans la détection des communautés avec la méthode de Louvain. Il exécute l'algorithme de Louvain N fois, puis analyse comment les résultats varient au cours de multiples exécutions, en vérifiant pour chaque lien si ses extrémités appartiennent ou non à la même communauté.",
560560
"attributes": {
561561
"coMembershipScore": "Attribut de co-appartenance des liens (c’est-à-dire le pourcentage de fois où Louvain a assigné la même communauté aux deux extrémités d’un lien)",
562+
"bridgeNessEdgeScore": "Attribut de pontage des liens (c’est-à-dire 1 - le score de co-appartenance)",
562563
"ambiguityScore": "Attribut du score d'ambiguïté des liens (l'inverse du consensus de toutes les exécutions de Louvain, donc 0 si la décision est toujours la même, et 1 si elle varie 50% du temps)",
563564
"meanAmbiguityScore": "Moyenne des scores d'ambiguïté des liens adjacents",
564565
"sourceCommunityId": "Classe de modularité des sources des liens (uniquement utilisé pour )"

0 commit comments

Comments
 (0)