14
$\begingroup$

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

$\endgroup$
1
  • $\begingroup$ 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 -> . $\endgroup$
    – Ronny
    Commented Dec 21, 2012 at 14:06

1 Answer 1

16
$\begingroup$

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.

$\endgroup$
5
  • $\begingroup$ 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]} $\endgroup$
    – Ronny
    Commented Dec 21, 2012 at 15:18
  • $\begingroup$ 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. $\endgroup$
    – Ronny
    Commented Dec 21, 2012 at 17:19
  • $\begingroup$ Actually performing a further Floor[exp] is o good idea in order to get a decent scale (an not just $10^{-2.089744433}$ ;) $\endgroup$
    – Ronny
    Commented Dec 22, 2012 at 17:46
  • $\begingroup$ Hello. I am struggling to understand this code f[x_] := x /. {NumberForm[y_, {w_, z_}] :> ScientificForm[y, 2]}. Could you explain what it does exactly ? $\endgroup$
    – StarBucK
    Commented Oct 1, 2020 at 13:05
  • $\begingroup$ Sorry, after all these years (I stopped using Mathematica in 2013) I would have to look that up carefully, too. $\endgroup$
    – Ronny
    Commented Oct 6, 2020 at 4:59

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.