Our configurable Graph view provides an option to add a legend for the graph. A legend provides end users with an explanation of the graph objects (nodes, edges, and ports), and makes reading the graph easier.
The legend is configured by specifying a legend label and activating the legend option. The configuration of a legend requires the use of node, edge and port styles depending on what you would like to include in the legend.
This article provides two examples. The first one is a simple example in a small context, and the second example is a complete, real case example.
Prerequisites
- Configuring Graphs
- An installation of SystemWeaver version R37 or later
Explanation of the Configuration Elements
- <Legend/> indicates whether to show the legend option in the graph view or not.
- <NodeStyle ... legendLabel="StringValue"/> the attribute legendlabel in the tag <NodeStyle> specifies the text to be added to the legend for this node style.
- <EdgeStyle ... legendLabel="StringValue"/> the attribute legendlabel in the tag <EdgeStyle> specifies the text to be added to the legend for this edge style.
- <PortStyle ... legendLabel="StringValue"> the attribute legendlabel in the tag <PortStyle> specifies the text to be added to the legend for this port style.
- <Node .../> the attribute style in the tag <Node> refers to the name of a NodeStyle element.
- <Edge .../>the attribute style in the tag <Node> refers to the name of a EdgeStyle element.
- <Port../> the attribute style in the tag <Port> refers to the name of a PortStyle element.
Simple Case Example
Example Data
A graph that has only one node, which is connected to itself.
Example Configuration
<Graph> <Options> <Legend/> </Options> <NodeStyles> <NodeStyle name="nodeStyle1" fillColor="#8F3A84" fillColor2="#FFFFFF" borderThickness="1" borderColor="#111414" borderType="dash" visibleHeader="true" legendLabel="Node description"/> </NodeStyles> <EdgeStyles> <EdgeStyle name="edgeStyle1" color="#34AE52" thickness="1" lineType="dash" fromArrowType="none" toArrowType="none" legendLabel="Edge description"/> </EdgeStyles> <Node style="nodeStyle1"/> <Edge from="." to="." style="edgeStyle1"/> </Graph
Example Result
Tip: Select a legend label description text that is long enough to view, but not too long in length. |
Note: If no node and edge styles are specified, the legend will only show the Default styles for both node and edge. |
Complete Real Case (Safety case GSN) Example
Example Data
A graph to visualize a safety case using GSN notation. The example is only meant to show where the tags <Legend>, <NodeStyle>,<EdgeStyle>, <Node>, and <Edge> fit into a larger configuration. The other elements are of no importance in the context of this article.
Example Configuration
<Graph> <Options> <ObjIcons/> <Legend/> </Options> <Layout name="incrementalHierarchical"> <Setting name="layoutOrientation" value="topToBottom" /> </Layout> <NodeStyles> <NodeStyle name="GSN" fillColor="#ffffff" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="GSN safety case"/> <NodeStyle name="Context" fillColor="#ffcccc" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Context"> <Shape> <Rectangle cornerRadius="30"/> </Shape> </NodeStyle> <NodeStyle name="Goal" fillColor="#efffdf" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Goal"> <Shape> <Rectangle/> </Shape> </NodeStyle> <NodeStyle name="Strategy" shapeType="parallelogram" fillColor="#7acfff" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Strategy"> <Shape> <Parallelogram/> </Shape> </NodeStyle> <NodeStyle name="Justification" shapeType="ellipse" fillColor="#bdc3c7 " fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Justification"> <Shape> <Ellipse/> </Shape> </NodeStyle> <NodeStyle name="Assumption" shapeType="ellipse" fillColor="#f4d03f " fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Assumption"> <Shape> <Ellipse/> </Shape> </NodeStyle> <NodeStyle name="Solution" shapeType="circle" fillColor="#F5DEB3" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Solution"> <Shape> <Circle diameter="225"/> </Shape> </NodeStyle> <NodeStyle name="Module" shapeType="circle" fillColor="#FFDFFF" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Module"> <Shape> <Circle diameter="200"/> </Shape> </NodeStyle> <NodeStyle name="Contract" shapeType="ellipse" fillColor="#FFFFFF" fillColor2="#ffffff" borderThickness="1" borderColor="#000000" legendLabel="Contract"> <Shape> <Ellipse/> </Shape> </NodeStyle> </NodeStyles> <EdgeStyles> <EdgeStyle name="SupportedBy" fillColor="#000000" thickness="2" lineType="solid" fromArrowType="none" toArrowType="default" legendLabel="SupportedBy"/> <EdgeStyle name="InContextOf" fillColor="#000000" thickness="2" lineType="solid" fromArrowType="none" toArrowType="triangle" legendLabel="InContextOf"/> </EdgeStyles> <Node style="GSN"> <ApplyTemplate name="addGraphObjects"/> </Node> <Template name="addGraphObjects"> <Context name="GSNContext"> <AddParts owner="main" sid="ISGO" part="GoalToSubgoal" defobj="Goal"/> <AddParts owner="main" sid="ISCON" part="GoalToContext" defobj="Context"/> <AddParts owner="main" sid="ISSOL" part="GoalToSolution" defobj="Solution"/> <AddParts owner="main" sid="ISJU" part="GoalToJustification" defobj="Justification"/> <AddParts owner="main" sid="I2SCAS" part="GoalToAssumption" defobj="Assumption"/> <AddParts owner="main" sid="MODUL" part="GoalToModule" defobj="Module"/> <AddParts owner="main" sid="CONTRCT" part="GoalToContract" defobj="Contract"/> <AddParts owner="Goal" sid="ISCON" part="GoalToContext" defobj="+Context"/> <AddParts owner="Goal" sid="ISSOL" part="GoalToSolution" defobj="+Solution"/> <AddParts owner="Solution" sid="I2SOLIT" part="SolutionToSolItem" defobj="SolItem"/> <AddParts owner="Goal" sid="I2SCAS" part="GoalToAssumption" defobj="+Assumption"/> <AddParts owner="Goal" sid="ISJU" part="GoalToJustification" defobj="+Justification"/> <AddParts owner="Goal" sid="MODUL" part="GoalToModule" defobj="+Module"/> <AddParts owner="Goal" sid="CONTRCT" part="GoalToContract" defobj="+Contract"/> <!-- Extensions --> <AddParts owner="Goal" sid="I2RQ" part="GoalToRequirement" defobj="Requirement"/> </Context> <ForEachInContext name="GSNContext" group="Goal"> <Choose> <When test="SID='26SCSTR'"> <Node style="Strategy" caption="S_#{? @IDGO + NewLine + Name}"/> </When> <Otherwise> <Node style="Goal" caption="G_#{? @IDGO + NewLine + Name}"/> </Otherwise> </Choose> <ContextGoForwardToPart part="GoalToSubgoal"> <Edge from="Owner" to="DefObj" style="SupportedBy"/> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToSolution"> <Edge from="Owner" to="DefObj" style="SupportedBy"/> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToJustification"> <Edge from="Owner" to="DefObj" style="InContextOf"/> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToStrategy"> <Edge from="Owner" to="DefObj" style="SupportedBy"/> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToAssumption"> <Edge from="Owner" to="DefObj" style="InContextOf"/> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToRequirement"> <Edge from="Owner" to="DefObj" /> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToContext"> <Edge from="Owner" to="DefObj" style="InContextOf"/> </ContextGoForwardToPart> <!-- Extensions --> <ContextGoForwardToPart part="GoalToRequirement"> <Edge from="Owner" to="DefObj" /> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToModule"> <Edge from="Owner" to="DefObj" /> </ContextGoForwardToPart> <ContextGoForwardToPart part="GoalToContract"> <Edge from="Owner" to="DefObj" /> </ContextGoForwardToPart> </ForEachInContext> <ForEachInContext name="GSNContext" group="Solution"> <Node style="Solution" caption="Sn_#{? @IDGO + NewLine + Name}" /> <ContextGoForwardToPart part="SolutionToSolItem"> <Edge from="Owner" to="DefObj" /> </ContextGoForwardToPart> </ForEachInContext> <ForEachInContext name="GSNContext" group="Justification"> <Node style="Justification" caption="J_#{? @IDGO + NewLine + Name}" /> </ForEachInContext> <ForEachInContext name="GSNContext" group="Assumption"> <Node style="Assumption" caption="A_#{? @IDGO + NewLine + Name}"/> </ForEachInContext> <ForEachInContext name="GSNContext" group="Context"> <Node style="Context" caption="C_#{? @IDGO + NewLine + Name}" /> </ForEachInContext> <ForEachInContext name="GSNContext" group="SolItem"> <Node/> </ForEachInContext> <ForEachInContext name="GSNContext" group="Module"> <Node caption="#{? 'Module Reference: ' + Name}"> <ApplyTemplate name="addGraphObjects"/> </Node> </ForEachInContext> <ForEachInContext name="GSNContext" group="Contract"> <Node caption="#{? 'Contract Module Reference: ' + Name}"> <ApplyTemplate name="addGraphObjects"/> </Node> </ForEachInContext> <!-- Extensions --> <ForEachInContext name="GSNContext" group="Requirement"> <Node style="Requirement" /> </ForEachInContext> </Template> </Graph>