KAHIBARO
Discord Login Register

9.4. Marker Styles

Marker types

Markers in ROOT are small symbols used to display individual data points on graphs and in some histogram styles. Choosing the right marker type makes your plots easier to read and interpret, especially when you compare several datasets on the same axes.

In ROOT, marker types are controlled by the marker style attribute, set with the method SetMarkerStyle(Int_t style). The style is an integer code that chooses which symbol is drawn at each point.

Some commonly used marker styles are summarized in the table below.

Style codeDescriptionTypical use
1No markerLines only, or invisible markers
2Plus signSimple marker, good for dense points
3AsteriskEmphasized points, not too dense datasets
4Small crossAlternative to plus sign
5Large dotProminent single points
20Full circleGeneral purpose, common in publications
21Full squareDistinguish one dataset from circles
22Full triangle upData with an ordering or hierarchy
23Full triangle downPaired with triangle up for two datasets
24Open circleWhen you want to see overlapping points
25Open squareVariant of square with hollow interior
26Open triangle upCombine with filled markers on same plot
28Open triangle downAs above, for contrast

To change the marker type of an object that supports markers, such as a TGraph or a histogram drawn with a marker style, you call

cpp
graph->SetMarkerStyle(20);

or

cpp
hist->SetMarkerStyle(24);

You can check the current style with GetMarkerStyle() if needed.

There are two broad categories of marker styles. Filled markers have solid interiors, like style 20 or 21. Open markers have empty interiors with only an outline, like style 24 or 25. Filled markers are easier to see on printed plots and in presentations, especially when the points are small. Open markers are useful when points overlap heavily, since you can still see underlying information through the hollow center.

When plotting multiple datasets together, combine different marker types so that each dataset can be distinguished even if the figure is printed in grayscale. For example, use filled circles for one sample, open squares for another, and filled triangles for a third. Avoid using too many similar shapes such as several different kinds of triangles, unless you clearly explain the legend. The key idea is that the marker type itself encodes which dataset a point belongs to, independently of color.

Some draw options tell ROOT to use markers explicitly. For example, graphs drawn with graph->Draw("AP") will show both axes and markers, while a histogram drawn with hist->Draw("P") or hist->Draw("PE") will represent bin contents with markers at the bin centers. Knowing which draw option activates markers helps you understand when your chosen marker type will actually appear.

Important rule: Always combine marker types with a clear legend. Marker type alone is not enough if the legend does not document which dataset each symbol represents.

Marker size

Marker size controls how large each symbol appears on the plot. In ROOT, you set the marker size with

cpp
object->SetMarkerSize(Double_t size);

where size is a dimensionless scaling factor. A value of 1.0 is considered the default size. Smaller values create smaller markers, for example 0.7, and larger values, such as 1.2 or 1.5, produce bigger symbols.

You can read back the current size with

cpp
double s = object->GetMarkerSize();

Marker size is relative to the axis and canvas dimensions, not in pixels directly. This means the same size value can appear slightly different on canvases with very different aspect ratios, or when exported to various formats. If you are preparing publication quality figures, you may need to fine tune the size parameter and check the result in the final output format, such as PDF.

Choosing a proper marker size depends on the density of your data and the intended audience:

If the plot has many points that are close to each other, relatively small markers help prevent the figure from becoming a solid black or colored band. In these cases, combining a small marker size around 0.7 with a thin line is often more readable.

If the plot has only a few points, you can increase the marker size to make each point stand out. Sizes of 1.2 to 1.5 are common for sparse data or key measurements that you want the reader to focus on.

If you will present the plot on a projector or in a slide deck, markers need to be larger than for a printed page so that people in the back of the room can still see them clearly.

Compare the qualitative effects in this reference table.

SituationSuggested marker size range
Very dense scatter plot0.5 to 0.7
Typical ROOT graph on paper0.8 to 1.0
Few points, emphasize each point1.2 to 1.5
Conference slides or talk1.3 to 1.8

Be careful when changing both marker size and line width together. Very thick lines combined with very large markers can hide fine structure in the data and make it difficult to see uncertainties or shape details.

If you overlay several datasets, you can vary marker size slightly between them to increase contrast. For example, use size 1.0 for one dataset and 1.3 for another, together with different marker types. Do not overuse this effect, because too many different sizes in the same plot can be visually confusing.

Important rule: Adjust marker size according to data density and output medium. Markers must be large enough to see individually, but not so large that they cover important features or hide overlapping information.

Marker color

Marker color controls the color used to draw the symbol for each data point. In ROOT, the marker color is set with

cpp
object->SetMarkerColor(Color_t color);

or equivalently

cpp
object->SetMarkerColorAlpha(Color_t color, Float_t alpha);

if you want transparency. The Color_t is usually given as an integer code. ROOT provides a default palette of color indices that you can use directly.

Some common predefined color codes are listed below.

Color codeColor name
1Black
2Red
3Green
4Blue
5Yellow
6Magenta
7Cyan
8Dark green
9Purple
38Dark blue
46Orange

To set marker color to red, for example, use

cpp
graph->SetMarkerColor(kRed);

or

cpp
graph->SetMarkerColor(2);

kRed, kBlue, kBlack and similar names are ROOT constants that correspond to the integer codes, and they make code more readable. There are many variants like kRed+1, kBlue-4, and so on, which create slightly different shades.

For more control, including transparency, you can use

cpp
graph->SetMarkerColorAlpha(kBlue, 0.7);

Here, the alpha value ranges from 0 to 1.0, where 0 is fully transparent and 1.0 is fully opaque. Transparency can be useful when many points overlap.

When styling markers, remember that color should complement, not replace, differences in marker type. Many people will print your plots in black and white or view them on low quality projectors. If you rely only on color to distinguish datasets, some curves or point sets may become indistinguishable in such conditions. A robust strategy is to assign each dataset both a unique marker type and a distinct color.

Use high contrast colors for key datasets. For example, black filled circles, blue squares, and red triangles are easy to distinguish. Avoid very light colors for primary data points since they may become hard to see on a white background or when printed.

The background and axis themes also matter. If you draw on a white background, dark colors work best. On a dark background, which is less common in publications but may appear in presentations, you should pick light marker colors like yellow or light cyan so that the points stay visible.

If you plan to prepare figures that are friendly for color blind readers, avoid pairs of colors that are difficult to distinguish in common color vision deficiencies, such as pure red and green. Instead, combine choices such as blue and orange, or use different shapes and line styles to reinforce the distinction.

You can query the current marker color with

cpp
int c = object->GetMarkerColor();

and then print or log this value if you want to verify your styling programmatically.

Important rules:
Use both marker color and marker type to distinguish datasets, so the plot remains readable in grayscale and for color blind viewers.
Avoid low contrast colors between markers and background, or between different datasets that must be compared directly.

Views: 13

Comments

Please login to add a comment.

Don't have an account? Register now!