Tell me more ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I would like to use the usual (new and nice) BarLegend[] with something like

BarLegend[{"LakeColors", 1/10000 {-2, 2}}]

which looks like

Example BarLegends-Plot

I don't like the numbers, i would like to use ScientificForm[] on them, hence get $0.0002 = 2\times10^{-4}$ or even better - get just $2$ at the label and $\times 10^{-4}$ in the bottom right or something like that.

Is there a way to obtain ScientificForm[] for these labels? I searched the Documentation of the new ~Legends and haven't found anything. And the very best would be, to be able to specify the number of digits used (where i would like to have 3, e.g. $2.00\times10^{-4}$, so best would be ScientificForm[#,3] & to be applied to every number of the Legend.

Update

Surprisingly - following the approach of @Nasser M. Abbasi the two lines

f[x_] := ScientificForm[x, 2];
BarLegend[{"LakeColors", 1/10000 {-2, 2}}, LegendFunction -> f]

produce a Legend like

second approach

Though the second argument of ScientificForm[] gets ignored. Any further ideas why that does happen?

Update #2

Changing f to f[x_] := ScientificForm[N[{x} /. {DirectedInfinity -> Identity}], 2]; actually does change the number of digits, but returns the BarLegend in an Array and produces errors, that (1.,4.} is not a List of positive Integers (though they look quite Integer to me). Why there is an DirectInfinity approaching, I haven't found out yet, without the replacement, the 1. is a DirectedInfinity[1.]

share|improve this question
This is hard. I think sometimes Mathematica Graphics options are very complex to manage. Options[BarLegend] gives Method but nothing there about this. The LegendFunction does not adjust the numbers. I looked to see if I can use Ticks function, but does not work. The Head of this is Style. You might have to do a tricky pattern replacement, and change the NumberForm expression burried in the FullForm there by ScientificFormat and redraw it. – Nasser Dec 21 '12 at 13:48
... if you want to do the pattern replacement, have to do it here inside f[x] like this f[x_] :=(*.here..*) BarLegend[{"LakeColors", 1/10000 {-2, 2}}, LegendFunction -> f] in there, one can see those numbers. If you wait to the end, like this: x=BarLegend[{"LakeColors", 1/10000 {-2, 2}}], then x has Head BarLegend and you no longer can see these numbers in the FullForm. So I think any surgery to do on these numbers by replacing them, it needs to be done inside the LegendFunction – Nasser Dec 21 '12 at 13:54
1  
... here is a screen shot, showing the pattern to change. This is ofcourse assuming there is no other easier direct method to do this: !Mathematica graphics This was obtained like this: f[x_] := FullForm[x]; BarLegend[{"LakeColors", 1/10000 {-2, 2}}, LegendFunction -> f] so something like x/.NumberForm[y_.... :> ScientificForm[y_... might be needed. But that is the idea. – Nasser Dec 21 '12 at 14:01
While the idea sounds great, i only get all your output and no BarLegendanymore trying that approach. I must admit, besides puting a Frame around the ~Legend I don't see much use in LegendFunction -> . – Ronny Dec 21 '12 at 14:06

1 Answer

up vote 9 down vote accepted

Thanks to Nasser M. Abbasi i found a way. To change the Display. The function that you can provide for any ~Legend via LegendFunction wraps the complete ~Legend[] into anything. And he mentioned, that NumberForm encapsulates the numbers. So why not replace them (delayed)?

Version 1: Scientific Notation at every Label

Hence choosing

f[x_] := x /. {NumberForm[y_, {w_, z_}] :> ScientificForm[y, 2]}

to replace any NumberForm in the Legend by ScientificForm (using my preferred two digits) we may call

BarLegend[{"LakeColors", N[1/10000 {-2, 2}]}, LegendFunction -> f]

and obtain

enter image description here

which is one of the desired results.

Version 2: Extract exponent into the label

The first version might seem a little crowded for some Legends, so a nicer way would be to extract that Exponent from the ScientificFormat and change back to NumberFormat internally. While the first might also work, if the Range is implicitly given, this requires to know

{min, max} = 1/10000 {-2,10};

beforehand. Notice, that in this range, the Exponents of max ($10^{-3}$) and min ($-2\times10^{-4}$) differ.

We calculate

exp = Log[10, Max[Abs[min], Abs[max]]]

which is $-3$ here. And change the approach from before to

f[x_] := x /. {NumberForm[y_, {w_, z_}] :> 
NumberForm[PaddedForm[y/(10^exp), {1, 2}], 2]}

That way we can add a Label to the ~Legend, for containing this exponent, for example

BarLegend[{"LakeColors", {-min, max}}, LegendFunction -> f,
  LegendLabel -> Placed[DisplayForm[SuperscriptBox[ToString[" \[Times] 10"], exp]], Bottom]]

Second approach using label

Which I think is nicer than the first version, though you have to know the range of values beforehand. The space before \[Times] just places the label a little further to the right, such that it's bounded at the right hand side.

share|improve this answer
Further one could improve the numbers to all have same length using f[x_] := x /. {NumberForm[y_, {w_, z_}] :> ScientificForm[PaddedForm[y, {2, 2}], 2]} – Ronny Dec 21 '12 at 15:18
For the second formating idea (using LegendLabel ->) one challenge is, to unify the Labels to one Exponent (because ranging from -2 to 10 is in ScientificForm an exponent with 0 and 1. Second is, to obtain this exponent and print it in the Form x10^c in the Label. – Ronny Dec 21 '12 at 17:19
Actually performing a further Floor[exp] is o good idea in order to get a decent scale (an not just $10^{-2.089744433}$ ;) – Ronny Dec 22 '12 at 17:46

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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