Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

precision of y-axis values in plot

661 views
Skip to first unread message

Nathan

unread,
Dec 15, 2011, 5:01:56 AM12/15/11
to
Hi,

I'm relatively new to Mathematica. I'm having a problem with the
precision of the y-axis values of some of my plots. All of the data
labels show up as "2422.3", which isn't very informative since they're
all the same. I need the plot to show two more decimal point values
(ex: "2422.305"). I've looked high and low and can't find any way to
do this. Any ideals? Thanks!

Nathan.

Bob Hanlon

unread,
Dec 16, 2011, 5:50:52 AM12/16/11
to
Explicitly specify the PlotRange.


Bob Hanlon

DrMajorBob

unread,
Dec 16, 2011, 6:02:50 AM12/16/11
to
Show us a plot that does that. We're not mind-readers!

Bobby

On Thu, 15 Dec 2011 03:54:42 -0600, Nathan <nhro...@gmail.com> wrote:

> Hi,
>
> I'm relatively new to Mathematica. I'm having a problem with the
> precision of the y-axis values of some of my plots. All of the data
> labels show up as "2422.3", which isn't very informative since they're
> all the same. I need the plot to show two more decimal point values
> (ex: "2422.305"). I've looked high and low and can't find any way to
> do this. Any ideals? Thanks!
>
> Nathan.
>


--
DrMaj...@yahoo.com

Armand Tamzarian

unread,
Dec 16, 2011, 6:04:53 AM12/16/11
to
What you need to do is make a tick function and wrap NumberForm around
your labels and set the number of decimal points that you want. If you
do a search on here for tick functions and NumberForm you should find
many examples.

Mike

Nathan

unread,
Dec 17, 2011, 2:44:31 AM12/17/11
to
On Dec 16, 4:04 am, Armand Tamzarian <mike.honeychu...@gmail.com>
wrote:
Mike,

Thank you for your help. Forgive my ignorance, but what should I put
in the NumberForm function? Here's the plot command I'm using:

plot2T := Plot[LT2[T, \[Lambda]], {T, min2, max2}, Frame -> True,
FrameLabel -> {{"Task Execution Time (s)", ""}, {"Optimal CSCP
Checkpoint Interval (s)", ""}}, FrameStyle -> {{Black, White},
{Black, White}}, Axes -> {False, False}]

Based on what you said, I assume I should add something like the
following to the Plot function:
Tick -> NumberForm[ N[?], 8]

However, I'm not sure what should replace the ?. Will you please
indulge a newbie with a specific example? Thanks!

Scot T. Martin

unread,
Dec 17, 2011, 2:56:46 AM12/17/11
to
You can get full manual control to perfect your axis to your liking by using Ticks option of Plot and then using NumberForm for the ticks.


On Thu, Dec 15, 2011 at 4:54 AM, Nathan <nhro...@gmail.com> wrote:
> Hi,
>
> I'm relatively new to Mathematica. I'm having a problem with the
> precision of the y-axis values of some of my plots. All of the data
> labels show up as "2422.3", which isn't very informative since they're
> all the same. I need the plot to show two more decimal point values
> (ex: "2422.305"). I've looked high and low and can't find any way to
> do this. Any ideals? Thanks!
>
> Nathan.
>=

Armand Tamzarian

unread,
Dec 18, 2011, 4:38:30 AM12/18/11
to
tickFunction[min_, max_] := Table[{i, NumberForm[i, {3, 4}]}, {i, min,
max, 1/7}]

Plot[Sin[x], {x, 0, 1}, Ticks -> tickFunction]

You will need to read the documentation on Ticks and NumberForm to get
this to do exactly what you want.

Mike

Mike H

unread,
Dec 19, 2011, 7:18:54 AM12/19/11
to
Okay here is what is happening.

Firstly your limits variable is capturing the y axis range.

If we change the tick function to this:

tickFunction[min_, max_] := (Print[{min, max}];
Table[{i, NumberForm[i, {3, 4}]}, {i, min, max, 1/7}])

Plot[Sin[x], {x, 0, 1}, Ticks -> {tickFunction, tickFunction}]

We get both ranges printed.

{-0.0208333,1.02083}
{-0.0175306,0.859002}

Now you might ask why, when you are plotting from 0 to 1 why we are getting
{-0.0208333,1.02083} parsed to the tick function. The answer is because it
turns that the plot range used in the tick function includes the plot range
padding. When you set

Plot[Sin[x], {x, 0, 1}, Ticks -> {tickFunction, tickFunction},
PlotRangePadding -> 0]

{0.,1.}
{0.,0.841471}

and the ticks are exactly where you expect them. I didn't notice this when
I wrote the answer yesterday. As for the documentation, I haven't looked at
tick funcitons in years but I am sure I remember it being there in the old
(V4, V5)documentation.

Mike


On Mon, Dec 19, 2011 at 5:59 AM, DrMajorBob <btr...@austin.rr.com> wrote:

> The behavior of Ticks -> func is not explained in Help for Ticks -- and no
> examples are given -- so I suppose any guess is as good as another. It's
> pretty clear that Table[{i, NumberForm[i, {3, 4}]}, {i, min, max, 1/7}]
> should yield tick marks separated by about
>
> 1/7.
>
> 0.142857
>
> The question is what "min" and "max" arguments are used.
>
> When I run this code:
>
> tickFunction[min_, max_] := Table[{i, NumberForm[i, {3, 4}]}, {i, min,
> max, 1/7}]
>
> Plot[Sin[x], {x, 0, 1}, Ticks -> tickFunction]
>
> The ticks I see are {0.1220, 0.2650, 0.4081, 0.5510, .6930, .8360,
> 0.9790}, which are spaced just about right:
>
> differences =
> Subtract @@@
> Partition[
> ticks = {0.1220, 0.2650, 0.4081, 0.5510, .6930, .8360, 0.9790}, 2,
> 1]
> -7 Rationalize@Mean@%
>
> {-0.143, -0.1431, -0.1429, -0.142, -0.143, -0.143}
>
> 5999/6000
>
> xmin = 0.1220 should be the first tick mark, and xmax could be 1.12186:
>
> Through[{First, Last}@ticks] + {0, 1}/7
> (tickFunction @@ %)[[All, 1]]
>
> {0.122, 1.12186}
>
> {0.122, 0.264857, 0.407714, 0.550571, 0.693429, 0.836286, 0.979143}
>
> but those are not the plotted tick marks. (Close, but no cigar.)
>
> If we modify tickFunction to get the arguments directly, a very different
> result arises:
>
> tickFunction[min_, max_] := (limits = {min, max};
> Table[{i, NumberForm[i, {3, 4}]}, {i, min, max, 1/7}])
> Plot[Sin[x], {x, 0, 1}, Ticks -> tickFunction];
> limits
> (tickFunction @@ limits)[[All, 1]]
>
> {-0.0175306, 0.859002}
>
> {-0.0175306, 0.125326, 0.268184, 0.411041, 0.553898, 0.696755, \
> 0.839612}
>
> Those are really, REALLY not the tick marks on the plot.
>
> Don't you just love the documentation?
>
> Bobby
>
> On Sun, 18 Dec 2011 03:36:44 -0600, Armand Tamzarian <
> mike.hon...@gmail.com> wrote:
>
> On Dec 17, 6:44 pm, Nathan <nhroll...@gmail.com> wrote:
>>
>>> On Dec 16, 4:04 am, Armand Tamzarian <mike.honeychu...@gmail.com>
>>> wrote:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> > On Dec 15, 9:01 pm, Nathan <nhroll...@gmail.com> wrote:
>>>
>>> > What you need to do is make a tick function and wrap NumberForm around
>>> > your labels and set the number of decimal points that you want. If you
>>> > do a search on here for tick functions and NumberForm you should find
>>> > many examples.
>>>
>>> > Mike
>>>
>>> Mike,
>>>
>>> Thank you for your help. Forgive my ignorance, but what should I put
>>> in the NumberForm function? Here's the plot command I'm using:
>>>
>>> plot2T := Plot[LT2[T, \[Lambda]], {T, min2, max2}, Frame -> True,
>>> FrameLabel -> {{"Task Execution Time (s)", ""}, {"Optimal CSCP
>>> Checkpoint Interval (s)", ""}}, FrameStyle -> {{Black, White},
>>> {Black, White}}, Axes -> {False, False}]
>>>
>>> Based on what you said, I assume I should add something like the
>>> following to the Plot function:
>>> Tick -> NumberForm[ N[?], 8]
>>>
>>> However, I'm not sure what should replace the ?. Will you please
>>> indulge a newbie with a specific example? Thanks!
>>>
>>
>>
>> tickFunction[min_, max_] := Table[{i, NumberForm[i, {3, 4}]}, {i, min,
>> max, 1/7}]
>>
>> Plot[Sin[x], {x, 0, 1}, Ticks -> tickFunction]
>>
>> You will need to read the documentation on Ticks and NumberForm to get
>> this to do exactly what you want.
>>
>> Mike
>>
>>
>
> --
> DrMaj...@yahoo.com
>

DrMajorBob

unread,
Dec 19, 2011, 7:26:34 AM12/19/11
to

DrMajorBob

unread,
Dec 20, 2011, 3:04:32 AM12/20/11
to
Your printed limits -- {-0.0208333,1.02083} -- don't match those I
retrieved from a similar function -- {-0.0175306, 0.859002} -- but
otherwise...

Thanks.

Maybe automatic padding was different here because of my screen
resolution, notebook magnification, time zone, moon phase, or what I was
wearing.

Bobby

On Sun, 18 Dec 2011 15:16:14 -0600, Mike H <mike.hon...@gmail.com>
wrote:

> Okay here is what is happening.
>
> Firstly your limits variable is capturing the y axis range.
>
> If we change the tick function to this:
>
> tickFunction[min_, max_] := (Print[{min, max}];
> Table[{i, NumberForm[i, {3, 4}]}, {i, min, max, 1/7}])
>
>>>> Mike,
>>>>
>>>> Thank you for your help. Forgive my ignorance, but what should I put
>>>> in the NumberForm function? Here's the plot command I'm using:
>>>>
>>>> plot2T := Plot[LT2[T, \[Lambda]], {T, min2, max2}, Frame -> True,
>>>> FrameLabel -> {{"Task Execution Time (s)", ""}, {"Optimal CSCP
>>>> Checkpoint Interval (s)", ""}}, FrameStyle -> {{Black, White},
>>>> {Black, White}}, Axes -> {False, False}]
>>>>
>>>> Based on what you said, I assume I should add something like the
>>>> following to the Plot function:
>>>> Tick -> NumberForm[ N[?], 8]
>>>>
>>>> However, I'm not sure what should replace the ?. Will you please
>>>> indulge a newbie with a specific example? Thanks!
>>>>
>>>
>>>
>>> tickFunction[min_, max_] := Table[{i, NumberForm[i, {3, 4}]}, {i, min,
>>> max, 1/7}]
>>>
>>> Plot[Sin[x], {x, 0, 1}, Ticks -> tickFunction]
>>>
>>> You will need to read the documentation on Ticks and NumberForm to get
>>> this to do exactly what you want.
>>>
>>> Mike
>>>
>>>
>>
>> --
>> DrMaj...@yahoo.com
>>


--
DrMaj...@yahoo.com

DrMajorBob

unread,
Dec 20, 2011, 3:05:33 AM12/20/11
to
Oops, I missed the part about "limits" capturing the y range.

Bobby

On Mon, 19 Dec 2011 06:17:18 -0600, Mike H <mike.hon...@gmail.com>

Heike Gramberg

unread,
Dec 20, 2011, 3:06:35 AM12/20/11
to
The values for min and max values used in Ticks->func are the min and max values of the total
plot range of the plot which is a combination of PlotRange and PlotRangePadding. Consider for
example

tickFunction[min_, max_] := (Table[i, {i, min, max, (max - min)/7}])
Plot[Sin[x], {x, 0, 1}, PlotRange -> Automatic,
PlotRangePadding -> 0.1, Ticks -> tickFunction]

Then the ticks along the x-axis run from -.1 to 1.1 which is the plot range in the x-direction plus
a padding of .1 on both sides. If an explicit PlotRange is given then PlotRangePadding is
ignored and min and max values are taken directly from PlotRange. Consider for example

Plot[Sin[x], {x, 0, 1}, PlotRange -> {{-.2, 1.3}, {-.2, 1}}, Ticks -> tickFunction]

Calculating the total plot range in the original case is slightly more complicated since the
default value for PlotRangePadding is Scaled[0.02], which means that 2 percent of the total
plot range in the final plot is padding, and the rest is the plot range which you would find with

AbsoluteOptions[Plot[Sin[x], {x, 0, 1}], PlotRange]

which is equal to {PlotRange -> {{0., 1.}, {0., 0.841471}}} in this case. This means that the
total plot range in the horizontal direction is 1./(1-2*.02)==1.04167. The amount of padding on
the left and right-hand side is then .02*1.04167==0.0208334. Therefore, with
tickFunction[min_, max_] := (Table[i, {i, min, max, (max - min)/7}]) we would expect tick marks
along the horizontal axis at

tickFunction[-.0208334, 1.0208334]== {-0.0208334, 0.127976, 0.276786, 0.425595,
0.574405, 0.723214, 0.872024, 1.02083}

which is exactly what we get with Plot[Sin[x], {x, 0, 1}, Ticks->tickFunction]

By the way the tick marks you found on the last line are the tick marks along the y-axis.
Apparently they were calculated after the tick marks along the x-axis were calculated
which overwrote limits in your tickFunction.

Heike.
0 new messages