Wolfram mathematica Mathematica:标签和绝对定位

Wolfram mathematica Mathematica:标签和绝对定位,wolfram-mathematica,Wolfram Mathematica,在mathematica中,如何将文本定位在绘图之外?快速的谷歌搜索将 带你去 这还不够,因为您希望通过代码实现这一点。在mathematica中放置文本的简单示例如下: Show[ Plot[x^3, {x, -1, 1}, Frame -> True, ImageSize -> Medium, FrameLabel -> {"x", "y"}, PlotRang

在mathematica中,如何将文本定位在绘图之外?快速的谷歌搜索将 带你去

这还不够,因为您希望通过代码实现这一点。在mathematica中放置文本的简单示例如下:

    Show[ 
     Plot[x^3, {x, -1, 1},
      Frame -> True, 
      ImageSize -> Medium, 
      FrameLabel -> {"x", "y"},
      PlotRange -> {{-1, 1}, {-1, 1}}
      ],
     Graphics[
      Text[Style["A", Bold, 14, Red], {.5, .5}]]
     ]
这会将字母A放置在相对于绘图的点(.5、.5)处。是否有一种相对于图像大小放置文本的方法?据我所知,一切都是在绘图坐标系下进行的。我的临时解决方案是将选项
PlotRangeClipping
设置为
False
,并通过提供正确的坐标来设置文本

Show[
    Plot[
        x^3, {x, -1, 1}, 
        Frame -> True, 
        ImageSize -> Medium, 
        FrameLabel -> {"x", "y"}, 
        PlotRange -> {{-1, 1}, {-1, 1}}
    ],
    Graphics[
        Text[
            Style["A", Bold, 14, Red], 
            {-1.2, 1}
        ]
    ],
    PlotRangeClipping -> False
]

此方法的一个缺点是,如果更改绘图范围,则需要重新计算文本的坐标,以便将其保持在所需位置(相对于整个图像)

编辑: 尝试将
文本
A定位在绘图外

Framed[
    Show[
        Graphics[
            {Orange, Disk[{0, 0}, 3.5]}, 
            Frame -> True, 
            PlotRange -> {{-3, 3}, {-3, 3}}, 
            PlotRangeClipping -> True, 
            FrameLabel -> {"x", "y"}
        ], 
        Graphics[
            Text[
                Style["A", Bold, 14], 
                ImageScaled[{.1, .95}]
            ]
        ]
    ]
]

编辑: 为了找到这个问题的另一个解决方案,我开始了另一篇文章,这篇文章给了我一些想法来克服belisarius解决方案的一个问题:将最终的图形导出为pdf是图形的光栅化版本。请查看我的另一篇文章,了解解决方案

最终编辑? 由于图像链接已消失,并且上一次编辑中的链接已被修改,我决定 更新图像并包含Simon的修改解决方案

其思想是在绘制标签之前创建一个遮罩并包含遮罩。这样 我们正在创建自己的
plotRangeClipping

mask2D = Graphics[{Gray,
    Polygon[{
        ImageScaled[{-0.5, -0.5}],
        ImageScaled[{-0.5, 1.5}],
        ImageScaled[{1.5, 1.5}],
        ImageScaled[{1.5, -0.5}],
        ImageScaled[{-0.5, -0.5}],
        Scaled[{0, 0}],
        Scaled[{1, 0}],
        Scaled[{1, 1}],
        Scaled[{0, 1}],
        Scaled[{0, 0}],
        ImageScaled[{-0.5, -0.5}]
    }]
}];
在某些情况下,使用
{1,1}
ImageScaled
不足以剪辑主图像。因此, 我通过使用
1.5
-0.5
提供了更多的覆盖范围。现在我们可以用标签绘制图像,如下所示:

Framed@Show[
    Graphics[
        {
            Orange,
            Disk[{0, 0}, 3.5]
        },
        Frame -> True,
        PlotRange -> {{-3, 3}, {-3, 3}},
        FrameLabel -> {"x", "y"}
    ],
    mask2D,
    Graphics[
        Text[
            Style["A", Bold, 14],
            ImageScaled[{0, 1}],
            {-1, 1}
        ]
    ],
    Background -> Red
]
以下是所需的图像:


请注意,我已将图像的背景更改为红色。这可以通过更改
Background
属性轻松修改,对于遮罩,只需将
灰色
更改为您喜欢的任何颜色(例如白色)。

使用使用使用ImageScaled定义坐标的插入,您可能会获得一些好结果。 我会给你精确的代码,但我的工作机器上没有安装Mathematica

http://reference.wolfram.com/mathematica/ref/ImageScaled.html

另见:
也许你可以试试网格

Grid[{
{
   Text[Style["A",Bold,14,Red]]
},
{
   Plot[x^3,{x,-1,1},
   Frame->True,
   ImageSize->200,
   FrameLabel->{"x","y"},
   PlotRange->{{-1,1},{-1,1}}
   ]
}},Spacings->0,Alignment->Center
]

编辑

回答橙色磁盘部分时,问题在于
Show
连接了图形选项,因此Show[]命令中不能有多个
PlotRangeClipping
值。 克服这一问题的一种方法是:

InsertLabels[g_Graphics, legend__] := 
  Show[Rasterize[g], 
   Graphics[{legend}, 
    Cases[AbsoluteOptions[g], Except[PlotRangeClipping -> True]]]];

g = Graphics[
   {Gray, Disk[{0, 0}, 3.5]},
   Frame -> True,
   PlotRange -> {{-3, 3}, {-3, 3}},
   FrameLabel -> {"x", "y"},
   PlotRangeClipping -> True];

Framed@InsertLabels[g,
 Text[Style["B", Red, Bold, 18], ImageScaled[{0.95, .05}]], 
 Text[Style["A", Red, Bold, 18], ImageScaled[{0.05, .95}]]]

谢谢你,韦比娅。我不知道为什么我从来没有碰到过他。这会考虑绝对坐标。但是,只有将PlotRangeClipping设置为False时,此选项才有效。在某些情况下,您希望将PlotRangeClipping设置为True,但仍然能够将一些文本放置在打印区域之外。有些东西告诉我必须在这里使用Inset,但我仍然不确定如何使用。如何使用ImagePadding而不是PlotRangeClipping?下面是一个示例,显示了何时希望PlotRangeClipping为真。请注意,文本A只显示在绘图中,而不显示在外部。谢谢您的帖子。这就是我从Verbeia写的文章中得出的结论。但是,您如何才能完成以下工作@jmlopez请将代码发布到某个地方,这样我就不必重新键入了。格雷西亚斯!谢谢你。这正是我想要的。你在那里写的非常甜美的函数:)哎哟。。。贝里萨利斯,很抱歉再次打扰你,但刚才我注意到你用了光栅。这是有问题的,因为现在当我导出eps的pdf时,我们不再有矢量图形。您对此有解决方案吗?@jmlopez可能使用未记录的“XML
SVG
graphicsvg[g]”但不确定。有趣的。。。
InsertLabels[g_Graphics, legend__] := 
  Show[Rasterize[g], 
   Graphics[{legend}, 
    Cases[AbsoluteOptions[g], Except[PlotRangeClipping -> True]]]];

g = Graphics[
   {Gray, Disk[{0, 0}, 3.5]},
   Frame -> True,
   PlotRange -> {{-3, 3}, {-3, 3}},
   FrameLabel -> {"x", "y"},
   PlotRangeClipping -> True];

Framed@InsertLabels[g,
 Text[Style["B", Red, Bold, 18], ImageScaled[{0.95, .05}]], 
 Text[Style["A", Red, Bold, 18], ImageScaled[{0.05, .95}]]]