如果我使用Frame进行绘图 - > True有一种方法可以在图像的绝对坐标中找到Frame角落的坐标吗?我有PlotRange和PlotRangePadding的数值,但请注意我不想以任何方式篡改实际绘图,只需找出Mathematica选择放置绘图的框架/轴的完整显示区域。
正如Brett Champion所指出的那样,我正在寻找坐标{x,y},使得Scaled [{0,0}] == ImageScaled [{x,y}]。
[请注意,我编辑了这个问题,以消除我对“缩放坐标”一词的混淆误用。]
答案 0 :(得分:7)
框架的角落位于Scaled[{0,0}]
和Scaled[{1,1}]
。
完整图片(包括标签)的角落位于ImageScaled[{0,0}]
和ImageScaled[{1,1}]
。
在它们之间进行转换很难,但理论上如果您知道Scaled
和PlotRange
的实际数字设置,则可以转换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}]]} ]
当我点击图表(见下文)时,很明显图表框架周围没有填充。
现在,在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
。
编辑:根据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}]]}]
我将绘图绘制为300x300以简化数字。 这是分析。
ImagePadding
,ImageScaled[{.1,.1}]
,ImageScaled[{.9,.1}
& ImageScaled[{.9,.9}]
。很容易计算出其他ImageScaled[{.1,.9}]
和AspectRatio
s的值。
答案 2 :(得分:1)
一种可能性是手动控制ImagePadding:
Plot[Sin[x], {x, 0, 10}, Frame -> True,
ImagePadding -> {{30, 5}, {20, 5}}]
ImageTake[Rasterize[%], {5, -20}, {30, -5}]