Углы рамки в Scaled[{0,0}]
и Scaled[{1,1}]
.
Углы полной графики (включая метки): ImageScaled[{0,0}]
и ImageScaled[{1,1}]
.
Преобразование между ними затруднительно, хотя теоретически можно преобразовать Scaled
и пользовательские (немасштабированные) координаты, если вы знаете фактические числовые настройки для PlotRange
и PlotRangePadding
.
В зависимости от вашего приложения вы также можете использовать MousePosition, который также знает эти вещи.
Rasterize
(и экспорт HTML) также знают, как найти ограничивающие рамки аннотаций в системе координат растрового изображения / пикселя:
In[33]:= Rasterize[
Plot[Sin[x], {x, 0, 10}, Frame -> True,
Prolog -> {LightYellow,
Annotation[Rectangle[Scaled[{0, 0}], Scaled[{1, 1}]], "One",
"Region"]}], "Regions"]
Out[33]= {{"One", "Region"} -> {{22., 1.33573}, {358.9, 209.551}}}
Вот как Дрювс использовал этот трюк Rasterize, чтобы заставить функцию возвращать именно то, что он искал (обратите внимание на предположение о глобальной переменной imgsz
, которая дает опцию ImageSize для растеризации графика - координаты кадра зависят на это значение):
(* Returns the geometry of the frame of the plot:
{width, height, x offset, y offset, total width, total height}. *)
geom[p_Graphics] := Module[{q, x1, y1, x2, y2, xmax, ymax},
q = Show[p, Prolog->{Annotation[Rectangle[Scaled[{0,0}], Scaled[{1,1}]],
"MAGIC00","MAGIC11"]}];
{{x1,y1}, {x2,y2}} = Rasterize[q, "Regions", ImageSize->imgsz][[1,2]];
{xmax,ymax} = Rasterize[p, "RasterSize", ImageSize->imgsz];
{x2-x1, y2-y1, x1, y1, xmax, ymax}]