# Centering axes in a rendered Graphics expression

When displaying a scatterplot using Graphics, is there a way to use the automatic range for the x and y axes, but force the origin to be centered in the image?

Clarification: I'm trying to force the point (0,0) to be in the center of the graphic, and the axes ranges determined appropriately. i.e. x and y:

PlotRange -> ({-Max[Abs[Data]]), (Max[Abs[Data]])}, {-Max[Abs[Data]]), (Max[Abs[Data]])})


I'm computing a few thousand graphs this way, and computing these ranges literally as above takes a while. I was hoping there were a simple Graphics option. Thanks!

• Please post code. Commented Feb 8, 2019 at 1:23

Alan has the right idea, but if you are using Graphics rather than ListPlot, then it would go like this:

SeedRandom[1]; pts = RandomInteger[100, {50, 2}];
With[{center = Mean /@ Transpose[pts]},
Graphics[Point[pts], Axes -> True, AxesOrigin -> center]]


pts = RandomReal[{0, 1}, {50, 2}]
ListPlot[pts, AxesOrigin -> (Mean /@ Transpose@pts)]

• (+1) you can use Mean@pts instead of Mean /@ Transpose@pts (Mean is Listable).
– kglr
Commented Feb 8, 2019 at 7:30
• Thanks! I clarified my question a bit, however, as this was not quite what I meant. Commented Feb 8, 2019 at 15:29

It seems difficult to use PlotRange->Automatic for this because we don't know the algorithm it uses. The function below accepts a list of points and a number sdevs which gives the number of standard deviations to include each side of the center. The example uses 3. Optional options are passed to ListPlot. Like for PlotRange->Automatic, some points may be outside the range of the plot and not shown.

pts = RandomReal[{0, 1}, {50, 2}];

centeredListPlot[points_, sdevs_, opts___] :=
Module[{xvals, yvals, cx, cy, center, sx, sy, xRange, yRange},
xyValues = Transpose@points;
(* the center *)
{cx, cy} = Mean /@ xyValues;
(* sdevs standar deviations from center *)
{sx, sy} = StandardDeviation /@ xyValues;
xRange = cx - sdevs {-sx, sx};
yRange = cy - sdevs {-sy, sy};
ListPlot[points, PlotRange -> {xRange, yRange} // Evaluate,
AxesOrigin -> {cx, cy}, opts]
]

centeredListPlot[pts, 2, PlotLabel -> "Centered Plot"]


I am not sure this is what you want.

SeedRandom@2;
data1 = RandomInteger[{-40, 40}, {50, 2}];
data2 = RandomInteger[{0, 100}, {50, 2}];
data3 = RandomInteger[{-100, 100}, {50, 2}];

data = Join @@ {data1, data2, data3};

max = Max@data;

range = {{-max, max}, {-max, max}};

ListPlot[{data1, data2, data3}, PlotRange -> range, AspectRatio -> 1,
PlotLegends -> Automatic]