Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Questions on achieving a mindmap using graphview #105

Open
beauduffy opened this issue May 5, 2023 · 3 comments
Open

Questions on achieving a mindmap using graphview #105

beauduffy opened this issue May 5, 2023 · 3 comments

Comments

@beauduffy
Copy link

Hi, been trying to use graph view to create a mindmap, I have prototyped with the three algorithms and would like to hear your thoughts on which to use, as i believe all might be able to achieve but I have found hurdles with them.
mind-map-graphic-e1642052584778

For context, I use Flutteflow and could be denoted as a novice when it comes to dart so I am probably overlooking some concepts, I am passing in a structured json which i believe graph view can accept, example below:

static const Map<String, dynamic> json = {
    'nodes': [
      {'id': 1, 'label': 'Fishing'},
      {'id': 2, 'label': 'Colours'},
      {'id': 3, 'label': 'Aquamarine'},
      {'id': 4, 'label': 'Turquoise'},
      {'id': 5, 'label': 'Cyan'},
      {'id': 6, 'label': 'Emotions'},
      {'id': 7, 'label': 'Excited'},
      {'id': 8, 'label': 'Intrigued'},
      {'id': 9, 'label': 'Adventurous'},
      {'id': 10, 'label': 'Objects'},
      {'id': 11, 'label': 'Rods'},
      {'id': 12, 'label': 'Reels'},
      {'id': 13, 'label': 'Lures'}
    ],
    'edges': [
      {'from': 1, 'to': 2},
      {'from': 2, 'to': 3},
      {'from': 2, 'to': 4},
      {'from': 2, 'to': 5},
      {'from': 1, 'to': 6},
      {'from': 6, 'to': 7},
      {'from': 6, 'to': 8},
      {'from': 6, 'to': 9},
      {'from': 1, 'to': 10},
      {'from': 10, 'to': 11},
      {'from': 10, 'to': 12},
      {'from': 10, 'to': 13}

    ]
  };

FruchtermanReingoldAlgorithm
I believe this could work if repulsionRate and attractionRate could be directional and therefore each of the categories could have force exerting in different directions pulling it apart, below I think each category could be built independently with a different build below is the code I used to map each category based on the nodes edges to the center, however, I cant figure out how to achieve directional pull so it is just ends up being a standard Fruchterman graph.

  final Map<int, Graph> separateGraphs =
      {}; // Store separate graphs for each connected node
  final Map<int, Algorithm> builders = {}; // Store the builder for each graph

  @override
  void initState() {
    var edges = json['edges']!;

    // Find nodes connected to node with ID 1
    List<int> connectedNodes = [];
    for (var edge in edges) {
      if (edge['from'] == 1) {
        connectedNodes.add(edge['to']);
      } else if (edge['to'] == 1) {
        connectedNodes.add(edge['from']);
      }
    }

    // Create separate graphs for each connected node
    for (int connectedNode in connectedNodes) {
      Graph graph = Graph();
      separateGraphs[connectedNode] = graph;

      graph.addEdge(Node.Id(1), Node.Id(connectedNode));
      edges.forEach((element) {
        if ((element['from'] == connectedNode && element['to'] != 1) ||
            (element['to'] == connectedNode && element['from'] != 1)) {
          graph.addEdge(Node.Id(element['from']), Node.Id(element['to']));
        }
      });

      builders[connectedNode] = FruchtermanReingoldAlgorithm(
          iterations: 1500,
          repulsionRate: 0.2,
          attractionRate: 0.8,
          attractionPercentage: 0.5,
          repulsionPercentage: 0.25);
    }
  }
}

BuchheimWalkerConfiguration
I think this could also achieve a mindmap like structure in a similar vain to my idea above in terms of mapping different individual mindmap orientations with the json. However, i think you run into the issue with collision between each of the independent mindmaps so I dont think this algo would be optimal.

  Widget build(BuildContext context) {
    List<GraphView> graphViews = [];
    var topLevelNodes = getTopLevelNodes();

    for (int i = 0; i < topLevelNodes.length; i++) {
      var currentNode = topLevelNodes[i];
      var subGraph = createSubGraph(currentNode);
      var currentOrientation;

      switch (i) {
        case 0:
          currentOrientation =
              BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM;
          break;
        case 1:
          currentOrientation =
              BuchheimWalkerConfiguration.ORIENTATION_LEFT_RIGHT;
          break;
        case 2:
          currentOrientation =
              BuchheimWalkerConfiguration.ORIENTATION_RIGHT_LEFT;
          break;
        default:
          currentOrientation =
              BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM;
      }

      graphViews.add(createGraphView(subGraph, currentOrientation));
    }

SugiyamaConfiguration
This could be the more suitable algo for creating the mindmap becuase it is layered and the examples look very similar to what a mindmap should look like, however with amateur knowledge I can only seem to create a typical top-down model and cant mimic the edge creation I saw in the example which is shown below, but I am curious how it can be dynamically calculated.

class _LayerGraphPageFromJsonState extends State<LayerGraphPageFromJson> {
  var  json =   {
    "edges": [
      {
        "from": "254022114",
        "to": "435737192"
      },
      {
        "from": "102061118",
        "to": "435737192"
      },
      {
        "from": "864374573",
        "to": "676874082"
      },

Apologies for the long question, just wondering which algo to use and also looking for a general direction to go into to achieve a mindmap.

@ManuelFEMartinho
Copy link

Hi @Xander0x did you manage to create a mindmap?

I'm trying to build something like the image that you've showed but with no success

@beauduffy
Copy link
Author

Sadly, not.

The project I am working on depends on this so I moved away from Flutter and decided to use react native. Can achieve it with Reactflow with Webview, plus can use React native Skia as a wrapper for rendering.

I don't think it is doable with this repo, you could look into writing an algo for it if you are sticking with flutter.

@Sternbach-Software
Copy link

Duplicate of #65

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants