9
$\begingroup$

I want to put somewhat complicated, or at least non-standardly formatted, text on some of my graphics. For example, I'd like to be able to use f^[4](x) (where the ^[4] should obviously be a superscript rather than f^(4)[x] for the fourth derivative as a plot label. I'd like to control the formatting of various mathematical objects (for example, I'd like x^2+x+1 to be written that way rather than as 1+x+x^2), and the like.

The only way I've found for doing this is actually building up the string using StyleBox'es, which is both time-consuming and ugly. Am I missing something?

$\endgroup$
4

2 Answers 2

12
$\begingroup$

The general answer for what you appear to be doing is to wrap your expressions in HoldForm. However, it depends on how you include the expression. For example, here I'm using PlotLabel and have no problem:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> x^2 + x + 1] 

plotlabel

However, what if I want to permute the order of the terms to x + 1 + x^2? Then HoldForm does the job:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> HoldForm[x + 1 + x^2]]

plotlabel 2

Edit

I just noticed the second part of your question about the derivative format. The documentation on formatting is indeed somewhat confusing because it's spread through different pages. Maybe that has to do with the fact that there are so many different methods that it's hard to identify the "officially preferred" approach. I'm thinking, for example, of the Notation package which seems like it's supposed to make custom notation easier but which is actually a bit clumsy to use.

The default style for labels in plots is TraditionalForm, so I'll restrict the style modifications to that particular output form. Here is one way that you could make plot labels appear with the formatting for derivatives that you describe in the question:

Derivative /: 
 MakeBoxes[Derivative[\[Alpha]__][f1_][vars__Symbol], 
  TraditionalForm] := RowBox[
  Flatten@{SuperscriptBox[ToBoxes[f1], 
     RowBox[Flatten@{"[", Riffle[Map[ToBoxes, {\[Alpha]}], ","], 
        "]"}]], "(", Riffle[Map[ToBoxes, {vars}], ","], ")"}]

Now you should be able to do the following:

Plot[x^2 + x + 1, {x, 0, 1}, PlotLabel -> HoldForm[f'[x]]]

and the plot label will look like this:

$f^{[1]}(x)$

I added some extra logic to the style definition to make it work with higher-order derivatives and many variables, too.

As another example, you would input a mixed higher-order derivative like HoldForm[Derivative[1, 2][f][x, y]] and the display would be

$f^{[1,2]}(x,y)$

This modification will affect the display of all derivatives that were entered using the Derivative keyword when the output format is TraditionalForm. So if you want it to appear that way when TraditionalForm isn't the default, you'll have to wrap the expression in TraditionalForm explicitly. Also note that the TraditionalForm display of the alternative derivative D[f[x],x] is not affected by the new format, whereas f'[x] is. So you can still choose between two different TraditionalForm appearances for derivatives - a nontraditional and a traditional one...

Edit 2

Some additional links:

$\endgroup$
2
  • $\begingroup$ Thanks. I didn't find this in the docs, somehow. That should solve many problems -- but how about formatting higher derivatives using [n] rather than (n)? Must that be hand-coded, or is there some other way? $\endgroup$
    – rogerl
    Jun 19, 2012 at 12:05
  • $\begingroup$ I've added an answer to the second part of your question. You have to hand-code the formatting once, of course; but then it will be automatic whenever you display Derivatives in TraditionalForm. $\endgroup$
    – Jens
    Jun 19, 2012 at 16:09
4
$\begingroup$

Just in case you want to have it somewhere inside the image, rather than as a label, you may use Epilog like this:

 Plot[x^2 + x + 1, {x, 0, 1}, 
 Epilog -> 
   Inset[Style["\!\(\*SuperscriptBox[\(x\), \(2\)]\)+x+1", 16, Red, 
   Italic], Scaled[{0.6, 0.2}]], ImageSize -> 200]

giving you this

Example image 1

Otherwise you may use Show[ ] to combine your graphic with any text (that should be first transformed into a graphic object):

 Show[{Plot[x^2 + x + 1, {x, 0, 1}, ImageSize -> 200],
   Graphics[
   Text[Style["\!\(\*SuperscriptBox[\(x\), \(2\)]\)+x+1", 16, 
   RGBColor[0, 0.7, 0], Italic], Scaled[{0.4, 0.6}]]]
 }] 

Example image 2

$\endgroup$
2
  • $\begingroup$ Where is the documentation on the syntax "!(*SuperscriptBox[(x), (2)])+x+1"? $\endgroup$
    – rogerl
    Jun 19, 2012 at 12:07
  • 1
    $\begingroup$ Oh, I just typed the formula between the quotes in the Style operator; plain in my notebook as to get it in the form it is presented on the graph. It may be done, say, using the Basic Math Input palette. But when copy-pasting it here all these strange things (like \!(*SuperscriptBox[(x), (2)])) appeared. Excuse me for have not noticed them. One may use the following: Graphics[Text[ Style[TraditionalForm[x^4 + x + 1], 16, RGBColor[0, 0.7, 0], Italic], Scaled[{0.4, 0.6}]]] instead. $\endgroup$ Jun 20, 2012 at 7:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.