MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: ListPlot: Choose segents to draw.

  • To: mathgroup at smc.vnet.net
  • Subject: [mg82366] Re: ListPlot: Choose segents to draw.
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Thu, 18 Oct 2007 05:00:46 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <ff4g7u$fmv$1@smc.vnet.net>

Nacho wrote:

> Using Mathematica V6, I have several hundred lists to plot.
> 
> They draw OK just with
> 
> ListPlot[mytable, Joined->True,PlotRange->All]
> 
> But several hundred plots are a mess. I'm only interested in the
> segments of each list that are increasing, that is, for every x(i),
> x(i)>x(i+1).
> 
> Is there any set of options to ListPlot to make the descending
> segments invisible? Some kind of MeshShading to choose betweet
> Automatic and None depending of two consecutive values.
> 
> If I have to create a new mytable, please bear in mind that the total
> length of the lists must remain equal.

The solution I suggest is the following:

ListPlot[mytable, PlotRange -> All,
  Epilog -> {Line /@
     DeleteCases[Split[mytable, #1[[-1]] < #2[[-1]] &], {{_, _}}]}]

How does it work? We assume that mytable is a list of pairs, each pair 
being the (x, y) coordinates of an individual point. (Note that, in the 
example below, I have chosen integer coordinates for convenience only.) 
To draw the ascending lines, we use the *Epilog* option and use a user 
defined function to draw the lines of interest.

In[1]:= mytable = Table[{n, RandomInteger[{0, 5}]}, {n, 10}]

Out[1]= {{1, 3}, {2, 4}, {3, 2}, {4, 5}, {5, 5}, {6, 4}, {7, 2}, {8,
   5}, {9, 4}, {10, 2}}

We split the original list in running sequences of points taken 
according to their increasing values of their second element (the 
y-coordinate).

In[2]:= Split[mytable, #1[[-1]] < #2[[-1]] &]

Out[2]= {{{1, 3}, {2, 4}}, {{3, 2}, {4, 5}}, {{5, 5}}, {{6, 4}}, {{7,
    2}, {8, 5}}, {{9, 4}}, {{10, 2}}}

Any sequence of only one point must be discarded.

In[3]:= DeleteCases[%, {{_, _}}]

Out[3]= {{{1, 3}, {2, 4}}, {{3, 2}, {4, 5}}, {{7, 2}, {8, 5}}}

Finally, we apply the function *Line* to the each resulting sequence.

In[4]:= Line /@ %

Out[4]= {Line[{{1, 3}, {2, 4}}], Line[{{3, 2}, {4, 5}}],
  Line[{{7, 2}, {8, 5}}]}

Here is the resulting plot,

In[5]:= ListPlot[mytable, PlotRange -> All,
  Epilog -> {Line /@
     DeleteCases[Split[mytable, #1[[-1]] < #2[[-1]] &], {{_, _}}]}]

Out[5]= [ ... plot deleted ... ]

that we can compare with the original.

In[6]:= ListPlot[mytable, Joined -> True, PlotRange -> All]

Out[6]= [ ... plot deleted ... ]

I hope that this answers your question,
-- 
Jean-Marc


  • Prev by Date: Re: ListPlot: Choose segents to draw.
  • Next by Date: Re: Re: Integrate question
  • Previous by thread: Re: ListPlot: Choose segents to draw.
  • Next by thread: Re: ListPlot: Choose segents to draw.