开发者

Mathematica: Labels and absolute positioning

How do you position a text outside a plot in mathematica? A quick google search will lead you to

http://reference.wolfram.com/mathematica/howto/AddTextOutsideThePlotArea.html

This is not enough since you want to achieve this with code. A simple example of placing text in mathematica is the following:

    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}]]
     ]

This places the letter A at the point (.5, .5) relative to the plot. Is there a way of placing text relative to the size of image? Everything is done in the plot coordinates a开发者_如何转开发s far as I know. The temporary solution I have is to set the option PlotRangeClipping to False and set the text by giving the right coordinates.

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
]

Mathematica: Labels and absolute positioning

A disadvantage of this method is that if we change the range of the plot then we need to recalculate the coordinates of the text in order to keep it where we want it (relative to the whole image).

EDIT:

Try to position the Text A outside the plot.

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}]
            ]
        ]
    ]
]

Mathematica: Labels and absolute positioning

EDIT:

In order to find another solution to this problem I started another post which gave me ideas to overcome a problem that belisarius solution had: Exporting the final figure to pdf was a rasterized version of the figure. Check my other post here for the solution.

FINAL EDIT?

Since the image links are gone and the link in the previous edit has been modified I decided to update the images and include a modified solution of Simon's answer.

The idea is to create a mask and include the mask before drawing the labels. In this way we are creating our own 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}]
    }]
}];

In some cases using ImageScaled of {1,1} is not enough to clip the main image. For this reason I have given more coverage by using 1.5 and -0.5. Now we can draw the image with label as follows:

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
]

Here is the desired image:

Mathematica: Labels and absolute positioning

Notice that I have changed the background of the image to red. This can easily be modified by changing the Background property and for the mask simply change Gray to whatever color you prefer (White) for instance.


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}]

Mathematica: Labels and absolute positioning

Edit

Answering your orange disk part, the problem is that Show concatenates the Graphics Options, so you can't have several values for PlotRangeClipping inside a Show[ ] command. One way to overcome that is:

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}]]]

Mathematica: Labels and absolute positioning


You might have some good results using Inset with coordinates defined using ImageScaled. I'd give you exact code but I don't have a Mathematica install on my work machine.

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

See also: http://reference.wolfram.com/mathematica/ref/Scaled.html


May be you can try 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
]

Mathematica: Labels and absolute positioning

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜