Wolfram Research

Function Repository Resource:

WolframModelPlot

Source Notebook

Generate a visual display of a hypergraph

Contributed by: Wolfram Research

ResourceFunction["WolframModelPlot"][g]

generates a plot of the hypergraph g.

ResourceFunction["WolframModelPlot"][{g1,g2,}]

generates a list of plots of the hypergraphs gi.

ResourceFunction["WolframModelPlot"][data,"type"]

generates plots assuming hypergraphs of the specified type.

Details and Options

ResourceFunction["WolframModelPlot"] attempts to place vertices to give a well-laid-out version of the hypergraph.
In ResourceFunction["WolframModelPlot"][g], g should be a list of hyperedges: {{n11,n12,},{n21,},}.
Unary edges are supported and displayed as circles around the vertices.
In ResourceFunction["WolframModelPlot"][data,"type"], possible types of hypergraphs to assume include:
"Ordered" every hyperedge is interpreted as a sequence of directed edges of adjacent vertices
"Cyclic" the same as "Ordered", with an addition of a directed edge from the last vertex to the first
WolframModelPlot has the same options as Graphics, with following additions:
"ArrowheadLength" Automatic the length of arrowheads
"EdgePolygonStyle" Automatic style for hyperedge polygons
"HyperedgeRendering" "Polygons" how to render hyperedges in the hypergraph
"MaxImageSize" Automatic upper limit for the image size
EdgeStyle Automatic style for edges
GraphHighlight {} vertices and hyperedges to highlight
GraphHighlightStyle Red highlight color
PlotStyle Automatic overall style
VertexCoordinateRules {} coordinates specified for particular vertices
VertexLabels None labels for vertices
VertexSize 0.06 the size of vertices
VertexStyle Automatic style for vertices
Possible settings for "HyperedgeRendering" include:
"Subgraphs" render hyperedges as ordinary graphs
"Polygons" render hyperedges as polygons
Install the SetReplace paclet to get better performance and bleeding-edge functionality.
See the SetReplace README for a more detailed documentation.

Examples

Basic Examples

Plot a hypergraph:

In[1]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}}]
Out[1]=

Plot multiple hypergraphs:

In[2]:=
ResourceFunction[
 "WolframModelPlot"][{{{1, 2, 3}}, {{1, 2, 3}, {3, 4, 5}}, {{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}}]
Out[2]=

Plot a cyclic hypergraph:

In[3]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}}, "Cyclic"]
Out[3]=

Scope

Unary edges are shown as circles around the vertices:

In[4]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4}, {4, 3}, {4, 5, 6}, {1}, {6}, {6}}]
Out[4]=

Self-loops are shown as convex polygons around the appropriate number of circular arrows:

In[5]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 1, 1}, {1, 2, 3}, {3, 4, 4}}]
Out[5]=

Note the difference between a hyper-self-loop and two binary edges pointing in opposite directions:

In[6]:=
ResourceFunction["WolframModelPlot"][{{1, 2, 1}, {2, 3}, {3, 2}}]
Out[6]=

Multiedges are shown as multiple arrows and polygons:

In[7]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {3, 4, 5}, {1, 6, 6}, {1, 6, 6}}]
Out[7]=

Options

GraphHighlight

Highlight some vertices and edges:

In[8]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, GraphHighlight -> {{1, 2, 3}, 4, {9}}]
Out[8]=

GraphHighlightStyle

Change the color of the highlight:

In[9]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, GraphHighlight -> {{1, 2, 3}, 4, {9}}, GraphHighlightStyle -> Darker@Green]
Out[9]=

HyperedgeRendering

Unroll each hypergraph to a sequence of binary edges:

In[10]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, "HyperedgeRendering" -> "Subgraphs"]
Out[10]=

VertexCoordinateRules

Specify custom coordinates for the vertices:

In[11]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}}, VertexCoordinateRules -> {1 -> {0, 0}, 2 -> {1, 0}, 3 -> {0, 1}}]
Out[11]=

VertexLabels

Display the labels for vertices:

In[12]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}}, VertexLabels -> Automatic]
Out[12]=

VertexSize

Make vertices appear larger:

In[13]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3, 4}, {1, 5, 6}, {2, 7, 8}, {4, 6, 9}}, VertexSize -> 0.1]
Out[13]=

ArrowheadLength

Make arrowheads appear larger:

In[14]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3, 4}, {1, 5, 6}, {2, 7, 8}, {4, 6, 9}}, "ArrowheadLength" -> 0.3]
Out[14]=

MaxImageSize

Reduce the maximum image size, but keep small hypergraphs small:

In[15]:=
ResourceFunction["WolframModelPlot"][{{{1}}, {{1, 1}}, {{1, 2, 3}}}, "MaxImageSize" -> 100]
Out[15]=

PlotStyle

Specify an overall style:

In[16]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, PlotStyle -> Orange]
Out[16]=

VertexStyle

Specify a style for vertices:

In[17]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, VertexStyle -> Orange]
Out[17]=

Styles for each vertex can be given as a List:

In[18]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, VertexStyle -> ColorData[98] /@ Range[9]]
Out[18]=

Styles for different vertex patterns can be given as an Association:

In[19]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, VertexStyle -> <|_?OddQ -> Red|>]
Out[19]=

EdgeStyle

Specify a style for edges:

In[20]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, EdgeStyle -> Orange]
Out[20]=

Styles for each edge can be given as a List:

In[21]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, EdgeStyle -> ColorData[98] /@ Range[6]]
Out[21]=

Styles for different edge patterns can be given as an Association:

In[22]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, EdgeStyle -> <|{_} -> Darker@Blue, {_, _} -> Darker@Green, {_, _, _} -> Darker@Red, {_, _, _, _} -> Darker@Yellow|>]
Out[22]=

EdgePolygonStyle

Specify a style for edge polygons:

In[23]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, "EdgePolygonStyle" -> LightOrange]
Out[23]=

This can be specified independently from the style for edge lines:

In[24]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4, 9}, {9}}, EdgeStyle -> Red, "EdgePolygonStyle" -> LightOrange]
Out[24]=

Properties and Relations

WolframModelPlot is used in various properties of WolframModel:

In[25]:=
ResourceFunction[
  "WolframModel"][{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, w}}, {{0, 0}, {0, 0}}, 10, "FinalStatePlot"]
Out[25]=

It is also used in RulePlot:

In[26]:=
RulePlot[ResourceFunction[
   "WolframModel"][{{1, 2}, {1, 2}} -> {{3, 2}, {3, 2}, {2, 1}, {1, 3}}]]
Out[26]=

Possible Issues

It may be hard to see the boundaries between hyperedges:

In[27]:=
ResourceFunction["WolframModelPlot"][{{3, 1, 2}, {2, 4, 3}}]
Out[27]=

Using different colors for each edge might help:

In[28]:=
ResourceFunction["WolframModelPlot"][{{3, 1, 2}, {2, 4, 3}}, EdgeStyle -> <|_ :> RandomColor[]|>]
Out[28]=

Manually specifying coordinates might break the scaling, so vertices and arrowheads may appear too large relative to the distance between vertices:

In[29]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}}, VertexCoordinateRules -> {1 -> {0, 0}, 2 -> {1, 0}}]
Out[29]=

Manually reduce the vertex/arrowhead sizes to get a better-looking image:

In[30]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}}, VertexCoordinateRules -> {1 -> {0, 0}, 2 -> {1, 0}}, VertexSize -> 0.03, "ArrowheadLength" -> 0.06]
Out[30]=

Neat Examples

Make polygon art by getting rid of the vertices and arrowheads:

In[31]:=
ResourceFunction[
 "WolframModelPlot"][{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}, {7, 8, 9}, {9, 10, 1}}, "Cyclic", "ArrowheadLength" -> 0, VertexSize -> 0, VertexStyle -> Transparent]
Out[31]=

Make an unordered hypergraph plot by specifying a custom edge style:

In[32]:=
ResourceFunction[
 "WolframModelPlot"][{{1}, {1, 2}, {2, 3}, {3, 4, 5}, {5, 6, 7, 1}}, "ArrowheadLength" -> 0, EdgeStyle -> <|{_, _, _ ..} -> Transparent|>,
  "EdgePolygonStyle" -> <|{_, _, _ ..} -> Directive[Hue[0.63, 0.66, 0.81], Opacity[0.1], EdgeForm[Directive[Hue[0.63, 0.7, 0.5], Opacity[0.7]]]]|>]
Out[32]=

Display binary and ternary edges in different colors:

In[33]:=
ResourceFunction["WolframModelPlot"][
 ResourceFunction[
   "WolframModel"][{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} -> {{7, 1, 8}, {9, 3, 10}, {11, 4, 12}, {13, 6, 14}, {7, 13}, {13, 7}, {8, 10}, {10, 8}, {9, 11}, {11, 9}, {12, 14}, {14, 12}}, {{1, 2, 3}, {4, 5, 6}, {1, 4}, {4, 1}, {2, 5}, {5, 2}, {3, 6}, {6, 3}}, 6,
   "FinalState"], EdgeStyle -> <|{_, _} -> Darker@Green, {_, _, _} -> Darker@Red|>]
Out[33]=

Resource History

Related Resources

License Information