13
$\begingroup$

Can someone help me to make a clickable graph?

  Graph[{1 -> 3, 2 -> 3, 3 -> 6, 4 -> 6, 1 -> 5, 5 -> 4, 6 -> 2}]

I found that VertexDelete removes desirable vertex and edges, but I don't know how to make it clickable and delete that vertex (and his edges) which was clicked by user.

I already have:

DynamicModule[
    { selection = {}
    , gr = {1 -> 3, 2 -> 3, 3 -> 6, 4 -> 6, 1 -> 5, 5 -> 4, 6 -> 2}
    }
  , Dynamic[
        Graph[gr
          , PlotLabel -> selection
          , VertexShapeFunction -> ( EventHandler[Disk[#1, .1]
              , "MouseClicked" :> (selection = #2; VertexDelete[gr, selection];
            )] &)
        ]
    ]
] 

but it doesn't work

$\endgroup$
15
$\begingroup$

You are almost there but VertexDelete[graph, n] or e.g. SetProperty[graph, spec] won't affect graph they way you are expecting unless you set it again: graph = VertexDelete[graph, n].

DynamicModule[{graph}
  , Dynamic[graph]
  , Initialization :> (
        graph = Graph[ 
            {1 -> 3, 2 -> 3, 3 -> 6, 4 -> 6, 1 -> 5, 5 -> 4, 6 -> 2}
          , VertexLabels -> "Name"
          , PerformanceGoal -> "Quality"
          , VertexShapeFunction -> ( EventHandler[   Disk[#1, .1]
              , "MouseClicked" :> (graph = VertexDelete[graph, #2];)
            ] & )
        ]
    )     
]

And if you want to keep original VertexCoordinates you need to set them explicitly first:

 DynamicModule[{graph}
  , Dynamic[graph]
  , Initialization :> (
        graph = Graph[ 
            {1 -> 3, 2 -> 3, 3 -> 6, 4 -> 6, 1 -> 5, 5 -> 4, 6 -> 2}
          , VertexLabels -> "Name"
          , PerformanceGoal -> "Quality"
          , VertexShapeFunction -> ( EventHandler[   Disk[#1, .1]
              , "MouseClicked" :> (graph = VertexDelete[graph, #2];)
              , Method -> "Queued" (*should help for bigger graphs*)
            ] & )
        ]
      ; graph = SetProperty[graph, 
             VertexCoordinates -> GraphEmbedding[graph]
        ]
    )     
]

enter image description here

| improve this answer | |
$\endgroup$
  • 1
    $\begingroup$ Great work! Out of curiousity, how did you make this *.gif? Any reference to where I could learn more about it? $\endgroup$ – e.doroskevic Jun 7 '16 at 8:19
  • 2
    $\begingroup$ @E.Doroskevic Thanks :) I'm using SceenToGif, quite handy. $\endgroup$ – Kuba Jun 7 '16 at 8:22
  • $\begingroup$ brilliant! Thank you very much! $\endgroup$ – e.doroskevic Jun 7 '16 at 8:24
  • 1
    $\begingroup$ "but Graphs are not mutable" In fact Graphs are, weirdly, mutable, to such an extent that some undocumented functions do this: a=Graph[...]; b=a; undocumentedGraphFunction[b] — and now a is changed as well! I know that I am being nitpicky about a small comment, but this behaviour (not your comment) has really bothered me. $\endgroup$ – Szabolcs May 9 '17 at 8:09
  • 3
    $\begingroup$ Here is a practical consequence of this mutability: the procedural solution here is much faster than the functional one. $\endgroup$ – Szabolcs May 9 '17 at 8:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.