File: symbol.md | Updated: 11/15/2025
Return to top
Symbols
======================================================
Examples · Symbols provide a categorical shape encoding as in a scatterplot. Symbols are centered at the origin; use a transform to move the symbol to a different position.
symbol(type, size)
Source · Constructs a new symbol generator of the specified type and size . If not specified, type defaults to a circle, and size defaults to 64.
js
svg.append("path").attr("d", d3.symbol(d3.symbolCross));
symbol(...arguments)
Source
· Generates a symbol for the given arguments. The arguments are arbitrary; they are propagated to the symbol generator’s accessor functions along with the this object. With the default settings, invoking the symbol generator produces a circle of 64 square pixels.
js
d3.symbol()() // "M4.514,0A4.514,4.514,0,1,1,-4.514,0A4.514,4.514,0,1,1,4.514,0"
If the symbol generator has a context , then the symbol is rendered to this context as a sequence of path method calls and this function returns void. Otherwise, a path data string is returned.
symbol.type(type)
Source · If type is specified, sets the symbol type to the specified function or symbol type and returns this symbol generator.
js
const symbol = d3.symbol().type(d3.symbolCross);
If type is a function, the symbol generator’s arguments and this are passed through. This is convenient for use with selection.attr , say in conjunction with an ordinal scale to produce a categorical symbol encoding.
js
const symbolType = d3.scaleOrdinal(d3.symbolsFill);
const symbol = d3.symbol().type((d) => symbolType(d.category));
If type is not specified, returns the current symbol type accessor.
js
symbol.type() // () => d3.symbolCross
The symbol type accessor defaults to:
js
function type() {
return circle;
}
See symbolsFill and symbolsStroke for built-in symbol types. To implement a custom symbol type, pass an object that implements symbolType.draw .
symbol.size(size)
Source · If size is specified, sets the size to the specified function or number and returns this symbol generator.
js
const symbol = d3.symbol().size(100);
If size is a function, the symbol generator’s arguments and this are passed through. This is convenient for use with selection.attr , say in conjunction with a linear scale to produce a quantitative size encoding.
js
const symbolSize = d3.scaleLinear([0, 100]);
const symbol = d3.symbol().size((d) => symbolSize(d.value));
If size is not specified, returns the current size accessor.
js
symbol.size() // () => 100
The size accessor defaults to:
js
function size() {
return 64;
}
symbol.context(context)
Source · If context is specified, sets the context and returns this symbol generator.
js
const context = canvas.getContext("2d");
const symbol = d3.symbol().context(context);
If context is not specified, returns the current context.
js
symbol.context() // context
The context defaults to null. If the context is not null, then the generated symbol is rendered to this context as a sequence of path method calls. Otherwise, a path data string representing the generated symbol is returned.
symbol.digits(digits)
Source · If digits is specified, sets the maximum number of digits after the decimal separator and returns this symbol generator.
js
const symbol = d3.symbol().digits(3);
If digits is not specified, returns the current maximum fraction digits, which defaults to 3.
js
symbol.digits() // 3
This option only applies when the associated context is null, as when this symbol generator is used to produce path data .
symbolsFill
circlecrossdiamondsquarestartrianglewye
Source · An array containing a set of symbol types designed for filling: circle , cross , diamond , square , star , triangle , and wye . Useful for a categorical shape encoding with an ordinal scale .
js
const symbolType = d3.scaleOrdinal(d3.symbolsFill);
symbolsStroke
asteriskcirclediamond2plussquare2timestriangle2
Source · An array containing a set of symbol types designed for stroking: circle , plus , times , triangle2 , asterisk , square2 , and diamond2 . Useful for a categorical shape encoding with an ordinal scale .
js
const symbolType = d3.scaleOrdinal(d3.symbolsStroke);
symbolAsterisk
Source · The asterisk symbol type; intended for stroking.
symbolCircle
Source · The circle symbol type; intended for either filling or stroking.
symbolCross
Source · The Greek cross symbol type, with arms of equal length; intended for filling.
symbolDiamond
Source · The rhombus symbol type; intended for filling.
symbolDiamond2
Source · The rotated square symbol type; intended for stroking.
symbolPlus
Source · The plus symbol type; intended for stroking.
symbolSquare
Source · The square symbol type; intended for filling.
symbolSquare2
Source · The square2 symbol type; intended for stroking.
symbolStar
Source · The pentagonal star (pentagram) symbol type; intended for filling.
symbolTriangle
Source · The up-pointing triangle symbol type; intended for filling.
symbolTriangle2
Source · The up-pointing triangle symbol type; intended for stroking.
symbolWye
Source · The Y-shape symbol type; intended for filling.
symbolTimes
Source · The X-shape symbol type; intended for stroking.
Custom symbols
Symbol types are typically not used directly, instead being passed to symbol.type . However, you can define your own symbol type implementation should none of the built-in types satisfy your needs using the following interface. You can also use this low-level interface with a built-in symbol type as an alternative to the symbol generator.
js
const path = d3.pathRound(3);
const circle = d3.symbolCircle.draw(path, 64);
path.toString(); // "M4.514,0A4.514,4.514,0,1,1,-4.514,0A4.514,4.514,0,1,1,4.514,0"
Renders this symbol type to the specified context with the specified size in square pixels. The context implements the CanvasPathMethods interface. (Note that this is a subset of the CanvasRenderingContext2D interface!) See also d3-path .
pointRadial(angle, radius)
Examples · Source · Returns the point [x, y] for the given angle in radians, with 0 at -y (12 o’clock) and positive angles proceeding clockwise, and the given radius.
js
d3.pointRadial(Math.PI / 3, 100) // [86.60254037844386, -50]