There is a way to specify scaled sizes of the plot markers explicitly via the PlotMarkers
option. Citing the Documentation page for PlotMarkers
(under the "Details" section):
With PlotMarkers -> {g, s}
, the object g
is scaled so that one unit of its coordinates corresponds to a fraction s
of the width of the whole graphic.
This statement is slightly incorrect because the specification PlotMarkers -> {g, s}
(where g
has Head
Graphics
) is directly translated by ListPlot
into
Inset[g, pos, Automatic, Scaled[{s, s}]]
(where pos
is coordinates of a datapoint) what can be seen from InpuForm
of generated graphics:
First@Cases[
ListPlot[{0, 1, 3, 4, 5}, PlotMarkers -> {{Graphics[Disk[]], .1}}],
_Inset, -1] /. _Graphics -> g
Inset[g, {1., 0.}, Automatic, Scaled[{0.1, 0.1}]]
So a more correct statement would be:
With PlotMarkers -> {g, s}
, the object g
with head Graphics
is scaled so that its size is equal to a fraction s
of the whole plotting range.
For the case in the question a solution may be written as follows:
ListPlot[{{{1, 1}}, {{2, 2}}, {{3, 3}}}, PlotRange -> {{0, 4}, All},
PlotMarkers -> ({Graphics[#], .1} & /@ {Circle[{0, 0}, 1], Disk[{0, 0}, 1],
Disk[{0, 0}, 1, {0, 4}]})]
Note that you don't have to use Scaled
radii/coordinates in this case (although you can if you have a good reason for this).
Note also that if you wrap your primitives by List
, then they will be styled automatically according to PlotStyle
option:
ListPlot[{{{1, 1}}, {{2, 2}}, {{3, 3}}}, PlotRange -> {{0, 4}, All},
PlotMarkers -> ({Graphics[{#}], .1} & /@ {Circle[{0, 0}, 1], Disk[{0, 0}, 1],
Disk[{0, 0}, 1, {0, 4}]})]