Graphics 在绘图的最终显示区域中查找框架/轴的坐标
如果我用Frame->True进行绘图,有没有办法在图像的绝对坐标中找到帧角的坐标?我有PlotRange和PlotRangePadding的数值,但请注意,我不想以任何方式篡改实际绘图,只要找出Mathematica选择在完整显示区域中放置绘图帧/轴的位置即可 正如Brett Champion所指出的,我正在寻找坐标{x,y},这样缩放[{0,0}]==图像缩放[{x,y}]Graphics 在绘图的最终显示区域中查找框架/轴的坐标,graphics,image-processing,wolfram-mathematica,plot,Graphics,Image Processing,Wolfram Mathematica,Plot,如果我用Frame->True进行绘图,有没有办法在图像的绝对坐标中找到帧角的坐标?我有PlotRange和PlotRangePadding的数值,但请注意,我不想以任何方式篡改实际绘图,只要找出Mathematica选择在完整显示区域中放置绘图帧/轴的位置即可 正如Brett Champion所指出的,我正在寻找坐标{x,y},这样缩放[{0,0}]==图像缩放[{x,y}] [请注意,我编辑此问题是为了消除我对术语“缩放坐标”的误用。]一种可能是手动控制图像填充: Plot[Sin[x],
[请注意,我编辑此问题是为了消除我对术语“缩放坐标”的误用。]一种可能是手动控制图像填充:
Plot[Sin[x], {x, 0, 10}, Frame -> True,
ImagePadding -> {{30, 5}, {20, 5}}]
帧左上角的坐标始终按比例缩放[{0,1}]。 帧右下角的坐标始终按比例缩放[{1,0}] 让我们在左上角和右下角放置大型点:
Plot[Cos[x], {x, 0, 10}, Frame -> True,
Epilog -> {PointSize[.08], Point[Scaled[{0, 1}]], Point[Scaled[{1, 0}]]} ]
当我点击图表(见下图)时,很明显,绘图框架周围没有填充
现在,在启用ImagePadding
的情况下,让我们将点
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}]]} ]
点
s停留在图形框架的角落。
图框周围有ImagePadding
编辑:基于德雷夫斯对问题的澄清
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
“是在ImageSize中定义的”ImageScaled[{.1,1}]
,ImageScaled[{.9,1}
,ImageScaled[{.9,9}]
&ImageScaled[{.1,9}]
计算其他
AspectRatio
s和ImageSize
s的值很容易。帧的角点位于缩放[{0,0}]
和缩放[{1,1}]
完整图形(包括标签)的角位于ImageScaled[{0,0}]
和ImageScaled[{1,1}]
在它们之间转换很困难,尽管理论上,如果知道PlotRange
和PlotRangePadding
的实际数字设置,可以转换Scaled
和用户(未缩放)坐标
根据您的应用程序,您可能还可以使用MousePosition,它也知道这些事情
光栅化
(和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}}}
以下是德雷夫斯如何使用光栅化技巧生成一个函数,以准确返回他所寻找的内容(请注意,假设有一个全局变量imgsz
,该变量提供用于光栅化绘图的ImageSize选项——帧的坐标取决于该值):
啊,如果文本太宽,那就把它切掉。试着画Sin[x]+10^6在你的例子中。方法很好,但这个小故障是我所追求的一个破坏交易的因素。@dreeves是的,但你当然可以使用不同的值。我也不知道这是否解决了你的缩放问题。好吧,我不想弄乱原始绘图,只要找出帧边的坐标,无论mma决定放在哪里。@Dreevs您可能可以从
FullGraphics
中提取有用的信息,但这会丢失纵横比,目前我想不起如何修复它;它位于MathGroup存档中的某个位置。ps忘记了更新您的问题;修复了!是的,我的意思可能是“完全显示区域中的绝对坐标”.你知道正确的术语吗?我会更新这个问题(或者随时更新!)。哦,但是如果缩放坐标在整个显示区域的一个角处有(0,0)和(1,1)在另一个角落,缩放坐标确实会告诉我我想知道的,即实际帧的角在哪里?谢谢。有意义。我刚刚编辑了这个问题,以便更清楚地了解我真正想要的是什么:ImageScaled坐标中那些黑点的坐标是什么,其中{0,0}是整个显示区域的一角,而不仅仅是框架吗?@dreeves我试图展示如何根据它们在整个图像空间中的位置来描述框架的一角。我想现在的问题是我无法硬编码图像填充。这就是Wizard先生的答案的问题。看起来这将需要一些时间ke Brett Champion的光栅化技巧。再次感谢您的帮助!啊,这很有帮助!将缩放[{0,0}]和缩放[{1,1}]转换为ImageScaled是我想要的。即,缩放[{0,0}]==ImageScaled[{x,y}]的(x,y)是什么。我确实知道设置PlotRange和PlotRangePadding。我想我会将其添加到问题中。再次感谢Brett!哦,哇,我写评论时没有看到你的附录。因此,注释技巧似乎正是生成我想要的内容…你应该可以通过调用几个光栅化来实现这一点。使用“区域”一次,还有一次是“RasterSize”。我喜欢这样,它也可以在不修改绘图的情况下工作(称之为p
):Rasterize[Show[p,Prolog->{Annotation[Rectangle[Scaled[{0,0}],Scaled[{1,1}]],“One”,“Region”}],“Regions”]
非常感谢大家,尤其是Brett!我在Brett的答案中添加了一个函数geom,它完全符合我的要求,使用了他的光栅化技巧(我从来没有想到过!)。
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}}}
(* 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}]