Re: Two Axis DateListPlot
- To: mathgroup at smc.vnet.net
- Subject: [mg104317] Re: Two Axis DateListPlot
- From: Sunt <sunting.05 at gmail.com>
- Date: Tue, 27 Oct 2009 05:00:01 -0500 (EST)
- References: <h8l8g0$8pa$1@smc.vnet.net>
On Sep 14, 7:13 pm, Armand Tamzarian <mike.honeychu... at gmail.com> wrote: > Further to my post, here is atwoaxisDateListPlot. This is based on > the TwoAXisListPlot code that floats around this group, which I > believe originated from WRI tech support. The use of Frame->True > breaks AbsoluteOptions (Ticks.FrameTicks) for many types of plots so > by setting Axes->True, Frame->False we can get this to work and then > set Frame->True after the relevant stuff has been extracted. > > Clear[TwoAxisDateListPlot]; > > TwoAxisDateListPlot[f_List, g_List, opts : OptionsPattern[]] := > Module[{p1, p2, fm, fM, gm, gM, old, new, newg}, > > p1 = DateListPlot[f, Axes -> True, Frame -> False, > PlotRange -> Automatic]; > p2 = DateListPlot[g, Axes -> True, Frame -> False, > PlotRange -> Automatic]; > > {fm, fM} = AbsoluteOptions[p1, PlotRange][[1, 2, 2]]; > {gm, gM} = AbsoluteOptions[p2, PlotRange][[1, 2, 2]]; > > old = AbsoluteOptions[p2, Ticks][[1, 2, 2]]; > > new = Flatten[{Rescale[First[#1], {gm, gM}, {fm, fM}], Rest[#1]}, > 1] & /@ old; > > newg = {#[[1]], Rescale[#[[2]], {gm, gM}, {fm, fM}]} & /@ g; > > DateListPlot[{f, newg}, > Axes -> False, > Frame -> True, > FrameTicks -> {Automatic, Automatic, None, new}, > PlotRange -> {fm, fM}, > opts > ] > ] > > a test: > > f = Table[{{2009, i, 0}, RandomReal[{-2, 2}]}, {i, 10}]; > g = Table[{{2009, i, 0}, RandomReal[{-1000, 1000}]}, {i, 10}]; > > TwoAxisDateListPlot[f, g, Joined -> True] > > Mike > > On Sep 11, 6:57 pm, Armand Tamzarian <mike.honeychu... at gmail.com> > wrote: > Show[pricesPlot] > > > > > > > This is easier ( to read at least): > > > spotPrices = First@Import["http://www.eia.doe.gov/emeu/international/ > > Crude1.xls","XLS"]; > > > spotBrent = Cases[spotPrices[[All, {1, 3}]], {_List, x_?NumericQ}]; > > spotWTI = Cases[spotPrices[[All, {1, 4}]], {_List, x_?NumericQ}]; > > > goldPrices = Import["http://www.lbma.org.uk/?area=stats&page=gold= / > > 2009dailygold","Data"]; > > > goldPrices = Cases[goldPrices, {x_String, y__?NumericQ} :> {DateList > > [x], y}, \[Infinity]]; > > > >From here I don't exactly know how you want to make your plot (perhaps > > > scale the gold price?) or which price to choose but this is a simple > > plot: > > > DateListPlot[{spotPriceWTI, goldPrices[[All, {1, 2}]]}, Joined -> > > True, PlotRange -> All] > > > ------ > > > If you wanted to only choose days in which you have data for both WTI > > and gold you can use Intersection with a SameTest to create a subset > > of the WTI data (or of course use Part or Take and make the choice > > manually). General, but slow, case: > > > WTIsubset1=Quiet@Intersection[spotPriceWTI, goldPrices[[All, 1]], > > SameTest -> (#1[[1]] == #2[[{1, 2, 3}]] &)] > > > Note that the {1,2,3} is necessary because the length of the date > > lists differ for the oil and gold. > > > However if you only want 2009 data, which you would in this case: > > > WTIsubset2=Cases[spotPriceWTI, {{2009, __}, __}] > > > Ideally you'd want to have atwoaxisplot here but this has always > > been problematic and breaks whenever I try to implement it with > > DateListPlot. Some readers may have a working DateListPlottwoaxis > > plot solution (?) > > > Mike Great! Thanks a lot!