# About the number format in ticks

I want to LogPlot a function, but I have the trouble in the number format in the ticks.

For example,

LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10},
Frame -> True, FrameTicks -> {{Automatic, None}, {None, None}}]


The output is If I use the command

LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True,
FrameTicks -> {
{{#, HoldForm[#]} & /@ {10^0, 10^-1, 10^-2, 10^-3, 10^-4, 10^-5}, None},
{None, None}
}
]


I can get Actually, I prefer the all the ticks in the form of 10^n, and none of the commands shown above works.

Is there any simple and clever way to cope with it? I'll be grateful for your reply.

Perhaps this?

LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True,
FrameTicks -> {{{#, Superscript[10, Log10@#]} & /@ ({10^0, 10^-1,
10^-2, 10^-3, 10^-4, 10^-5}), None}, {None, None}}] Here's a completely different approach, manipulating the existing tick labels in the generated graph, and preserving the unlabeled ticks. This seems much cleaner to me than Peter's approach, assuming that it works on version 8 as it does on version 7.

format =
Replace[#, {p_, n_?NumericQ} :> {p, Superscript[10, Round@Log10@n]}, {#2}] &;

ticks = MapThread[format, {Options[#, {Ticks, FrameTicks}], {3, 4}}] &;


Use:

p = LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True];

Show[p, ticks[p]] # Update 2015

### The new Ticks subsystem

Recent versions of Mathematica use a different ticks rendering system wherein functions specified for Ticks or FrameTicks are passed to the Front End (which calls the Kernel) rather than being evaluated beforehand. If we look at the options of p above we now see:

Options[p, {Ticks, FrameTicks}]

{
Ticks -> {Automatic, ChartingScaledTicks[{Log, Exp}]},
FrameTicks -> {{ChartingScaledTicks[{Log, Exp}],
ChartingScaledFrameTicks[{Log, Exp}]}, {Automatic, Automatic}}
}


We could use these functions to compute tick specifications external to plotting, but to follow the spirit of the new paradigm we can modify the output of these functions instead.

ScaledTicks returns (at least?) three different label formats which we must handle:

ChartingScaledTicks[{Log, Exp}][-11.7, 1.618][[2 ;; 4, 2]] // InputForm

{Superscript[10, -4], 0.001, NumberForm[0.01, {Infinity, 3}]}


The Superscript is already our desired format. The other two may be handled with replacement:

format2 =
Replace[#, n_?NumericQ | NumberForm[n_, _] :> Superscript[10, Round@Log10@n]] &;


We can then use this to apply the formatting:

relabel = # /. CST_ChartingScaledTicks :> (MapAt[format2, CST[##], {All, 2}] &) &;

LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}] // relabel relabel also works with framed plots.

### Spelunking internal functions

One may be interested is the source of the original label formatting. ChartingScaledTicks calls:

ChartingSimplePadding


which takes the option "CutoffExponent" which we would like to use, but unfortunately ScaledTicks overrides it. If we use:

ClearAttributes[ChartingScaledTicks, {Protected, ReadProtected}]


And then modify the definition to replace:

"CutoffExponent" ->
If[{VisualizationUtilitiesScalingDumpf,
VisualizationUtilitiesScalingDumpif} === {Identity, Identity}, 6, 4]


With:

"CutoffExponent" -> 1


We will find that the desired formatting has been effected:

LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True] This modification is inadvisable however, and sadly ChartingScaledTicks does not itself take "CutoffExponent" as an option that would be passed on. One could modify its definition to add this option, but it is safer to use relabel defined above.

• Yes, it is a similiar way to mine. LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True, FrameTicks -> {{{10^-#, Superscript[10, -#]} & /@ {0, 1, 2, 3, 4}, None}, {None, None}}] – yulinlinyu May 9 '12 at 10:06
• could you also write how to modify the number of digits for the tick labels, for example according to NumberForm[tick, {3, 2}]? thanks – Valerio Mar 4 '13 at 8:29
• @Valerio I don't know exactly what you want. Are you also working with LogPlot or just plain Plot? Do you want to change the tick labels on both axes or just the Y axis as done here? If you are around in the next couple of hours we could chat about it. – Mr.Wizard Mar 4 '13 at 13:02
• @Valerio you can manually specify which ticks to use with the Ticks or FrameTicks option. You can also define a function that generates these ticks, for example: tf = N@FindDivisions[{#, #2}, 20] &; Plot[Sin[x], {x, 0, 2 Pi}, Ticks -> tf] -- this can be done for each axis independently. Be aware with my example that FindDivisions will generate about the number of divisions you specify and not that number exactly. – Mr.Wizard Mar 13 '13 at 16:02
• the opposite. Usually, something is released, and over time the internal functions are hunted down, tagged, and added to personal libraries, and it usually doesn't take to long. I find it impressive. – rcollyer Mar 3 '15 at 20:48

If you want the minor ticks too, you can use the following function:

SetAttributes[dtZahl, Listable]
dtZahl[x_] := Block[{n}, If[IntegerQ[n = Rationalize[x]], n, x]]

exponentForm[x_?NumberQ] :=
Module[{me = MantissaExponent[x], num, exp},
If[MemberQ[{0, 0., 1, 1., -1, -1.}, x], Return[IntegerPart[x]]];
exp = Superscript["\[CenterDot]10", me[] - 1];
num = NumberForm[N[me[]]*10 // dtZahl, 3];
If[me[] == 0.1,(*no mantissa*)num = "";
exp = Superscript[10, me[] - 1],
If[me[] == 1,(*range 0..10*)exp = ""]];
Row[{num, exp}]];
exponentForm[x_] := x

Options[logTicks] = {TicksFaktor -> 1};
logTicks[von_Integer, bis_Integer, werte_List, subwerte_List,
OptionsPattern[]] :=
Module[{mt, st, ticks, res, tf},
tf = OptionValue[TicksFaktor];
mt = {#, exponentForm[N[#]], {0.01, 0}*tf} & /@
Flatten@Table[10^i*werte, {i, von, bis}];
st = {#, Null, {0.005, 0}*tf} & /@
Flatten@Table[10^i*subwerte, {i, von, bis}];
Join[mt, st]]


logTicks takes the following Parameters:
von and bis are the lowest and highest exponent. The list werte is the list of labeled ticks in one decade and subwerte the list of unlabeled ticks in one decade.

Example:

GraphicsRow[{
ticks = logTicks[-4, 1, {1}, {2, 3, 5, 7}];
LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True,
FrameTicks -> {{ticks, None}, {None, None}}],
ticks = logTicks[-4, 1, {1, 3}, {2, 5, 7}];
LogPlot[Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True,
FrameTicks -> {{ticks, None}, {None, None}}]
}]


Output: • +1 very nice function! Don't know why this tick feature is still missing in MMA9... – Leo Fang Aug 24 '13 at 4:04

Is there any simple and clever way to cope with it?

Why yes there is, just use the CustomTicks package,

Needs@"CustomTicks";
Plot[Log10@Abs[BesselJ[1, x] Sin[x]^2], {x, -10, 10}, Frame -> True,
FrameTicks -> {{LogTicks, None}, {None, None}}, Axes -> None] • It is better to use updated version of the CustomTicks package from the SciDraw package instead of the vastly outdated version available from library.wolfram.com. – Alexey Popkov Feb 16 '16 at 17:16
• @AlexeyPopkov I will check which version I have, they should take the trouble to update the post on the library though since it is the top google search result.is – Jason B. Feb 16 '16 at 17:32