如何在mathematica中将文本放置在绘图之外?快速谷歌搜索将 引导你
http://reference.wolfram.com/mathematica/howto/AddTextOutsideThePlotArea.html
这是不够的,因为你想用代码实现这一点。在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
]
这种方法的一个缺点是,如果我们改变绘图的范围,那么我们需要重新计算文本的坐标,以便将其保持在我们想要的位置(相对于整个图像)。
尝试将Text
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是该图的光栅化版本。查看我的其他帖子here以获取解决方案。
由于图像链接已经消失并且上一次编辑中的链接已被修改,我决定 更新图像并包含Simon answer的修改后的解决方案。
我们的想法是在绘制标签之前创建一个蒙版并包含蒙版。通过这种方式
我们正在创建自己的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}]
}]
}];
在某些情况下,ImageScaled
使用{1,1}
不足以剪切主图像。为此原因
我使用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
属性轻松修改,而掩码只需将Gray
更改为您喜欢的任何颜色(例如白色)。
答案 0 :(得分:5)
Plot[x^3, {x, -1, 1},
Frame -> True,
ImageSize -> Medium,
FrameLabel -> {"x", "y"},
PlotRange -> {{-1, 1}, {-1, 1}}],
PlotRangeClipping -> False,
Epilog ->
Text[Style["A", Bold, 14, Red], ImageScaled@{.05, .98}]
修改
回答你的橙色磁盘部分,问题是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}]]]
答案 1 :(得分:3)
使用带有使用ImageScaled定义的坐标的Inset可能会有一些好的结果。 我会给你一些确切的代码,但我的工作机器上没有安装Mathematica。
http://reference.wolfram.com/mathematica/ref/Inset.html http://reference.wolfram.com/mathematica/ref/ImageScaled.html
另见: http://reference.wolfram.com/mathematica/ref/Scaled.html
答案 2 :(得分:2)
可能你可以试试Grid吗?
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
]