RE: LogLogListPlot, LogLinearListPlot- Ticks and TickMarks
- To: mathgroup at smc.vnet.net
- Subject: [mg44139] RE: [mg44110] LogLogListPlot, LogLinearListPlot- Ticks and TickMarks
- From: David.Annetts at csiro.au
- Date: Fri, 24 Oct 2003 04:24:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Hugh, > I have some data for viscoelastic material that covers a domain of (a > possibly record breaking) 16 decades. > There are two data sets in the form of frequency-modulus and > frequency-phase. > I wish to plot these as a LogLogListPlot and as a LogLinearListPlot > respectively. > I give an example data set and my attempts below. > > For the LogLogListPlot how do I get more tick marks and tick > labels on the x > and y axes in the form of 10^n where n may be positive or > negative and is > not converted either to a decimal or preceded by 1.0 x? > > For the LogLinearListPlot how do I get a sensible y scale on > the left hand > side, perhaps 5 tick marks, keeping the symbol as Pi and > fractions of Pi > rather than as a decimal? How do I get the y scale on the > right hand side > which is missing? > > Finally is there a method of plotting both the modulus and > phase plots, one > above the other, with a common length of x axis so that the > plots line up? Welcome to the wonderful world of ?Ticks. Essentially, you have to construct the ticks by hand and use them via FrameTicks->{myXtik, myYtik}. This can get messy .... Rather than play with LogLogListPlot & LogLinearListPlot as you have done, I'll stick with ListPlot. So .... For the x-axis ticks we want something like :- tiklen = {0.0046875, 0}; (* this is a magic number -- look at Graphics`Graphics.m for more *) tikl = Range[-6, 12, 1]; (* our labelled ticks in Log space *) tikl = {tikl[[#]], ScientificForm[10.^tikl[[#]]], 2 * tiklen} & /@ Range[Length@tikl] (* labelled ticks *) tikn = Log[10, #] & /@ Range[2., 9]; tikn = 10^# tikn & /@ Range[-5, 12, 1]; tikn = Flatten[Log[10, tikn]] tikn = {tikn[[#]], "", tiklen} & /@ Range[Length@tikn]; (* unlabelled ticks *) tik = Join[tikn, tikl]; (* everything together *) We can use them (eg) ListPlot[{Log[10, #[[1]]],#[[2]]}&/@dataPhase, PlotRange\[Rule]{{-5.01, 12.01},{-Pi/2,0}}, FrameLabel\[Rule]{"Frequency","Phase"},FrameTicks->{tik, Automatic}, ImageSize\[Rule]729, TextStyle\[Rule]{FontFamily->"Times",FontSize\[Rule]10}]; Slightly extended ranges are necessary to see all the labels. For the y-axis in the above plot, try ... ptik = {#, TraditionalForm[#], tiklen} & /@ Range[-Pi/2, 0, Pi/8] And we can employ these (eg) ListPlot[{Log[10, #[[1]]],#[[2]]}&/@dataPhase, PlotRange\[Rule]{{-5.01, 12.01},{-Pi/2+ .01,0.01}}, FrameLabel\[Rule]{"Frequency","Phase"},FrameTicks->{tik, ptik}, ImageSize\[Rule]729, TextStyle\[Rule]{FontFamily->"Times",FontSize\[Rule]10}]; Returning to your LogLog plot, we'll define the y-axis ticks by ytikl = Range[-5, 0, 1]; ytikl = {ytikl[[#]], ScientificForm[10.^ytikl[[#]]], 2 * tiklen} & /@ Range[Length@ytikl]; ytikn = Log[10, #] & /@ Range[2., 9]; ytikn = 10^# ytikn & /@ Range[-5, 12, 1]; ytikn = Flatten[Log[10, ytikn]]; ytikn = {ytikn[[#]], "", tiklen} & /@ Range[Length@ytikn]; ytik = Join[ytikn, ytikl]; and use them, again noting the slightly extended ranges in log space .... ListPlot[Log[10, {#[[1]], #[[2]]}] & /@ dataMod, PlotRange \[Rule] {{-5.01, 12.01}, {-4.01, .01}}, FrameLabel \[Rule] {"Frequency", " Modulus"}, FrameTicks -> {tik, ytik}, ImageSize \[Rule] 729, TextStyle \ \[Rule] {FontFamily -> "Times", FontSize \[Rule] 10}]; To get these lining up, I suggest either fiddling with GraphicsArray or investigating Wickham-Jones' ExtendGraphics packages. Regards, Dave. ========================================== Dr. David Annetts EM Modelling Analyst CSIRO DEM Tel: +612 9490 5416 North Ryde Fax: +612 9490 5467 Australia David.Annetts at csiro.au ===========================================