Mathematica:标签和绝对定位

jml*_*pez 5 wolfram-mathematica

如何在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}]]
     ]
Run Code Online (Sandbox Code Playgroud)

这将字母A放置在相对于图的点(.5,.5)处.有没有办法相对于图像的大小放置文本?据我所知,一切都在情节坐标中完成.治标不治本我是设置选项PlotRangeClippingFalse并给予正确的坐标设置文本.

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
]
Run Code Online (Sandbox Code Playgroud)

currentsolution

这种方法的一个缺点是,如果我们改变绘图的范围,那么我们需要重新计算文本的坐标,以便将其保持在我们想要的位置(相对于整个图像).

编辑:

尝试将TextA放在情节之外.

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}]
            ]
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:

为了找到这个问题的另一个解决方案,我开始了另一个帖子,它给了我一些想法来克服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}]
    }]
}];
Run Code Online (Sandbox Code Playgroud)

在使用某些情况下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
]
Run Code Online (Sandbox Code Playgroud)

这是所需的图像:

在此输入图像描述

请注意,我已将图像的背景更改为红色.这可以通过更改Background属性轻松修改,并且掩码只需更改Gray为您喜欢的任何颜色(白色).

Dr.*_*ius 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}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

回答你的橙色磁盘部分,问题是Show连接图形选项,所以你不能PlotRangeClipping在Show []命令中有几个值.解决这个问题的一种方法是:

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}]]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述