Take the 2-minute tour ×
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
    
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
add comment

1 Answer

up vote 11 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
add comment

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.