Найти координаты кадра / осей в конечной области отображения графика - PullRequest
7 голосов
/ 08 апреля 2011

Если я делаю Plot with Frame-> True, есть ли способ найти координаты углов кадра в абсолютных координатах изображения?У меня есть числовые значения PlotRange и PlotRangePadding, но учтите, что я не хочу каким-либо образом вмешиваться в фактический график, просто выясните, где в полной области отображения Mathematica выбирает размещение рамки / осей графика.

Как указал Бретт Чемпион, я ищу координаты {x, y} такие, что Scaled [{0,0}] == ImageScaled [{x, y}].

[Обратите внимание, что я отредактировал этот вопрос, чтобы убрать мое запутанное неправильное использование термина «масштабированные координаты».]

Ответы [ 3 ]

7 голосов
/ 08 апреля 2011

Углы рамки в 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}]
5 голосов
/ 08 апреля 2011

Координаты верхнего левого угла рамки всегда Scaled[{0,1}].Координаты нижнего правого угла рамки всегда Scaled[{1,0}].

Давайте разместим большие точки в верхнем левом и нижнем правом углах:

Plot[Cos[x], {x, 0, 10}, Frame -> True, 
Epilog -> {PointSize[.08], Point[Scaled[{0, 1}]], Point[Scaled[{1, 0}]]} ]

Когда я нажимаю на график(см. ниже), очевидно, что вокруг рамки графика нет отступов.

no padding

Теперь, когда ImagePadding включено, давайте поместим Point s вте же углы:

Plot[Cos[x], {x, 0, 10}, Frame -> True,  
ImagePadding -> {{37, 15}, {20, 48}}, 
Epilog -> {PointSize[.08], Point[Scaled[{0, 1}]],  Point[Scaled[{1, 0}]]} ]

Point остаются в углах рамки графика.Вокруг рамки графика ImagePadding.

with padding

РЕДАКТИРОВАТЬ: Основано на разъяснении вопроса дривами.

Plot[Cos[x], {x, 1, 9}, ImageSize -> 300, AspectRatio -> 1, 
Frame -> True, ImagePadding -> 30, 
FrameTicks -> {Range[9], Automatic}, 
Epilog -> {PointSize[.08], Point[Scaled[{0, 1}]], Point[Scaled[{1, 0}]]}]

Frameticks

Я нарисовал график 300x300 для упрощения чисел.Вот анализ.

  1. Документация гласит, что ImagePadding "определено в ImageSize".
  2. Показанное выше изображение имеет ширину и высоту 300 пикселей.
  3. Вокруг кадра нарисовано поле в 30 пикселей;это соответствует 10% ширины и высоты.
  4. Таким образом, углы рамки должны быть, начиная с начала координат, в ImageScaled[{.1,.1}], ImageScaled[{.9,.1}, ImageScaled[{.9,.9}] & ImageScaled[{.1,.9}].

Легко определить значение для других AspectRatio с и ImageSize с.

1 голос
/ 08 апреля 2011

Одной из возможностей является ручное управление ImagePadding:

Plot[Sin[x], {x, 0, 10}, Frame -> True, 
 ImagePadding -> {{30, 5}, {20, 5}}]

enter image description here

ImageTake[Rasterize[%], {5, -20}, {30, -5}]

enter image description here

...