I have a lot of plots like this in Mathematica: 
And I would like to transform it in something like that:

Where the information between 0 and 7 hours and 18 and 00 hour is "compressed" in the chart.
I know about ScalingFunctions, but it doesn't work for DateListPlot.
Here is some toy code to reproduce the original version behavior:
dtIni={2013,1,1,0};
dtFim={2013,1,1,24};
data={#,RandomVariate[NormalDistribution[0,1]]}&/@RandomReal[{AbsoluteTime@dtIni,AbsoluteTime@dtFim},500];
DateListPlot[data
,FrameTicks->{Automatic,{DateRange[dtIni, dtFim, "Hour"],None}}
,GridLines -> {If[MemberQ[{0,7,12,18},Last@#],{#,Gray},{#,LightGray}]&/@DateRange[dtIni, dtFim, "Hour"],{#,LightGray}&/@{0.5,1,2,5,10,20}}
,DateTicksFormat->{"Hour"}
]
I don't know if the best idea is try to scale the X axis, or join 3 charts, one for each time period using something like this dismembered data:
dataP1 = Select[data, #[[1]] < AbsoluteTime@{2013, 1, 1, 7} &];
dataP3 = Select[data, #[[1]] > AbsoluteTime@{2013, 1, 1, 18} &];
dataP2 = Complement[data, dataP1, dataP3];
I think that the axis scale solution appear to be more elegant, but I don't know how to implement it. 3 Graphics join will be welcome too. Any Clue?
Answer
Another way is to rescale the data that occur before 07:00 to the range between 06:00-07:00 and the data that occur after 18:00 to the range 18:00-19:00.
dtIni = {2013, 1, 1, 0};
dtFim = {2013, 1, 1, 24};
data = {#, RandomVariate[NormalDistribution[0, 1]]} & /@
RandomReal[{AbsoluteTime@dtIni, AbsoluteTime@dtFim}, 500];
lowerBorder = AbsoluteTime[dtIni + {0, 0, 0, 7}];
lowerBorder2 = lowerBorder - 3600;
upperBorder = AbsoluteTime[dtFim - {0, 0, 0, 6}];
upperBorder2 = upperBorder + 3600;
pre = Select[data, #[[1]] <= lowerBorder &];
post = Select[data, #[[1]] >= upperBorder &];
data2 = Select[data, #[[1]] > lowerBorder && #[[1]] < upperBorder &];
preNew = Transpose[{Rescale[
pre[[All, 1]], {AbsoluteTime[dtIni], lowerBorder}, {lowerBorder2,
lowerBorder}], pre[[All, 2]]}];
postNew =
Transpose[{Rescale[
post[[All, 1]], {upperBorder, AbsoluteTime[dtFim]}, {upperBorder,
upperBorder2}], post[[All, 2]]}];
DateListPlot[Join[preNew, data2, postNew],
FrameTicks -> {{Automatic,
Automatic}, {Join[{{lowerBorder2, "00:00"}},
Range[lowerBorder, upperBorder,
3600], {{upperBorder2, "00:00"}}], Automatic}}]

Comments
Post a Comment