From: Allin C. <cot...@wf...> - 2008-12-24 21:22:59
|
On Mon, 22 Dec 2008, Ethan A Merritt wrote: > On Monday 22 December 2008, Allin Cottrell wrote: > > Plotting the following wacky dataset (from a test for statistical > > programs by Leland Wilkinson)... > > > > obs y x > > > > 1 99999991 0.99999991 > > 2 99999992 0.99999992 <etc> > > > > gnuplot does fine, except that it puts "1" for each of 11 x-axis > > tics, and "1e+08" for each of 6 y-axis tics, which looks a little > > brain-damaged... > > > > Any thoughts on whether it's worth working on making the tics look > > better by default for this sort of case? > > There's already a feature request open for this issue: > 2007285 Auto-expand number of digits for tics with small axis range > > But it's a surprisingly hard thing to fix. > Patches welcome. I've taken a look in axis.c, but I don't yet have a good understanding of the machinery therein. But I've found that this heuristic hack seems to work quite nicely at the caller level and something of the sort could perhaps be written into axis.c: 1. Write the min and max data values into strings using the default precision for tic labels. If these strings are identical, then compute the minimal precision required to make them differ, add one, and write this into the <axis> format using "%% .%dg". To get the required precision I'm doing something like: for (d=6; d<12; d++) { sprintf(s1, "%.*g", d, vmin); sprintf(s2, "%.*g", d, vmax); if (strcmp(s1, s2)) { break; } } 2. Set the axis tics using start = (the min data value) and incr = (max data value - min data value) / 4.0. E.g., for the x-axis with the data I mentioned: set format x "% .8g" set xtics 0.99999991 2.00000e-08 Merry Christmas! Allin Cottrell |