【问题标题】:Mathematica: Labels and absolute positioningMathematica:标签和绝对定位
【发布时间】:2011-06-08 05:08:33
【问题描述】:

如何在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}]
    }]
}];

在某些情况下,使用{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 属性轻松修改,对于掩码只需将 Gray 更改为您喜欢的任何颜色(例如白色)。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:
    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}]]]
    

    【讨论】:

    • 感谢您的帖子。这就是我从 Verbeia 写的内容中得出的结论。但是,您如何进行以下工作? i.imgur.com/IL5uJ.png
    • @jmlopez 请将代码贴在某处,这样我就不必重新输入了。谢谢!
    • 非常感谢。这正是我一直在寻找的。你在那里写的非常甜蜜的功能:)
    • 哎哟... Belisarius,很抱歉再次打扰您,但刚才我注意到您使用了 Rasterize。这是有问题的,因为现在当我导出为 eps 的 pdf 时,我们不再有矢量图形。你有解决这个问题的办法吗?
    • @jmlopez 也许使用未记录的 'XMLSVGGraphicsToSymbolicSVG[g]' 但不确定。有趣...
    【解决方案2】:

    使用 Inset 和使用 ImageScaled 定义的坐标可能会有一些不错的结果。 我会给你确切的代码,但我的工作机器上没有安装 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

    【讨论】:

    • 谢谢 Verbeia。我不知道为什么我从未偶然发现 ImageScaled。这需要处理绝对坐标。但是,这仅在我们将 PlotRangeClipping 设置为 False 时才有效。在某些情况下,您希望将 setPlotRangeClipping 设置为 True 但仍然能够将一些文本放在绘图区域之外。有些东西告诉我必须在这里使用 Inset,但我仍然不确定如何。
    • ImagePadding 代替 PlotRangeClipping 怎么样?
    • 这是一个示例,显示您希望 PlotRangeClipping 何时为 True。 i.imgur.com/IL5uJ.png。请注意,文本 A 仅出现在 Plot 中而不出现在外部。
    【解决方案3】:

    你可以试试 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
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多