On Tue, Jun 21, 2011 at 5:25 PM, Paul Menzel
<paulepan...@users.sourceforge.net> wrote:
> Am Dienstag, den 21.06.2011, 09:43 -0400 schrieb josef.p...@gmail.com:
>> On Tue, Jun 21, 2011 at 8:47 AM, Paul Menzel wrote:
>
>> > I want to plot all paths of a simple random walk and wrote the following
>> > recursive program based on the Path tutorial [1].
>> >
>> >        import matplotlib.pyplot as plt
>> >        from matplotlib.path import Path
>> >        import matplotlib.patches as patches
>> >
>> >        def draw(a, b, c, d):
>> >                        verts = [
>> >                        (a, b),
>> >                        (c, d),
>> >                        (0, 0),
>> >                        ]
>> >
>> >                        codes = [
>> >                        Path.MOVETO,
>> >                        Path.LINETO,
>> >                        Path.CLOSEPOLY
>> >                        ]
>> >
>> >                        path = Path(verts, codes)
>> >                        patch = patches.PathPatch(path)
>> >                        ax.add_patch(patch)
>> >
>> >        def irrpfad(a, b):
>> >                if a < length:
>> >                        draw(a, b, a + 1., b + 1.)
>> >                        draw(a, b, a + 1., b - 1.)
>> >                        irrpfad(a + 1, b + 1)
>> >                        irrpfad(a + 1, b - 1)
>> >
>> >
>> >        length = 5 # 20 not possible to run
>> >
>> >        fig = plt.figure()
>> >        ax = fig.add_subplot(111)
>> >        irrpfad(0, 0)
>> >        ax.set_xlim(0,length)
>> >        ax.set_ylim(-length,length)
>> >        plt.show()
>> >
>> > Using 20 for `length` stalls my system and the memory used seems to be
>> > over 1 GB. I guess this is what you guess using something recursive.
>> > What optimizations are there. I am drawing each line after another so
>> > probably too many separate paths instead of one. Being a Python noob I
>> > do not know if I can append something to a path. Looking at the API
>> > documentation [2] I did not see such a method.
>> >
>> > Being also new to Matplotlib I may have also overlooked more appropriate
>> > methods/classes.
>> >
>> > So to summarize my message,
>> >
>> > 1. How can I add lines to a path?
>> > 2. Are recursive functions bad in Python/Matplotlib?
>> > 3. Are there better approaches?
>>
>> I'm not sure what you are trying to show, but my impression is that you are
>> just producing the grid between integers (move up,down),
>
> Yeah, that is about right [1].
>
>> and paths will not show up because the lines are all on top of each other.
>
> That is not true. My program displays everything correctly when using
> for example `length = 5`.
>
>> The number of all paths looks very large to me and even without matplotlib
>> overhead, this might soon run into problems.
>
> That is what thought too.
>
>> for example;
>> for length= 15; I get 65534 moves in the random walks, but only 240 unique 
>> moves
>> for length= 20; I get 2097150 moves in the random walks, but only 420 unique 
>> moves
>> plotting only unique moves is fast (count of moves might work to color the
>> amount of traffic on each move)
>
> I am sorry, I think that in my program no section is drawn more than
> once.

each append below corresponds to one call to your draw function

Do you want to draw all possible routes, or the road network? I only
see the road network in the plot (and partially the traffic density
with alpha<1).

Josef

>
>> rw_moves = []
>> def irrpfad2(a, b):
>>     if a < length:
>>         rw_moves.append((a, b, a + 1, b + 1))
>>         rw_moves.append((a, b, a + 1, b - 1))
>>         irrpfad2(a + 1, b + 1)
>>         irrpfad2(a + 1, b - 1)
>>
>> length = 20 # 20 not possible to run
>> irrpfad2(0, 0)
>
> Thank you for the example, but now I need to somehow also add the codes
> to be able to pass this to Path.
>
>> I don't know any answer to the matplotlib specific part
>
> Thank you for your other answers.
>
>> > Please find the source also attached. I am using python-matplotlib
>> > 1.0.1-2 from Debian Sid/unstable.
>
>
> Thanks,
>
> Paul
>
>
>> > [1] http://matplotlib.sourceforge.net/users/path_tutorial.html
>> > [2] 
>> > http://matplotlib.sourceforge.net/api/path_api.html#matplotlib.path.Path
> [3] https://secure.wikimedia.org/wikipedia/en/wiki/Random_walk
>
> ------------------------------------------------------------------------------
> EditLive Enterprise is the world's most technically advanced content
> authoring tool. Experience the power of Track Changes, Inline Image
> Editing and ensure content is compliant with Accessibility Checking.
> http://p.sf.net/sfu/ephox-dev2dev
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

def draw(a, b, c, d):
    verts = [
               (a, b),
               (c, d),
               (0, 0),
               ]

    codes = [
               Path.MOVETO,
               Path.LINETO,
               Path.CLOSEPOLY
               ]

    path = Path(verts, codes)
    patch = patches.PathPatch(path, lw=1)#2, alpha=0.2)
    ax.add_patch(patch)

def irrpfad(a, b):
    if a < length:
        draw(a, b, a + 1., b + 1.)
        draw(a, b, a + 1., b - 1.)
        irrpfad(a + 1, b + 1)
        irrpfad(a + 1, b - 1)

rw_moves = []
def irrpfad2(a, b):
    if a < length:
        rw_moves.append((a, b, a + 1, b + 1))
        rw_moves.append((a, b, a + 1, b - 1))
        irrpfad2(a + 1, b + 1)
        irrpfad2(a + 1, b - 1)

length = 6 # 20 not possible to run

irrpfad2(0, 0)
print 'all moves', len(rw_moves)
print 'unique moves', len(set(rw_moves))

fig = plt.figure()
ax = fig.add_subplot(111)
#irrpfad(0, 0)
for m in rw_moves:
    draw(*m)
ax.set_xlim(0,length)
ax.set_ylim(-length,length)
ax.set_title('all path segments')

fig = plt.figure()
ax = fig.add_subplot(111)
#irrpfad(0, 0)
for m in set(rw_moves):
    draw(*m)
ax.set_xlim(0,length)
ax.set_ylim(-length,length)
ax.set_title('unique path segments')

plt.show()
------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to