在绘图的最终显示区域中查找“框架/轴”的坐标

时间:2011-04-08 02:29:41

标签: graphics image-processing wolfram-mathematica plot

如果我使用Frame进行绘图 - > True有一种方法可以在图像的绝对坐标中找到Frame角落的坐标吗?我有PlotRange和PlotRangePadding的数值,但请注意我不想以任何方式篡改实际绘图,只需找出Mathematica选择放置绘图的框架/轴的完整显示区域。

正如Brett Champion所指出的那样,我正在寻找坐标{x,y},使得Scaled [{0,0}] == ImageScaled [{x,y}]。

[请注意,我编辑了这个问题,以消除我对“缩放坐标”一词的混淆误用。]

3 个答案:

答案 0 :(得分:7)

框架的角落位于Scaled[{0,0}]Scaled[{1,1}]

完整图片(包括标签)的角落位于ImageScaled[{0,0}]ImageScaled[{1,1}]

在它们之间进行转换很难,但理论上如果您知道ScaledPlotRange的实际数字设置,则可以转换PlotRangePadding和用户(未缩放)坐标。 / p>

根据您的应用程序,您也可以使用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}}}

以下是Dreeves如何使用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}]

答案 1 :(得分:5)

框架左上角的坐标始终为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放在相同的角落:

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

编辑:根据dreeves对问题的澄清。

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. Documentation表示{Image = {/ 1}}是在ImageSize中定义的。
  2. 上面显示的图像的宽度和高度为300像素。
  3. 框架周围有30像素的边距;这相当于宽度和高度的10%。
  4. 因此,框架角应从原点开始,位于ImagePaddingImageScaled[{.1,.1}]ImageScaled[{.9,.1}& ImageScaled[{.9,.9}]
  5. 很容易计算出其他ImageScaled[{.1,.9}]AspectRatio s的值。

答案 2 :(得分:1)

一种可能性是手动控制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