Re: ListPlot with missing values
- To: mathgroup at smc.vnet.net
- Subject: [mg22490] Re: ListPlot with missing values
- From: Brian Higgins <bghiggins at ucdavis.edu>
- Date: Sat, 4 Mar 2000 02:26:55 -0500 (EST)
- Organization: Deja.com - Before you buy.
- References: <892pd1$pj6@smc.vnet.net> <897ebc$5rc@smc.vnet.net> <89a79u$96g$1@dragonfly.wolfram.com> <89ibvi$n0k@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <89ibvi$n0k at smc.vnet.net>, Roy Mendelssohn <rmendels at pfeg.noaa.gov> wrote: > First, thanks to all who answered. I clearly didn't explain the problem > carefully enough. Assume we are plotting a time series with missing > data, and only want to conect consecutive points that have data, have > blanks whenever a time point is missing, and still want points lined up > correctly in time on the x axis. If I just delete cases, then the > endpoints of any missing segment will be connected, rather than being > blank. > > In the example > > alist = {{1, 1}, {2, 3}, {3,5},{4,}, {5, 6}, {6,8},{7,}, {8,10},{9, 12}} > > I want a line joing the first three points, then a blank, then a line > connecting the next two points, then a blank etc. > > The reason I mentioned the number of datapoints is because one solution > is to draw a graph for each uninterrupted segment of the time series, > and then overlay them. This seems inelegant,because several hundred > separate graphs might have to be drawn. > > If anyone else has other suggestions I would welcome them. > > -Roy M. Roy, Here is one way that makes use of the Line primitive: plotFunc[data_List] := Module[{ nullPos, dataIntervals, plotdata}, nullPos = Flatten[Map[ # &, Position[data, {x_, Null}]]]; dataIntervals = Map[{1 + #[[1]], -1 + #[[2]]} &, Partition[Insert[Insert[nullPos, 0, {1}], Length[data] + 1, {-1}], 2, 1]]; plotdata = Map[Take[data, #] &, dataIntervals]; Show[Graphics[Map[Line[#] &, plotdata]], Axes -> True, AxesOrigin -> {0, 0}]] In the above plot function the assumption is that "y" data points may be missing and have a Null value. The variable nullPos gives the position of all the Null data points in the original data. The variable dataIntervals defines the start and end positions of each data package that does not have missing data. This variable is then used to select the actual data and the result is stored in plotdata. Finally a Line primitive is constructed for each data package You can test the plot function by generating a sine function with n=12 missing data as follows mydata = Table[{x, Sin[2x]}, {x, 0, 4\[Pi], .2}]; Map[(mydata[[#]] = mydata[[#]] /. {x_, y_} -> {x, Null}) &, Table[Random[Integer, {1, Length[mydata]}], {12} ]] And here is a plot: plotFunc[mydata] cheers, Brian Sent via Deja.com http://www.deja.com/ Before you buy.