General
Quadrant charts visualize data points across four quadrants based on two axes. They are useful for categorizing items based on two independent variables, such as priority matrices, portfolio analysis, or strategic planning.
The quadrant chart implementation in Sirena follows the established 7-file Parslet architecture pattern, ensuring consistency with other diagram types.
Architecture
Components
The quadrant chart implementation consists of seven main components:
-
Diagram Model ([
lib/sirena/diagram/quadrant.rb](lib/sirena/diagram/quadrant.rb:1))-
QuadrantChart- Main diagram model -
QuadrantPoint- Individual data point with coordinates and styling
-
-
Parslet Grammar ([
lib/sirena/parser/grammars/quadrant.rb](lib/sirena/parser/grammars/quadrant.rb:1))-
Parses
quadrantChartkeyword -
Axis definitions with labels
-
Quadrant labels (quadrant-1 through quadrant-4)
-
Data points with [x, y] coordinates
-
Point styling (radius, color, stroke)
-
-
Transform ([
lib/sirena/parser/transforms/quadrant.rb](lib/sirena/parser/transforms/quadrant.rb:1))-
Converts parse tree to QuadrantChart model
-
Extracts title, axes, quadrant labels, and points
-
-
Parser ([
lib/sirena/parser/quadrant.rb](lib/sirena/parser/quadrant.rb:1))-
Orchestrates grammar and transform
-
Provides error handling
-
-
Layout Transform ([
lib/sirena/transform/quadrant.rb](lib/sirena/transform/quadrant.rb:1))-
Calculates 2x2 grid layout
-
Converts normalized coordinates (0-1) to SVG coordinates
-
Positions points in 2D space
-
-
Renderer ([
lib/sirena/renderer/quadrant.rb](lib/sirena/renderer/quadrant.rb:1))-
Draws quadrant grid with colored backgrounds
-
Renders center axes
-
Adds axis labels and quadrant names
-
Renders data points as circles with labels
-
-
Tests ([
spec/sirena/parser/quadrant_spec.rb](spec/sirena/parser/quadrant_spec.rb:1))-
Parser tests with 17 examples
-
10 fixture files from Mermaid test suite
-
Syntax
Basic Structure
quadrantChart
title Chart Title
x-axis Low Value --> High Value
y-axis Low Impact --> High Impact
quadrant-1 Label for Top Right
quadrant-2 Label for Top Left
quadrant-3 Label for Bottom Left
quadrant-4 Label for Bottom Right
Item A: [0.3, 0.6]
Item B: [0.7, 0.8]
Features
Title Declaration
Add a title to the chart using the title keyword.
quadrantChart
title Product Analysis Matrix
x-axis Low Cost --> High Cost
y-axis Low Value --> High Value
Axis Labels
Define axis labels with start and end labels using the arrow syntax -→.
quadrantChart
x-axis Low Reach --> High Reach
y-axis Low Engagement --> High Engagement
quadrantChart
x-axis "Low Cost ❤" --> "High Cost"
y-axis "Low Value" --> "High Value"
Quadrant Labels
Label each of the four quadrants using quadrant-1 through quadrant-4.
quadrantChart
x-axis Left --> Right
y-axis Bottom --> Top
quadrant-1 Quick Wins
quadrant-2 Major Projects
quadrant-3 Fill Ins
quadrant-4 Hard Slogs
Data Points
Add data points with normalized [x, y] coordinates.
quadrantChart
x-axis Left --> Right
y-axis Bottom --> Top
Campaign A: [0.3, 0.6]
Campaign B: [0.45, 0.23]
Campaign C: [0.57, 0.69]
Point Styling
Customize point appearance with styling parameters.
quadrantChart
x-axis Left --> Right
y-axis Bottom --> Top
Product A: [0.5, 0.5] radius: 10
quadrantChart
x-axis Left --> Right
y-axis Bottom --> Top
Product B: [0.3, 0.7] radius: 8, color: #ff0000
quadrantChart
x-axis Left --> Right
y-axis Bottom --> Top
Product D: [0.1, 0.9] radius: 10, color: #ff0000, stroke-color: #00ff00, stroke-width: 3px
Available styling parameters:
- radius
-
Size of the point circle (default: 6)
- color
-
Fill color of the point (hex or named color)
- stroke-color
-
Border color of the point
- stroke-width
-
Width of the point border (can include "px" suffix)
Complete Example
quadrantChart
title Reach and engagement of campaigns
x-axis Low Reach --> High Reach
y-axis Low Engagement --> High Engagement
quadrant-1 We should expand
quadrant-2 Need to promote
quadrant-3 Re-evaluate
quadrant-4 May be improved
Campaign A: [0.3, 0.6]
Campaign B: [0.45, 0.23]
Campaign C: [0.57, 0.69]
Campaign D: [0.78, 0.34]
Campaign E: [0.40, 0.34]
Campaign F: [0.35, 0.78]
This produces a quadrant chart with:
-
A title at the top
-
X-axis labeled from "Low Reach" to "High Reach"
-
Y-axis labeled from "Low Engagement" to "High Engagement"
-
Four labeled quadrants with colored backgrounds
-
Six campaign data points positioned by their coordinates
Theming
The quadrant chart renderer integrates with Sirena’s theme system.
Configurable Colors
The following theme colors are used:
- label_text
-
Text color for labels and titles
- grid_line
-
Color for axis lines and quadrant borders
- node_stroke
-
Default stroke color for points
- primary
-
Default color for Quadrant 1 points
- secondary
-
Default color for Quadrant 2 points
- accent
-
Default color for Quadrant 3 points
- success
-
Default color for Quadrant 4 points
Implementation Notes
Model Architecture
The [QuadrantChart](lib/sirena/diagram/quadrant.rb:81) class inherits from [Diagram::Base](lib/sirena/diagram/base.rb:1) and uses Lutaml::Model for serialization.
Key methods:
-
[
diagram_type](lib/sirena/diagram/quadrant.rb:112) - Returns:quadrant -
[
valid?](lib/sirena/diagram/quadrant.rb:123) - Validates all points -
[
points_by_quadrant](lib/sirena/diagram/quadrant.rb:134) - Groups points by quadrant
The [QuadrantPoint](lib/sirena/diagram/quadrant.rb:12) class provides:
-
[
valid?](lib/sirena/diagram/quadrant.rb:37) - Ensures coordinates are in [0,1] range -
[
quadrant](lib/sirena/diagram/quadrant.rb:53) - Determines which quadrant (1-4) the point is in
Grammar Rules
The Parslet grammar in [lib/sirena/parser/grammars/quadrant.rb](lib/sirena/parser/grammars/quadrant.rb:1) handles:
-
Optional title declarations
-
X-axis and Y-axis with quoted or unquoted labels
-
Quadrant labels (quadrant-1 through quadrant-4)
-
Data points with coordinates and optional styling
-
Class definitions (for future styling support)
-
Comments
Testing
The implementation includes comprehensive tests: