Skip to content

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"

symbolType.draw(context, size) ​

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]