You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(3) |
Jun
|
Jul
|
Aug
(12) |
Sep
(12) |
Oct
(56) |
Nov
(65) |
Dec
(37) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(59) |
Feb
(78) |
Mar
(153) |
Apr
(205) |
May
(184) |
Jun
(123) |
Jul
(171) |
Aug
(156) |
Sep
(190) |
Oct
(120) |
Nov
(154) |
Dec
(223) |
2005 |
Jan
(184) |
Feb
(267) |
Mar
(214) |
Apr
(286) |
May
(320) |
Jun
(299) |
Jul
(348) |
Aug
(283) |
Sep
(355) |
Oct
(293) |
Nov
(232) |
Dec
(203) |
2006 |
Jan
(352) |
Feb
(358) |
Mar
(403) |
Apr
(313) |
May
(165) |
Jun
(281) |
Jul
(316) |
Aug
(228) |
Sep
(279) |
Oct
(243) |
Nov
(315) |
Dec
(345) |
2007 |
Jan
(260) |
Feb
(323) |
Mar
(340) |
Apr
(319) |
May
(290) |
Jun
(296) |
Jul
(221) |
Aug
(292) |
Sep
(242) |
Oct
(248) |
Nov
(242) |
Dec
(332) |
2008 |
Jan
(312) |
Feb
(359) |
Mar
(454) |
Apr
(287) |
May
(340) |
Jun
(450) |
Jul
(403) |
Aug
(324) |
Sep
(349) |
Oct
(385) |
Nov
(363) |
Dec
(437) |
2009 |
Jan
(500) |
Feb
(301) |
Mar
(409) |
Apr
(486) |
May
(545) |
Jun
(391) |
Jul
(518) |
Aug
(497) |
Sep
(492) |
Oct
(429) |
Nov
(357) |
Dec
(310) |
2010 |
Jan
(371) |
Feb
(657) |
Mar
(519) |
Apr
(432) |
May
(312) |
Jun
(416) |
Jul
(477) |
Aug
(386) |
Sep
(419) |
Oct
(435) |
Nov
(320) |
Dec
(202) |
2011 |
Jan
(321) |
Feb
(413) |
Mar
(299) |
Apr
(215) |
May
(284) |
Jun
(203) |
Jul
(207) |
Aug
(314) |
Sep
(321) |
Oct
(259) |
Nov
(347) |
Dec
(209) |
2012 |
Jan
(322) |
Feb
(414) |
Mar
(377) |
Apr
(179) |
May
(173) |
Jun
(234) |
Jul
(295) |
Aug
(239) |
Sep
(276) |
Oct
(355) |
Nov
(144) |
Dec
(108) |
2013 |
Jan
(170) |
Feb
(89) |
Mar
(204) |
Apr
(133) |
May
(142) |
Jun
(89) |
Jul
(160) |
Aug
(180) |
Sep
(69) |
Oct
(136) |
Nov
(83) |
Dec
(32) |
2014 |
Jan
(71) |
Feb
(90) |
Mar
(161) |
Apr
(117) |
May
(78) |
Jun
(94) |
Jul
(60) |
Aug
(83) |
Sep
(102) |
Oct
(132) |
Nov
(154) |
Dec
(96) |
2015 |
Jan
(45) |
Feb
(138) |
Mar
(176) |
Apr
(132) |
May
(119) |
Jun
(124) |
Jul
(77) |
Aug
(31) |
Sep
(34) |
Oct
(22) |
Nov
(23) |
Dec
(9) |
2016 |
Jan
(26) |
Feb
(17) |
Mar
(10) |
Apr
(8) |
May
(4) |
Jun
(8) |
Jul
(6) |
Aug
(5) |
Sep
(9) |
Oct
(4) |
Nov
|
Dec
|
2017 |
Jan
(5) |
Feb
(7) |
Mar
(1) |
Apr
(5) |
May
|
Jun
(3) |
Jul
(6) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
(1) |
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2020 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2025 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
|
1
(16) |
2
(8) |
3
(4) |
4
|
5
|
6
(3) |
7
(11) |
8
(16) |
9
(1) |
10
(2) |
11
(2) |
12
(6) |
13
(2) |
14
(4) |
15
(5) |
16
(10) |
17
(5) |
18
|
19
|
20
|
21
(3) |
22
|
23
(12) |
24
(7) |
25
(1) |
26
|
27
(3) |
28
(4) |
29
(5) |
30
(2) |
|
|
From: Virgil S. <vs...@it...> - 2015-04-23 17:41:04
|
On 23-Apr-2015 18:48, Benjamin Root wrote: > ... keeping conversation on-list ... > > The reason why you get that error is because you took out the argument from > the call signature. But, FuncAnimation assumes that it can send in at least > one argument. That argument is not optional, even if you aren't using it. So, > animate() was called with an argument by FuncAnimation internally, but since > animate() as defined by you did not have that argument, it fails. Ok --- thanks again for the clarification. Who knows, with a little help from this list, I might someday be able to create some useful animations with Matplotlib ;-) > > Cheers! > Ben Root > > > On Thu, Apr 23, 2015 at 12:32 PM, Virgil Stokes <vs...@it... > <mailto:vs...@it...>> wrote: > > On 23-Apr-2015 18:25, Benjamin Root wrote: >> The documentation should say "the number", not "a number". This >> particular argument expects either a generator, an iterable, or an >> integer. If none is given, it will try and figure out something for >> itself. The integer is used to create a number generator, and so you >> effectively have an iterable that supplies the first argument to the >> animation function. > Ok Benjamin :-) --- thanks for the clarification. >> >> Often times, the first argument to this function is just a frame index. >> It is quite possible that you don't need it at all, but it is a part of >> the defined API that the FuncAnimation assumes to be able to call the >> user-supplied function. >> >> Does that help? > Yes, this does indeed help. But I am still puzzled by the error message > given when I remove the argument to the animate function. >> >> Ben Root >> >> <shameless_plug> >> P.S. - My new book "Interactive Applications using Matplotlib" has an >> entire chapter devoted to animations >> </shameless_plug> > Thanks for this also Ben --- I will quite likely get this book. However, considering the complexity of Matplotlib --- only 174 pages bothers me a little. :-) > >> >> >> On Thu, Apr 23, 2015 at 12:05 PM, Virgil Stokes <vs...@it... >> <mailto:vs...@it...>> wrote: >> >> Thanks for your reply to my post, Jerzy. >> >> On 23-Apr-2015 13:18, Jerzy Karczmarczuk wrote: >>> >>> >>> Le 23/04/2015 12:22, Virgil Stokes a écrit : >>>> The following interesting example (random_data.py) is posted at: >>>> >>>> http://matplotlib.org/1.4.2/examples/animation/random_data.html >>>> >>>> >>>> import matplotlib.pyplot as plt >>>> import matplotlib.animation as animation >>> import numpy as np >> Yes, I forgot to include this >>>> >>>> fig, ax = plt.subplots() >>>> line, = ax.plot(np.random.rand(10)) >>>> ax.set_ylim(0, 1) >>>> >>>> def update(data): >>>> line.set_ydata(data) >>>> return line, >>>> >>>> def data_gen(): >>>> while True: yield np.random.rand(10) >>>> >>>> ani = animation.FuncAnimation(fig, update, data_gen, interval=100) >>>> plt.show() >>>> >>>> This codes works; but, I am very confused by it. For example: >>>> >>>> 1. There are 3 positional arguments given for >>>> animation.FuncAnimation; but, in the >>>> API documentation for this class >>>> (http://matplotlib.org/api/animation_api.html), only >>>> two positional arguments are shown. >>> The third one is the third one, >>> "/frames/ can be a generator, an iterable, or a number of frames." >> This makes very little sense to me --- what does "or a number of >> frames" mean? >>> The name "data_gen" could suggest its meaning (after having read the >>> doc). >> I am not sure what you are referencing as "the doc"; but I did read >> the documentation several times and English is my native language. >>> Note please that the keyword parameters are specified extra. >> I am aware of this. Perhaps, I am a Python dummy --- when I see >> something like value = None in a Python API argument, I interpret >> this as a keyword argument and not a generator. >>> >>>> 2. data, the argument to the update function seems to be undefined. >>> FuncAnimation usually passes the frame number: 0, 1, 2, ... as the >>> first parameter of the update function, when "frames" is None, or >>> the number of frames. If - as here - the third parameter is a >>> generator, it passes the yielded data to update. >>> It may be used or not. >> Ok, I understand that better now. But, you say "or *the number* of >> frames" but the documentation reads "or *a number* of frames" --- >> what does this mean? >> >> And I still do not understand how to use the first argument of the >> function to be called for the animation. In another animation example >> (histogram.py), the animation function is defined by: >> >> def animate(i): >> # simulate new data coming in >> data = np.random.randn(1000 >> n, bins = np.histogram(data, 100) >> top = bottom + n >> verts[1::5,1] = top >> verts[2::5,1] = top >> >> This works of course; but, why is the "i" required? There is no other >> reference to it in the entire script. If I remove it; i.e. use def >> animate(): I get the following error: >> >> TypeError: animate() takes no arguments (1 given) >> >> I do not understand how this explains the fact that the function no >> longer has any arguments. Please explain the meaning of this error >> message? >>> >>> Please, in such cases test your programs by adding some simple >>> tracing contraptions, say, print(data) inside update. >> I did this and more before posting my email. I would not have posted >> this unless I thought it was necessary. And I thought one purpose of >> this user group was to help people --- even if they ask a question >> which may be annoying or "stupid" in some subscribers opinion. I try >> to remember what a very wise teacher once said --- "there is no such >> thing as a stupid question". >> >> ------------------------------------------------------------------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> <mailto:Mat...@li...> >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> > > |
From: Benjamin R. <ben...@ou...> - 2015-04-23 17:25:47
|
Brendan, good catch, I didn't notice Virgil's confusion earlier. I think that is a good explanation. I remember getting very confused by all of that stuff back when I started in Python. I think mostly because I don't know of any other language that does argument handling like how Python does it. I learned it all by "school-of-hard-knocks". Does anybody recommend a really good online reference that explains the ins-and-outs of positional and keyword arguments for newbies? Cheers! Ben Root On Thu, Apr 23, 2015 at 1:00 PM, Brendan Barnwell <bre...@br...> wrote: > On 2015-04-23 03:22, Virgil Stokes wrote: > > > > 1. There are 3 positional arguments given for animation.FuncAnimation; > > but, in the > > API documentation for this class > > (http://matplotlib.org/api/animation_api.html), only > > two positional arguments are shown. > > One thing I think may be misleading you is that you seem to be > misunderstanding how positional and keyword arguments work in Python. > Specifying a default value for an argument in a function definition > doesn't mean that you can *only* pass it by keyword when you call it. > Any named argument can always be passed positionally or by keyword (in > Python 2). For instance, if I define a function like this: > > def foo(a, b=2): > print a+b > > I can still call it like this: > > foo(8, 10) > > I can even call it like this (passing both arguments as keywords "out of > order") > > foo(b=10, a=8) > > Writing "b=2" in the function definition doesn't so much "make b a > keyword argument" as just "specify a default value for b". So in the > FuncAnimation documentation you mentioned, "frames" is not required to > be a keyword argument, and can still be passed positionally. (In Python > 3 there are keyword-only arguments, and even in Python 2 the variadic > **kwargs syntax collects only keyword arguments, but those aren't > involved as far as the "frame" argument here is concerned.) > > -- > Brendan Barnwell > "Do not follow where the path may lead. Go, instead, where there is no > path, and leave a trail." > --author unknown > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |
From: Brendan B. <bre...@br...> - 2015-04-23 17:17:06
|
On 2015-04-23 03:22, Virgil Stokes wrote: > > 1. There are 3 positional arguments given for animation.FuncAnimation; > but, in the > API documentation for this class > (http://matplotlib.org/api/animation_api.html), only > two positional arguments are shown. One thing I think may be misleading you is that you seem to be misunderstanding how positional and keyword arguments work in Python. Specifying a default value for an argument in a function definition doesn't mean that you can *only* pass it by keyword when you call it. Any named argument can always be passed positionally or by keyword (in Python 2). For instance, if I define a function like this: def foo(a, b=2): print a+b I can still call it like this: foo(8, 10) I can even call it like this (passing both arguments as keywords "out of order") foo(b=10, a=8) Writing "b=2" in the function definition doesn't so much "make b a keyword argument" as just "specify a default value for b". So in the FuncAnimation documentation you mentioned, "frames" is not required to be a keyword argument, and can still be passed positionally. (In Python 3 there are keyword-only arguments, and even in Python 2 the variadic **kwargs syntax collects only keyword arguments, but those aren't involved as far as the "frame" argument here is concerned.) -- Brendan Barnwell "Do not follow where the path may lead. Go, instead, where there is no path, and leave a trail." --author unknown |
From: Benjamin R. <ben...@ou...> - 2015-04-23 16:48:37
|
... keeping conversation on-list ... The reason why you get that error is because you took out the argument from the call signature. But, FuncAnimation assumes that it can send in at least one argument. That argument is not optional, even if you aren't using it. So, animate() was called with an argument by FuncAnimation internally, but since animate() as defined by you did not have that argument, it fails. Cheers! Ben Root On Thu, Apr 23, 2015 at 12:32 PM, Virgil Stokes <vs...@it...> wrote: > On 23-Apr-2015 18:25, Benjamin Root wrote: > > The documentation should say "the number", not "a number". This > particular argument expects either a generator, an iterable, or an integer. > If none is given, it will try and figure out something for itself. The > integer is used to create a number generator, and so you effectively have > an iterable that supplies the first argument to the animation function. > > Ok Benjamin :-) --- thanks for the clarification. > > > Often times, the first argument to this function is just a frame index. > It is quite possible that you don't need it at all, but it is a part of the > defined API that the FuncAnimation assumes to be able to call the > user-supplied function. > > Does that help? > > Yes, this does indeed help. But I am still puzzled by the error message > given when I remove the argument to the animate function. > > > Ben Root > > <shameless_plug> > P.S. - My new book "Interactive Applications using Matplotlib" has an > entire chapter devoted to animations > </shameless_plug> > > > On Thu, Apr 23, 2015 at 12:05 PM, Virgil Stokes <vs...@it...> wrote: > >> Thanks for your reply to my post, Jerzy. >> >> On 23-Apr-2015 13:18, Jerzy Karczmarczuk wrote: >> >> >> >> Le 23/04/2015 12:22, Virgil Stokes a écrit : >> >> The following interesting example (random_data.py) is posted at: >> >> http://matplotlib.org/1.4.2/examples/animation/random_data.html >> >> >> import matplotlib.pyplot as plt >> import matplotlib.animation as animation >> >> import numpy as np >> >> Yes, I forgot to include this >> >> >> fig, ax = plt.subplots() >> line, = ax.plot(np.random.rand(10)) >> ax.set_ylim(0, 1) >> >> def update(data): >> line.set_ydata(data) >> return line, >> >> def data_gen(): >> while True: yield np.random.rand(10) >> >> ani = animation.FuncAnimation(fig, update, data_gen, interval=100) >> plt.show() >> >> This codes works; but, I am very confused by it. For example: >> >> 1. There are 3 positional arguments given for animation.FuncAnimation; >> but, in the >> API documentation for this class ( >> <http://matplotlib.org/api/animation_api.html> >> http://matplotlib.org/api/animation_api.html), only >> two positional arguments are shown. >> >> The third one is the third one, >> "*frames* can be a generator, an iterable, or a number of frames." >> >> This makes very little sense to me --- what does "or a number of frames" >> mean? >> >> The name "data_gen" could suggest its meaning (after having read the >> doc). >> >> I am not sure what you are referencing as "the doc"; but I did read the >> documentation several times and English is my native language. >> >> Note please that the keyword parameters are specified extra. >> >> I am aware of this. Perhaps, I am a Python dummy --- when I see >> something like value = None in a Python API argument, I interpret this as a >> keyword argument and not a generator. >> >> >> 2. data, the argument to the update function seems to be undefined. >> >> FuncAnimation usually passes the frame number: 0, 1, 2, ... as the first >> parameter of the update function, when "frames" is None, or the number of >> frames. If - as here - the third parameter is a generator, it passes the >> yielded data to update. >> It may be used or not. >> >> Ok, I understand that better now. But, you say "or *the number* of >> frames" but the documentation reads "or *a number* of frames" --- what >> does this mean? >> >> And I still do not understand how to use the first argument of the >> function to be called for the animation. In another animation example ( >> histogram.py), the animation function is defined by: >> >> def animate(i): >> # simulate new data coming in >> data = np.random.randn(1000 >> n, bins = np.histogram(data, 100) >> top = bottom + n >> verts[1::5,1] = top >> verts[2::5,1] = top >> >> This works of course; but, why is the "i" required? There is no other >> reference to it in the entire script. If I remove it; i.e. use def >> animate(): I get the following error: >> >> TypeError: animate() takes no arguments (1 given) >> >> I do not understand how this explains the fact that the function no >> longer has any arguments. Please explain the meaning of this error message? >> >> >> Please, in such cases test your programs by adding some simple tracing >> contraptions, say, print(data) inside update. >> >> I did this and more before posting my email. I would not have posted >> this unless I thought it was necessary. And I thought one purpose of this >> user group was to help people --- even if they ask a question which may be >> annoying or "stupid" in some subscribers opinion. I try to remember what a >> very wise teacher once said --- "there is no such thing as a stupid >> question". >> >> >> ------------------------------------------------------------------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> > > |
From: Thomas C. <tca...@gm...> - 2015-04-23 16:28:47
|
Can everyone please bring the level of snark/hostility down? Programming is frustrating, but antagonizing the mailing list does not help anyone. It is not well documented, but the signature for `func` is assumed to be `def function(required, *optional_positional)` see https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/animation.py#L1107 for the line where it actually gets called. The logic behind this is that the function needs to have some input to know what to draw (so the state about where in the sequence you are lives in the animation code, not in the supplied user code). For passing in the frame data you have several options. The first is to pass in an iterable of the data you want to be passed to the function (ex np.arange(5), image_stack, image_generator), basically anything where `it = iter(input); data = next(it)` 'does the right thing'. The second is to pass in a callable where repeated calls to `data = my_callable()` 'does the right thing' This would be useful if you want to reach out and hit some external hardware for you data each time the animation updates. The last is to pass in a number of frames, which gets converted into xrange(frames). In all cases, the Animation turns what ever your input is into an iterable which gets hit once pre frame (see https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/animation.py#L1047 for the code version of this paragraph). Tom PS was finishing this up as Ben's email came in On Thu, Apr 23, 2015 at 12:06 PM Virgil Stokes <vs...@it...> wrote: > Thanks for your reply to my post, Jerzy. > > > On 23-Apr-2015 13:18, Jerzy Karczmarczuk wrote: > > > > Le 23/04/2015 12:22, Virgil Stokes a écrit : > > The following interesting example (random_data.py) is posted at: > > http://matplotlib.org/1.4.2/examples/animation/random_data.html > > > import matplotlib.pyplot as plt > import matplotlib.animation as animation > > import numpy as np > > Yes, I forgot to include this > > > fig, ax = plt.subplots() > line, = ax.plot(np.random.rand(10)) > ax.set_ylim(0, 1) > > def update(data): > line.set_ydata(data) > return line, > > def data_gen(): > while True: yield np.random.rand(10) > > ani = animation.FuncAnimation(fig, update, data_gen, interval=100) > plt.show() > > This codes works; but, I am very confused by it. For example: > > 1. There are 3 positional arguments given for animation.FuncAnimation; > but, in the > API documentation for this class ( > http://matplotlib.org/api/animation_api.html), only > two positional arguments are shown. > > The third one is the third one, > "*frames* can be a generator, an iterable, or a number of frames." > > This makes very little sense to me --- what does "or a number of frames" > mean? > > The name "data_gen" could suggest its meaning (after having read the > doc). > > I am not sure what you are referencing as "the doc"; but I did read the > documentation several times and English is my native language. > > Note please that the keyword parameters are specified extra. > > I am aware of this. Perhaps, I am a Python dummy --- when I see something > like value = None in a Python API argument, I interpret this as a keyword > argument and not a generator. > > > 2. data, the argument to the update function seems to be undefined. > > FuncAnimation usually passes the frame number: 0, 1, 2, ... as the first > parameter of the update function, when "frames" is None, or the number of > frames. If - as here - the third parameter is a generator, it passes the > yielded data to update. > It may be used or not. > > Ok, I understand that better now. But, you say "or *the number* of > frames" but the documentation reads "or *a number* of frames" --- what > does this mean? > > And I still do not understand how to use the first argument of the > function to be called for the animation. In another animation example ( > histogram.py), the animation function is defined by: > > def animate(i): > # simulate new data coming in > data = np.random.randn(1000 > n, bins = np.histogram(data, 100) > top = bottom + n > verts[1::5,1] = top > verts[2::5,1] = top > > This works of course; but, why is the "i" required? There is no other > reference to it in the entire script. If I remove it; i.e. use def > animate(): I get the following error: > > TypeError: animate() takes no arguments (1 given) > > I do not understand how this explains the fact that the function no longer > has any arguments. Please explain the meaning of this error message? > > > Please, in such cases test your programs by adding some simple tracing > contraptions, say, print(data) inside update. > > I did this and more before posting my email. I would not have posted this > unless I thought it was necessary. And I thought one purpose of this user > group was to help people --- even if they ask a question which may be > annoying or "stupid" in some subscribers opinion. I try to remember what a > very wise teacher once said --- "there is no such thing as a stupid > question". > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF_______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |
From: Benjamin R. <ben...@ou...> - 2015-04-23 16:26:06
|
The documentation should say "the number", not "a number". This particular argument expects either a generator, an iterable, or an integer. If none is given, it will try and figure out something for itself. The integer is used to create a number generator, and so you effectively have an iterable that supplies the first argument to the animation function. Often times, the first argument to this function is just a frame index. It is quite possible that you don't need it at all, but it is a part of the defined API that the FuncAnimation assumes to be able to call the user-supplied function. Does that help? Ben Root <shameless_plug> P.S. - My new book "Interactive Applications using Matplotlib" has an entire chapter devoted to animations </shameless_plug> On Thu, Apr 23, 2015 at 12:05 PM, Virgil Stokes <vs...@it...> wrote: > Thanks for your reply to my post, Jerzy. > > On 23-Apr-2015 13:18, Jerzy Karczmarczuk wrote: > > > > Le 23/04/2015 12:22, Virgil Stokes a écrit : > > The following interesting example (random_data.py) is posted at: > > http://matplotlib.org/1.4.2/examples/animation/random_data.html > > > import matplotlib.pyplot as plt > import matplotlib.animation as animation > > import numpy as np > > Yes, I forgot to include this > > > fig, ax = plt.subplots() > line, = ax.plot(np.random.rand(10)) > ax.set_ylim(0, 1) > > def update(data): > line.set_ydata(data) > return line, > > def data_gen(): > while True: yield np.random.rand(10) > > ani = animation.FuncAnimation(fig, update, data_gen, interval=100) > plt.show() > > This codes works; but, I am very confused by it. For example: > > 1. There are 3 positional arguments given for animation.FuncAnimation; > but, in the > API documentation for this class ( > http://matplotlib.org/api/animation_api.html), only > two positional arguments are shown. > > The third one is the third one, > "*frames* can be a generator, an iterable, or a number of frames." > > This makes very little sense to me --- what does "or a number of frames" > mean? > > The name "data_gen" could suggest its meaning (after having read the doc). > > I am not sure what you are referencing as "the doc"; but I did read the > documentation several times and English is my native language. > > Note please that the keyword parameters are specified extra. > > I am aware of this. Perhaps, I am a Python dummy --- when I see something > like value = None in a Python API argument, I interpret this as a keyword > argument and not a generator. > > > 2. data, the argument to the update function seems to be undefined. > > FuncAnimation usually passes the frame number: 0, 1, 2, ... as the first > parameter of the update function, when "frames" is None, or the number of > frames. If - as here - the third parameter is a generator, it passes the > yielded data to update. > It may be used or not. > > Ok, I understand that better now. But, you say "or *the number* of > frames" but the documentation reads "or *a number* of frames" --- what > does this mean? > > And I still do not understand how to use the first argument of the > function to be called for the animation. In another animation example ( > histogram.py), the animation function is defined by: > > def animate(i): > # simulate new data coming in > data = np.random.randn(1000 > n, bins = np.histogram(data, 100) > top = bottom + n > verts[1::5,1] = top > verts[2::5,1] = top > > This works of course; but, why is the "i" required? There is no other > reference to it in the entire script. If I remove it; i.e. use def > animate(): I get the following error: > > TypeError: animate() takes no arguments (1 given) > > I do not understand how this explains the fact that the function no longer > has any arguments. Please explain the meaning of this error message? > > > Please, in such cases test your programs by adding some simple tracing > contraptions, say, print(data) inside update. > > I did this and more before posting my email. I would not have posted this > unless I thought it was necessary. And I thought one purpose of this user > group was to help people --- even if they ask a question which may be > annoying or "stupid" in some subscribers opinion. I try to remember what a > very wise teacher once said --- "there is no such thing as a stupid > question". > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |
From: Virgil S. <vs...@it...> - 2015-04-23 16:05:27
|
Thanks for your reply to my post, Jerzy. On 23-Apr-2015 13:18, Jerzy Karczmarczuk wrote: > > > Le 23/04/2015 12:22, Virgil Stokes a écrit : >> The following interesting example (random_data.py) is posted at: >> >> http://matplotlib.org/1.4.2/examples/animation/random_data.html >> >> >> import matplotlib.pyplot as plt >> import matplotlib.animation as animation > import numpy as np Yes, I forgot to include this >> >> fig, ax = plt.subplots() >> line, = ax.plot(np.random.rand(10)) >> ax.set_ylim(0, 1) >> >> def update(data): >> line.set_ydata(data) >> return line, >> >> def data_gen(): >> while True: yield np.random.rand(10) >> >> ani = animation.FuncAnimation(fig, update, data_gen, interval=100) >> plt.show() >> >> This codes works; but, I am very confused by it. For example: >> >> 1. There are 3 positional arguments given for animation.FuncAnimation; but, >> in the >> API documentation for this class >> (http://matplotlib.org/api/animation_api.html), only >> two positional arguments are shown. > The third one is the third one, > "/frames/ can be a generator, an iterable, or a number of frames." This makes very little sense to me --- what does "or a number of frames" mean? > The name "data_gen" could suggest its meaning (after having read the doc). I am not sure what you are referencing as "the doc"; but I did read the documentation several times and English is my native language. > Note please that the keyword parameters are specified extra. I am aware of this. Perhaps, I am a Python dummy --- when I see something like value = None in a Python API argument, I interpret this as a keyword argument and not a generator. > >> 2. data, the argument to the update function seems to be undefined. > FuncAnimation usually passes the frame number: 0, 1, 2, ... as the first > parameter of the update function, when "frames" is None, or the number of > frames. If - as here - the third parameter is a generator, it passes the > yielded data to update. > It may be used or not. Ok, I understand that better now. But, you say "or *the number* of frames" but the documentation reads "or *a number* of frames" --- what does this mean? And I still do not understand how to use the first argument of the function to be called for the animation. In another animation example (histogram.py), the animation function is defined by: def animate(i): # simulate new data coming in data = np.random.randn(1000 n, bins = np.histogram(data, 100) top = bottom + n verts[1::5,1] = top verts[2::5,1] = top This works of course; but, why is the "i" required? There is no other reference to it in the entire script. If I remove it; i.e. use def animate(): I get the following error: TypeError: animate() takes no arguments (1 given) I do not understand how this explains the fact that the function no longer has any arguments. Please explain the meaning of this error message? > > Please, in such cases test your programs by adding some simple tracing > contraptions, say, print(data) inside update. I did this and more before posting my email. I would not have posted this unless I thought it was necessary. And I thought one purpose of this user group was to help people --- even if they ask a question which may be annoying or "stupid" in some subscribers opinion. I try to remember what a very wise teacher once said --- "there is no such thing as a stupid question". |
From: Jerzy K. <jer...@un...> - 2015-04-23 11:18:57
|
Le 23/04/2015 12:22, Virgil Stokes a écrit : > The following interesting example (random_data.py) is posted at: > > http://matplotlib.org/1.4.2/examples/animation/random_data.html > > > import matplotlib.pyplot as plt > import matplotlib.animation as animation import numpy as np > > fig, ax = plt.subplots() > line, = ax.plot(np.random.rand(10)) > ax.set_ylim(0, 1) > > def update(data): > line.set_ydata(data) > return line, > > def data_gen(): > while True: yield np.random.rand(10) > > ani = animation.FuncAnimation(fig, update, data_gen, interval=100) > plt.show() > > This codes works; but, I am very confused by it. For example: > > 1. There are 3 positional arguments given for animation.FuncAnimation; > but, in the > API documentation for this class > (http://matplotlib.org/api/animation_api.html), only > two positional arguments are shown. The third one is the third one, "/frames/ can be a generator, an iterable, or a number of frames." The name "data_gen" could suggest its meaning (after having read the doc). Note please that the keyword parameters are specified extra. > 2. data, the argument to the update function seems to be undefined. FuncAnimation usually passes the frame number: 0, 1, 2, ... as the first parameter of the update function, when "frames" is None, or the number of frames. If - as here - the third parameter is a generator, it passes the yielded data to update. It may be used or not. Please, in such cases test your programs by adding some simple tracing contraptions, say, print(data) inside update. Jerzy Karczmarczuk |
From: Virgil S. <vs...@it...> - 2015-04-23 10:44:15
|
The following interesting example (random_data.py) is posted at: http://matplotlib.org/1.4.2/examples/animation/random_data.html import matplotlib.pyplot as plt import matplotlib.animation as animation fig, ax = plt.subplots() line, = ax.plot(np.random.rand(10)) ax.set_ylim(0, 1) def update(data): line.set_ydata(data) return line, def data_gen(): while True: yield np.random.rand(10) ani = animation.FuncAnimation(fig, update, data_gen, interval=100) plt.show() This codes works; but, I am very confused by it. For example: 1. There are 3 positional arguments given for animation.FuncAnimation; but, in the API documentation for this class (http://matplotlib.org/api/animation_api.html), only two positional arguments are shown. 2. data, the argument to the update function seems to be undefined. I would appreciate an explanation (in some detail) of how this code actually works. |
From: burak1000 <bur...@gm...> - 2015-04-21 20:33:06
|
Hi all, I believe I've found a bug in scatter function in matplotlib 1.4.2: from numpy import * import matplotlib from matplotlib.pyplot import * figure() subplot(111) h = scatter([NAN], [NAN], marker="o", facecolor="r", edgecolor="r", s=3) legend([h], ["scatter"]) savefig("out.png") close() The code above fails with ValueError exception: Traceback (most recent call last): File "legend.py", line 9, in <module> legend([h], ["scatter"]) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/pyplot.py", line 3381, in legend ret = gca().legend(*args, **kwargs) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/axes.py", line 4778, in legend self.legend_ = mlegend.Legend(self, handles, labels, **kwargs) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/legend.py", line 366, in __init__ self._init_legend_box(handles, labels) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/legend.py", line 630, in _init_legend_box handlebox) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/legend_handler.py", line 103, in __call__ handlebox.get_transform()) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/legend_handler.py", line 325, in create_artists width, height, fontsize) File "/usr/local/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg/matplotlib/legend_handler.py", line 282, in get_sizes size_max = max(orig_handle.get_sizes()) * legend.markerscale ** 2 ValueError: max() arg is an empty sequence There is some more information and the source of the problem described here: http://stackoverflow.com/questions/29743696/legends-for-scatter-plots-with-nans-in-matplotlib Thanks, Tomasz -- View this message in context: http://matplotlib.1069221.n5.nabble.com/Problem-creating-legend-for-scatter-plot-with-NANs-tp45419.html Sent from the matplotlib - users mailing list archive at Nabble.com. |
From: Benjamin R. <ben...@ou...> - 2015-04-21 13:44:03
|
The addmpl() method isn't right. You created a canvas object, assigned it to self.canvas, but then tried to call FigureCanvas.__init__(), passing it whatever object "self" is. What class is addmpl() a part of? What does it subclass? On Tue, Apr 21, 2015 at 7:24 AM, Christian Ambros <am...@ym...> wrote: > Hi, > > I embedded Ryan's examble for PyQt5-matplotlib use into my App but I get > the following error: > > /usr/local/lib/python3.4/dist-packages/mpl_toolkits/mplot3d/axes3d.py:1009: > UserWarning: Axes3D.figure.canvas is 'None', mouse rotation disabled. Set > canvas then call Axes3D.mouse_init(). > warnings.warn('Axes3D.figure.canvas is \'None\', mouse rotation > disabled. Set canvas then call Axes3D.mouse_init().') > > From Stackoverflow, which host to question about this, I know that mouse > actions are disabled when the canvas is re-initialized by whatever. > > The only position I do such an operation is in here: > > > > > > > > *def addmpl(self, fig): self.canvas = FigureCanvas(fig) > #FigureCanvas.__init__(self, fig) #Axes3D.mouse_init(self) > self.mplvl.addWidget(self.canvas) self.canvas.draw() > self.toolbar = NavigationToolbar(self.canvas, self.mplwindow, > coordinates=True) self.mplvl.addWidget(self.toolbar)* > > On of the Stackoverflow suggestion says, that re initializing FigureCanvas > should do the trick but I'll get: > > Traceback (most recent call last): > File "./ex_0.1.py", line 145, in <module> > main(sys.argv) > File "./ex_0.1.py", line 53, in main > mainwindow.addmpl(fig1) > File "./ex_0.1.py", line 116, in addmpl > FigureCanvas.__init__(self, fig) > File > "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_qt5agg.py", > line 181, in __init__ > FigureCanvasQT.__init__(self, figure) > File > "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_qt5.py", > line 237, in __init__ > super(FigureCanvasQT, self).__init__(figure=figure) > TypeError: super(type, obj): obj must be an instance or subtype of type > > as follow-up error message. > > just using *Axes3D.mouse_init()* , as suggested by matplotlib itself, > leads to: > > Traceback (most recent call last): > File "./ex_0.1.py", line 146, in <module> > main(sys.argv) > File "./ex_0.1.py", line 53, in main > mainwindow.addmpl(fig1) > File "./ex_0.1.py", line 118, in addmpl > Axes3D.mouse_init() > TypeError: mouse_init() missing 1 required positional argument: 'self' > > adding self leads to: > > Traceback (most recent call last): > File "./ex_0.1.py", line 146, in <module> > main(sys.argv) > File "./ex_0.1.py", line 53, in main > mainwindow.addmpl(fig1) > File "./ex_0.1.py", line 118, in addmpl > Axes3D.mouse_init(self) > File > "/usr/local/lib/python3.4/dist-packages/mpl_toolkits/mplot3d/axes3d.py", > line 1002, in mouse_init > canv = self.figure.canvas > AttributeError: 'Main' object has no attribute 'figure' > ./ex_0.1.py & > > Maybe I'm adding those lines at the wrong place, but I could fined > anything useful in the matplotlib documantation, that would help me out, > either. > > Any thougts that might help? > > Cheers, > Christian > > -- > "A little learning never caused anyone's head to explode!" > > > "Ein wenig Lernen hat noch niemandens Kopf zum Explodieren gebracht!" > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |
From: Christian A. <am...@ym...> - 2015-04-21 11:42:25
|
Hi, I embedded Ryan's examble for PyQt5-matplotlib use into my App but I get the following error: /usr/local/lib/python3.4/dist-packages/mpl_toolkits/mplot3d/axes3d.py:1009: UserWarning: Axes3D.figure.canvas is 'None', mouse rotation disabled. Set canvas then call Axes3D.mouse_init(). warnings.warn('Axes3D.figure.canvas is \'None\', mouse rotation disabled. Set canvas then call Axes3D.mouse_init().') >From Stackoverflow, which host to question about this, I know that mouse actions are disabled when the canvas is re-initialized by whatever. The only position I do such an operation is in here: def addmpl(self, fig): self.canvas = FigureCanvas(fig) #FigureCanvas.__init__(self, fig) #Axes3D.mouse_init(self) self.mplvl.addWidget(self.canvas) self.canvas.draw() self.toolbar = NavigationToolbar(self.canvas, self.mplwindow, coordinates=True) self.mplvl.addWidget(self.toolbar) On of the Stackoverflow suggestion says, that re initializing FigureCanvas should do the trick but I'll get: Traceback (most recent call last): File "./ex_0.1.py", line 145, in <module> main(sys.argv) File "./ex_0.1.py", line 53, in main mainwindow.addmpl(fig1) File "./ex_0.1.py", line 116, in addmpl FigureCanvas.__init__(self, fig) File "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_qt5agg.py", line 181, in __init__ FigureCanvasQT.__init__(self, figure) File "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_qt5.py", line 237, in __init__ super(FigureCanvasQT, self).__init__(figure=figure) TypeError: super(type, obj): obj must be an instance or subtype of type as follow-up error message. just using Axes3D.mouse_init() , as suggested by matplotlib itself, leads to: Traceback (most recent call last): File "./ex_0.1.py", line 146, in <module> main(sys.argv) File "./ex_0.1.py", line 53, in main mainwindow.addmpl(fig1) File "./ex_0.1.py", line 118, in addmpl Axes3D.mouse_init() TypeError: mouse_init() missing 1 required positional argument: 'self' adding self leads to: Traceback (most recent call last): File "./ex_0.1.py", line 146, in <module> main(sys.argv) File "./ex_0.1.py", line 53, in main mainwindow.addmpl(fig1) File "./ex_0.1.py", line 118, in addmpl Axes3D.mouse_init(self) File "/usr/local/lib/python3.4/dist-packages/mpl_toolkits/mplot3d/axes3d.py", line 1002, in mouse_init canv = self.figure.canvas AttributeError: 'Main' object has no attribute 'figure' ./ex_0.1.py & Maybe I'm adding those lines at the wrong place, but I could fined anything useful in the matplotlib documantation, that would help me out, either. Any thougts that might help? Cheers,Christian -- "A little learning never caused anyone's head to explode!" "Ein wenig Lernen hat noch niemandens Kopf zum Explodieren gebracht!" |
From: Denis-Alexander E. <den...@gm...> - 2015-04-17 16:37:48
|
Thanks everyone, I finally got back to this, your suggestions worked like a charme, example outputs can be seen here: https://github.com/mne-tools/mne-python/pull/1972 Best, Denis 2014-12-23 12:27 GMT+01:00 Phil Elson <pel...@gm...>: > If I understand your question fully, then yes it does. > Have a play, and let us know how you get on. > > Best, > > Phil > > On 22 December 2014 at 11:15, Denis-Alexander Engemann < > den...@gm...> wrote: > >> Thanks Phil, >> >> just to make sure I inderstand the logic of PathPatch. Does it cut out >> vertices / paths that are detected to be inside an outline as the star in >> this example? >> >> -Denis >> >> >> 2014-12-22 12:09 GMT+01:00 Phil Elson <pel...@gm...>: >> >>> Sorry its taken so long to get an answer, but essentially you want to >>> concatenate the outer coordinates with the inner ones (reversed) to >>> indicate that it is a hole. There is a pretty (simple) useful example that >>> I added a few years ago for demonstrating the use of paths for markers: >>> http://matplotlib.org/examples/pylab_examples/marker_path.html >>> >>> Constructing a patch from a path is as simple as (untested): >>> >>> import matplotlib.patches as mpatches >>> patch = mpatches.PathPatch(my_path, facecolor='red', edgecolor='yellow') >>> axes.add_patch(patch) >>> >>> >>> HTH, >>> >>> Phil >>> >>> >>> On 19 December 2014 at 23:01, Denis-Alexander Engemann < >>> den...@gm...> wrote: >>> >>>> Dear list, >>>> >>>> I would like to create a custom image clipping mask using patches. My >>>> constraint is that my patch is required to have an outer and multiple inner >>>> outlines. >>>> To provide an analogy, think of a mask used for disguise where you >>>> leave three holes, two for the eyes, one for the mouth. >>>> I have the xy coordinates for the 'head', and the xy coordinates for >>>> each of the holes that I don't want to be hidden by the ensuing clipping >>>> mask. >>>> >>>> What's the matplotlib way to construct my desired path + patch from >>>> that? >>>> Note, it's important in my case to use a patch object. What I need to >>>> do would not work by simply masking my image using a masked array. >>>> >>>> Any pointer would be highly appreciated -- >>>> Denis >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server >>>> from Actuate! Instantly Supercharge Your Business Reports and Dashboards >>>> with Interactivity, Sharing, Native Excel Exports, App Integration & >>>> more >>>> Get technology previously reserved for billion-dollar corporations, FREE >>>> >>>> http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk >>>> _______________________________________________ >>>> Matplotlib-users mailing list >>>> Mat...@li... >>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>> >>>> >>> >> > |
From: Nicolas P. R. <Nic...@in...> - 2015-04-17 11:38:15
|
[Apology for cross-posting] Dear all, EuroScipy 2015, the annual conference on Python in science will take place in Cambridge, UK on 26-30 August 2015. The conference features two days of tutorials followed by two days of scientific talks & posters and an extra day dedicated to developer sprints. It is the major event in Europe in the field of technical/scientific computing within the Python ecosystem. Data scientists, analysts, quants, PhD's, scientists and students from more than 20 countries attended the conference last year. The topics presented at EuroSciPy are very diverse, with a focus on advanced software engineering and original uses of Python and its scientific libraries, either in theoretical or experimental research, from both academia and the industry. Submissions for posters, talks & tutorials (beginner and advanced) are welcome on our website at http://www.euroscipy.org/2015/ Sprint proposals should be addressed directly to the organisation at eur...@py... Important dates Mar 24, 2015 Call for talks, posters & tutorials Apr 30, 2015 Talk and tutorials submission deadline May 1, 2015 Registration opens May 30, 2015 Final program announced Jun 15, 2015 Early-bird registration ends Aug 26-27, 2015 Tutorials Aug 28-29, 2015 Main conference Aug 30, 2015 Sprints We look forward to an exciting conference and hope to see you in Cambridge The EuroSciPy 2015 Team - http://www.euroscipy.org/2015/ |
From: Fabrice S. <si...@lm...> - 2015-04-17 08:04:58
|
Le vendredi 17 avril 2015, oyster a écrit : > Two 8bpp(Gimp, xnview say so) graylevel png files can be downloaded > The first (ramp-gray.png) which gives right array shape is > http://bbs.blendercn.org/data/attachment/forum/201504/17/090627ejhixti8vdthdnnn.png > The second one (python-gray.png) which gives 'wrong' array shape, at > least to me, is > http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png > > [code] > from pylab import * > > imgRampPng=imread('ramp-gray.png') > print (imgRampPng.shape) #(1, 255), that is right > print (imgRampPng.min(),imgRampPng.max()) #(0.0, 0.99607843) > print () > > imgGrayPng=imread('python-gray.png') > print (imgGrayPng.shape) #(128, 128, 3), *but I suppose it should > be (128, 128)* > print (imgGrayPng.min(),imgGrayPng.max()) #(0.0, 0.98823529) > print () > Ch1=imgGrayPng[:,:,0] > Ch2=imgGrayPng[:,:,1] > Ch3=imgGrayPng[:,:,2] > print (Ch1.min(), Ch1.max()) #(0.0, 0.98823529) > print (Ch2.min(), Ch2.max()) #(0.0, 0.98823529) > print (Ch3.min(), Ch3.max()) #(0.0, 0.98823529) #that is to say, > Ch1/2/3 hold same data > print () > [/code] Did you read my answer from yesterday ? your python-gray.png uses a color palette, the integer values stored in file are indexes to the (RGB) values given in the palette. Matplotlib is doing right in converting the indexes to the RGB values. The color palette represents here the grayscale, that's why all channel are equal. But the data is stored in the compact palette way. How were the two files produced? -- Fabrice |
From: Maik H. <mai...@b-...> - 2015-04-17 05:46:26
|
Hi, with normal polar plot it would work, but there is the problem with the half plot. So I use AxisArtist already. The segfault is caused by GridHelperCurveLinear and it appears on all my Computers here Python 2.7 (2 x Win7 64Bit, 1xWin7 32Bit, 2x Linux 64Bit) and mpl 1.4.2 The current solution would work for me, if I could change the axis tick labels created with axisartist. Maik Am 12.04.2015 um 03:02 schrieb Thomas Caswell: > Malk, > > This is a bit of a gap in mpl currently (but has come up a couple of times ( > https://github.com/matplotlib/matplotlib/issues/4217, > https://github.com/matplotlib/matplotlib/issues/2203, and > http://matplotlib.org/devdocs/devel/MEP/MEP24.html). > > One of the hold ups has been lack of a developer that uses polar plots > day-to-day and a lack of really clear use cases. I think we have three (at > least) distinct use cases. > > 1. origin always an 0, negative radius rotates by pi, always full 2pi > around, always solid circle (no inner axes) (useful for plotting bunches of > vectors against each other) > 2. center is at arbitrary 'r', values less than 'origin' are just not > shown, always full 2pi, no inner axes (use for for dB plots showing power > as function of angle) > 3. inner axes with arbitrary origin, possibly not full 2pi > > It is not immediately clear to me if these can all be done with the same > projection or even if they can be done with the 'standard' Axes class or if > we need to user AxesArtist here. > > This discussion should probably move to MEP24/the devel list. > > What version of mpl are you using? Your example causes seg-faults (!) on > my system, but I have not sorted out why (may be really strange install > issues on my end). > > Tom > > On Thu, Apr 9, 2015 at 6:08 AM Maik Hoffmann <mai...@b-...> wrote: > >> Hello, >> I'm using mpl_toolkits.axisartist.floating_axes.GridHelperCurveLinear >> for creating half-polar plots from 180 degree measurements for receive >> sensitivity. >> >> Working with the measurement values itself is no problem if I let the >> values scaling start at zero. >> If I use normalized values I can plot it also, but if I transform it >> into the dB scale I got a segfault in this lib. >> >> I provide an example. For my problems I would like to have a solution >> that I can either use r limit from -30 to 0 (f3) or changing the tick >> labels in figure f2. >> >> And by the way is there a possibility that the if i want to plot data in >> the range from 80 to 120, that rlim(80,120) would set the 80 to the >> centerpoint? At the moment I got only a small stripe. >> >> [code] >> """Demo of polar plot of arbitrary theta. This is a workaround for MPL's >> polar plot limitation >> to a full 360 deg. >> >> Based on >> http://matplotlib.org/mpl_toolkits/axes_grid/examples/ >> demo_floating_axes.py >> >> get from >> https://github.com/neuropy/neuropy/blob/master/neuropy/ >> scripts/polar_demo.py >> TODO: license / copyright >> """ >> >> from __future__ import division >> from __future__ import print_function >> >> import numpy as np >> import matplotlib.pyplot as plt >> >> from matplotlib.transforms import Affine2D >> from matplotlib.projections import PolarAxes >> from mpl_toolkits.axisartist import angle_helper >> from mpl_toolkits.axisartist.grid_finder import MaxNLocator >> from mpl_toolkits.axisartist.floating_axes import GridHelperCurveLinear, >> FloatingSubplot >> >> >> def fractional_polar_axes(f, thlim=(0, 180), rlim=(0, 1), step=(30, 0.2), >> thlabel='theta', rlabel='r', ticklabels=True, >> theta_offset=0): >> """Return polar axes that adhere to desired theta (in deg) and r >> limits. steps for theta >> and r are really just hints for the locators.""" >> th0, th1 = thlim # deg >> r0, r1 = rlim >> thstep, rstep = step >> >> tr_rotate = Affine2D().translate(theta_offset, 0) >> # scale degrees to radians: >> tr_scale = Affine2D().scale(np.pi/180., 1.) >> #pa = axes(polar="true") # Create a polar axis >> pa = PolarAxes >> tr = tr_rotate + tr_scale + pa.PolarTransform() >> theta_grid_locator = angle_helper.LocatorDMS((th1-th0)//thstep) >> r_grid_locator = MaxNLocator((r1-r0)//rstep) >> theta_tick_formatter = angle_helper.FormatterDMS() >> >> grid_helper = GridHelperCurveLinear(tr, >> extremes=(th0, th1, r0, r1), >> grid_locator1=theta_grid_locator, >> grid_locator2=r_grid_locator, >> >> tick_formatter1=theta_tick_formatter, >> tick_formatter2=None) >> >> a = FloatingSubplot(f, 111, grid_helper=grid_helper) >> >> f.add_subplot(a) >> >> # adjust x axis (theta): >> a.axis["bottom"].set_visible(False) >> a.axis["top"].set_axis_direction("bottom") # tick direction >> a.axis["top"].toggle(ticklabels=ticklabels, label=bool(thlabel)) >> a.axis["top"].major_ticklabels.set_axis_direction("top") >> a.axis["top"].label.set_axis_direction("top") >> >> # adjust y axis (r): >> a.axis["left"].set_axis_direction("bottom") # tick direction >> a.axis["right"].set_axis_direction("top") # tick direction >> a.axis["left"].toggle(ticklabels=ticklabels, label=bool(rlabel)) >> >> # add labels: >> a.axis["top"].label.set_text(thlabel) >> a.axis["left"].label.set_text(rlabel) >> >> # create a parasite axes whose transData is theta, r: >> auxa = a.get_aux_axes(tr) >> # make aux_ax to have a clip path as in a?: >> auxa.patch = a.patch >> # this has a side effect that the patch is drawn twice, and >> possibly over some other >> # artists. So, we decrease the zorder a bit to prevent this: >> a.patch.zorder = -2 >> >> >> # add sector lines for both dimensions: >> thticks = grid_helper.grid_info['lon_info'][0] >> rticks = grid_helper.grid_info['lat_info'][0] >> for th in thticks[1:-1]: # all but the first and last >> auxa.plot([th, th], [r0, r1], '--', c='grey', zorder=-1) >> for ri, r in enumerate(rticks): >> # plot first r line as axes border in solid black only if it >> isn't at r=0 >> if ri == 0 and r != 0: >> ls, lw, color = 'solid', 2, 'black' >> else: >> ls, lw, color = 'dashed', 1, 'grey' >> # From http://stackoverflow.com/a/19828753/2020363 >> auxa.add_artist(plt.Circle([0, 0], radius=r, ls=ls, lw=lw, >> color=color, fill=False, >> transform=auxa.transData._b, zorder=-1)) >> >> return auxa >> >> >> if __name__ == '__main__': >> f1 = plt.figure(facecolor='white', figsize=(16/2.54, 12/2.54), >> dpi=600) >> a1 = fractional_polar_axes(f1, thlim=(-90, 90),step=(10, >> 0.2),theta_offset=90) >> # example spiral plot: >> thstep = 10 >> th = np.arange(-90, 90+thstep, thstep) # deg >> rstep = 1/(len(th)-1) >> r = np.arange(0, 1+rstep, rstep) >> a1.plot(th, r, 'b') >> >> >> f1.show() >> >> f2 = plt.figure(facecolor='white', figsize=(16/2.54, 12/2.54), >> dpi=600) >> a2 = fractional_polar_axes(f2, thlim=(-90, >> 90),rlim=(0,30),step=(10, 8),theta_offset=90) >> # example spiral plot: >> r2 = 20 * np.log10(r) +30 >> a2.plot(th, r2, 'b') >> >> f2.show() >> >> f3 = plt.figure(facecolor='white', figsize=(16/2.54, 12/2.54), >> dpi=600) >> a3 = fractional_polar_axes(f2, thlim=(-90, 90),rlim=(-30,0), >> step=(10, 8),theta_offset=90) >> # example spiral plot: >> r3 = 20 * np.log10(r) >> a3.plot(th, r2, 'b') >> >> f2.show() >> >> [\code] >> >> -- >> >> >> ------------------------------------------------------------ >> ------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> > -- wissenschaftlicher Mitarbeiter Lehrstuhl Allgemeine Elektrotechnik und Messtechnik (AEMT) Fakultät Maschinenbau, Elektrotechnik und Wirtschaftsingenieurwesen Brandenburgische Technische Universität Cottbus Siemens-Halske-Ring 14 D-03046 Cottbus Tel.: +49-355-69-3425 Fax: +49-355-69-4104 http://www.tu-cottbus.de/fakultaet3/de/elektrotechnik-messtechnik/ |
From: oyster <lep...@gm...> - 2015-04-17 01:22:06
|
Two 8bpp(Gimp, xnview say so) graylevel png files can be downloaded The first (ramp-gray.png) which gives right array shape is http://bbs.blendercn.org/data/attachment/forum/201504/17/090627ejhixti8vdthdnnn.png The second one (python-gray.png) which gives 'wrong' array shape, at least to me, is http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png [code] from pylab import * imgRampPng=imread('ramp-gray.png') print (imgRampPng.shape) #(1, 255), that is right print (imgRampPng.min(),imgRampPng.max()) #(0.0, 0.99607843) print () imgGrayPng=imread('python-gray.png') print (imgGrayPng.shape) #(128, 128, 3), *but I suppose it should be (128, 128)* print (imgGrayPng.min(),imgGrayPng.max()) #(0.0, 0.98823529) print () Ch1=imgGrayPng[:,:,0] Ch2=imgGrayPng[:,:,1] Ch3=imgGrayPng[:,:,2] print (Ch1.min(), Ch1.max()) #(0.0, 0.98823529) print (Ch2.min(), Ch2.max()) #(0.0, 0.98823529) print (Ch3.min(), Ch3.max()) #(0.0, 0.98823529) #that is to say, Ch1/2/3 hold same data print () [/code] |
From: Thomas C. <tca...@gm...> - 2015-04-16 18:16:21
|
The 'animated' property is used _deep_ with in `axes.draw` ( https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes/_base.py#L2035) to skip artists with the 'animated' flag set. This makes them play nice with blitting (which explicitly uses `axes.draw_artist`) so they are not drawn on a call to `ax.draw` (which sets up the background canvas). Sorry, I should not have included them with out a good explanation, I was feeling too fancy with that example. Tom On Thu, Apr 16, 2015 at 11:27 AM Ryan Nelson <rne...@gm...> wrote: > Ben, > > Sorry. I probably should have just dropped that entirely. In my code > sample, it is actually commented out because it breaks the animation with > the nbagg backend. It was in Tom's example, so I left it in because I > wanted to find out what it was doing. > > Ryan > > On Thu, Apr 16, 2015 at 9:30 AM, Benjamin Root <ben...@ou...> wrote: > >> I just noticed your use of "animated=True". I have had trouble using that >> in the past with the animation module. It is a leftover from the days >> before the animation module and isn't actually used by it, IIRC. Try not >> supplying that argument. >> >> On Thu, Apr 16, 2015 at 8:18 AM, Ryan Nelson <rne...@gm...> >> wrote: >> >>> Tom, >>> >>> Thanks for the code. As it was given, I had to change `blit=True` in the >>> `FuncAnimation` call in order to get this to work in a regular Qt backend. >>> It did not work with the nbagg backend; however, if I used this code it >>> works fine: >>> #### >>> %matplotlib nbagg >>> >>> import numpy as np >>> import matplotlib.pyplot as plt >>> import matplotlib.animation as animate >>> >>> class Testing(object): >>> def __init__(self, ): >>> self.fig = plt.figure() >>> array = np.random.rand(4,5) >>> array = np.zeros((4,5)) >>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.)#, >>> animated=True) >>> self.pc.set_clim([0, 1]) >>> self.points = [plt.scatter(np.random.rand(), >>> np.random.rand())]#, animated=True)] >>> >>> def update(self, iter_num): >>> array = np.random.rand(4*5) >>> self.pc.set_array(array) >>> for point in self.points: >>> point.set_offsets([np.random.rand(), np.random.rand()]) >>> #return (self.pc, ) + tuple(self.points) >>> >>> >>> test = Testing() >>> ani = animate.FuncAnimation(test.fig, test.update, interval=250, >>> blit=False, frames=50) >>> plt.show() >>> #### >>> Also this code solves the problem I was having with several scatter >>> points being displayed upon multiple runs of the same code cell. >>> >>> I wasn't familiar with the "animated" keyword, and it is not well >>> documented yet. Can you give me a quick explanation of what it is doing? >>> >>> Ben: thanks for the hint about the _stop() method. I might look into >>> that for my example. >>> >>> Thank you all for your assistance. Things are working pretty much as I >>> need now! >>> >>> Ryan >>> >>> On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tca...@gm...> >>> wrote: >>> >>>> You can >>>> >>>> >>>> ``` >>>> >>>> #import matplotlib >>>> >>>> #matplotlib.use('nbagg') >>>> >>>> #%matplotlib nbagg >>>> >>>> import numpy as np >>>> >>>> import matplotlib.pyplot as plt >>>> >>>> import matplotlib.animation as animate >>>> >>>> >>>> class Testing(object): >>>> >>>> def __init__(self, ): >>>> >>>> self.fig = plt.figure() >>>> >>>> array = np.random.rand(4,5) >>>> >>>> array = np.zeros((4,5)) >>>> >>>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1., >>>> animated=True) >>>> >>>> self.pc.set_clim([0, 1]) >>>> >>>> self.points = [plt.scatter(np.random.rand(), np.random.rand(), >>>> animated=True)] >>>> >>>> >>>> def update(self, iter_num): >>>> >>>> array = np.random.rand(4*5) >>>> >>>> self.pc.set_array(array) >>>> >>>> for point in self.points: >>>> >>>> point.set_offsets([np.random.rand(), np.random.rand()]) >>>> >>>> >>>> return (self.pc, ) + tuple(self.points) >>>> >>>> >>>> >>>> test = Testing() >>>> >>>> ani = animate.FuncAnimation(test.fig, test.update, interval=10, >>>> blit=False, frames=50) >>>> >>>> plt.show() >>>> >>>> ``` >>>> >>>> note the addition of the `set_clim` line in the `__init__` method. >>>> >>>> >>>> You can also update the scatter artist in-place. The other changes >>>> will make it a bit for performant if you use bliting (which does not work >>>> with nbagg currently) >>>> >>>> Sorry I missed that part of the question first time through. >>>> >>>> Tom >>>> >>>> On Sun, Apr 12, 2015, 08:31 Ryan Nelson <rne...@gm...> wrote: >>>> >>>>> Tom, >>>>> >>>>> Thanks for the links. It does seem like fragments of my problem are >>>>> addressed in each of those comments, so I guess I'll have to wait for a bit >>>>> until those things get resolved. For now, I can just tell my students to >>>>> restart the IPython kernel each time they run the animation, which isn't >>>>> that hard. It's too bad that there isn't a 'stop' method now, but it's good >>>>> to hear that it isn't a completely terrible idea. >>>>> >>>>> I do still need help with Question #3 from my original email, though, >>>>> because it affects both the Qt and nbagg backends, and it is a bit of a >>>>> show stopper. I can't quite understand why initializing a pcolor(mesh) with >>>>> random numbers makes it possible to update the array in an animation, but >>>>> if you use all zeros or ones, it seems to be immutable. >>>>> >>>>> Ryan >>>>> >>>>> On Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tca...@gm...> >>>>> wrote: >>>>> >>>>>> Ryan, >>>>>> >>>>>> I have not looked at your exact issue yet, but there seems to be some >>>>>> underlying issues with animation and nbagg which we have not tracked down >>>>>> yet. See: >>>>>> >>>>>> https://github.com/matplotlib/matplotlib/pull/4290 >>>>>> https://github.com/matplotlib/matplotlib/issues/4287 >>>>>> https://github.com/matplotlib/matplotlib/issues/4288 >>>>>> >>>>>> Running until a given condition is an interesting idea, but I think >>>>>> that means the animation objects needs to have a public 'stop' method first! >>>>>> >>>>>> Tom >>>>>> >>>>>> On Fri, Apr 10, 2015 at 3:00 PM Ryan Nelson <rne...@gm...> >>>>>> wrote: >>>>>> >>>>>>> Good afternoon, all! >>>>>>> >>>>>>> I'm really digging the nbagg backend, and I'm trying to use it to >>>>>>> make an animation. As the subject suggests, though, I'm having some issues >>>>>>> with these features. I'm using Python 3.4, Matplotlib 1.4.3, and IPython >>>>>>> 3.1. Below is a small code sample that emulates my system. The pcolor call >>>>>>> can be substituted for pcolormesh, and I see the same behavior. (Sorry this >>>>>>> is a bit long. I tried to break it up as best as possible.) >>>>>>> >>>>>>> ############# >>>>>>> #import matplotlib >>>>>>> #matplotlib.use('nbagg') >>>>>>> #%matplotlib nbagg >>>>>>> import numpy as np >>>>>>> import matplotlib.pyplot as plt >>>>>>> import matplotlib.animation as animate >>>>>>> >>>>>>> class Testing(object): >>>>>>> def __init__(self, ): >>>>>>> self.fig = plt.figure() >>>>>>> array = np.random.rand(4,5) >>>>>>> #array = np.zeros((4,5)) >>>>>>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.) >>>>>>> self.points = [plt.scatter(np.random.rand(), >>>>>>> np.random.rand())] >>>>>>> >>>>>>> def update(self, iter_num): >>>>>>> array = np.random.rand(4*5) >>>>>>> self.pc.set_array(array) >>>>>>> for point in self.points: >>>>>>> point.remove() >>>>>>> self.points = [plt.scatter(np.random.rand(), >>>>>>> np.random.rand())] >>>>>>> >>>>>>> test = Testing() >>>>>>> animate.FuncAnimation(test.fig, test.update, interval=1000, >>>>>>> blit=False) >>>>>>> plt.show() >>>>>>> ############### >>>>>>> >>>>>>> 1. As is, this code runs fine with a Qt backend. It also runs fine >>>>>>> as a first call in a notebook if the `show` call is commented out and the >>>>>>> `%matplotlib` line is uncommented. However, if the `show` call is left in >>>>>>> and the `matplotlib.use` call is uncommented, then the pcolor array >>>>>>> changes, but the scatterpoint only shows on the first update and then >>>>>>> disappears forever. What is the difference between these two invocations? >>>>>>> >>>>>>> 2. With the `%matplotlib` magic uncommented and `show` removed, the >>>>>>> first invocation of this as a cell works fine. Closing the figure (with the >>>>>>> red X) and running the cell again shows two scatter plot points. Running it >>>>>>> a third time shows three scatter plot points. If you call `plt.clf` in the >>>>>>> next cell, I get a series of errors as follows: >>>>>>> _____ >>>>>>> ERROR:tornado.application:Exception in callback <bound method >>>>>>> TimerTornado._on_timer of <matplotlib.backends.backend_nbagg.TimerTornado >>>>>>> object at 0x7f894cb10f98>> >>>>>>> Traceback (most recent call last): >>>>>>> File "/usr/lib64/python3.4/site-packages/tornado/ioloop.py", line >>>>>>> 976, in _run >>>>>>> return self.callback() >>>>>>> File >>>>>>> "/usr/lib64/python3.4/site-packages/matplotlib/backend_bases.py", line >>>>>>> 1290, in _on_timer >>>>>>> ret = func(*args, **kwargs) >>>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>>> line 925, in _step >>>>>>> still_going = Animation._step(self, *args) >>>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>>> line 784, in _step >>>>>>> self._draw_next_frame(framedata, self._blit) >>>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>>> line 803, in _draw_next_frame >>>>>>> self._draw_frame(framedata) >>>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>>> line 1106, in _draw_frame >>>>>>> self._drawn_artists = self._func(framedata, *self._args) >>>>>>> File "<ipython-input-2-f9290d8f6154>", line 22, in update >>>>>>> point.remove() >>>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/artist.py", >>>>>>> line 139, in remove >>>>>>> self._remove_method(self) >>>>>>> File >>>>>>> "/usr/lib64/python3.4/site-packages/matplotlib/axes/_base.py", line 1479, >>>>>>> in <lambda> >>>>>>> collection._remove_method = lambda h: self.collections.remove(h) >>>>>>> ValueError: list.remove(x): x not in list >>>>>>> ______ >>>>>>> Why does this happen? Is there a way to close the animation cleanly? >>>>>>> >>>>>>> 3. If I uncomment the `np.zeros` call, the pcolor array never >>>>>>> updates irrespective of the backend. I see the same behavior with `np.ones` >>>>>>> as well, even if the dtype is set to `float`. Is there are a way to start >>>>>>> with a all-zero pcolor that allow dynamic updates? >>>>>>> >>>>>>> 4. I'd like to be able to have the animation run until a certain >>>>>>> condition is met. Is there a way to code a clean break for the animation? >>>>>>> >>>>>>> >>>>>>> As always, any help is most appreciated! >>>>>>> >>>>>>> Ryan >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> ------------------------------------------------------------ >>>>>>> ------------------ >>>>>>> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >>>>>>> Develop your own process in accordance with the BPMN 2 standard >>>>>>> Learn Process modeling best practices with Bonita BPM through live >>>>>>> exercises >>>>>>> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >>>>>>> event?utm_ >>>>>>> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_ >>>>>>> campaign=VA_SF_______________________________________________ >>>>>>> Matplotlib-users mailing list >>>>>>> Mat...@li... >>>>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>>>>> >>>>>> >>>>> >>> >>> >>> ------------------------------------------------------------------------------ >>> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >>> Develop your own process in accordance with the BPMN 2 standard >>> Learn Process modeling best practices with Bonita BPM through live >>> exercises >>> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >>> event?utm_ >>> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >>> _______________________________________________ >>> Matplotlib-users mailing list >>> Mat...@li... >>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>> >>> >> > |
From: Ryan N. <rne...@gm...> - 2015-04-16 15:29:40
|
Oops. I meant bits not bytes in my earlier statements. Sorry. On Thu, Apr 16, 2015 at 11:24 AM, Ryan Nelson <rne...@gm...> wrote: > xnview says it is 128*128*8, but "print >> imread('python-gray.png').shape" says (128, 128, 3), however I suppose >> it should be (128, 128)! > > Not sure that this is true, but I guess that xnview is using the third > dimension here to refer to a number of bytes. In this case, it is two > bytes, one for the black/white level and the other for alpha level. When > you import this with imread, the png is converted into a Numpy array. The > default behavior in this case is to create an array which is 128*128*3 > because the third dimmension is the (R,G,B) levels, which will all be equal > for a gray scale image. This behavior is probably intentional so that you > don't have to write different code to handle gray/color images. > > For python-color.png, it is my fault. xnview says it is 128*128*32, so >> it has alpha channel. Hence "imread().shape =(128, 128, 4)" is right > > If the third dimension from xnview is bytes, then yes, you are correct. > > btw. imread return array which has value between 0 and 1 for PNG file. >> But for other picture format, the value is 0~255. The manual says >> matplotlib reads PNG only by it self, and other files via PIL.But I >> think it is better to make the returned array consistent. > > That is most likely due to the way that PNG and e.g. older JPG are > defined. PNG defines each RGBA value using float32, while older JPG uses > uint8. Therefor, it would not make sense to change the dtype of the image > on import. > > Hope that helps. > Ryan > > > > > On Thu, Apr 16, 2015 at 10:51 AM, oyster <lep...@gm...> wrote: > >> Firstly, thanks, Fabrice Silva >> >> I have checked my picture files again. >> >> For python-gray.png, now it is attacched here or can be downloaded >> from >> http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png >> . >> xnview says it is 128*128*8, but "print >> imread('python-gray.png').shape" says (128, 128, 3), however I suppose >> it should be (128, 128)! >> >> For python-color.png, it is my fault. xnview says it is 128*128*32, so >> it has alpha channel. Hence "imread().shape =(128, 128, 4)" is right >> >> btw. imread return array which has value between 0 and 1 for PNG file. >> But for other picture format, the value is 0~255. The manual says >> matplotlib reads PNG only by it self, and other files via PIL.But I >> think it is better to make the returned array consistent. >> >> >> ------------------------------------------------------------------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> > |
From: Ryan N. <rne...@gm...> - 2015-04-16 15:27:40
|
Ben, Sorry. I probably should have just dropped that entirely. In my code sample, it is actually commented out because it breaks the animation with the nbagg backend. It was in Tom's example, so I left it in because I wanted to find out what it was doing. Ryan On Thu, Apr 16, 2015 at 9:30 AM, Benjamin Root <ben...@ou...> wrote: > I just noticed your use of "animated=True". I have had trouble using that > in the past with the animation module. It is a leftover from the days > before the animation module and isn't actually used by it, IIRC. Try not > supplying that argument. > > On Thu, Apr 16, 2015 at 8:18 AM, Ryan Nelson <rne...@gm...> > wrote: > >> Tom, >> >> Thanks for the code. As it was given, I had to change `blit=True` in the >> `FuncAnimation` call in order to get this to work in a regular Qt backend. >> It did not work with the nbagg backend; however, if I used this code it >> works fine: >> #### >> %matplotlib nbagg >> >> import numpy as np >> import matplotlib.pyplot as plt >> import matplotlib.animation as animate >> >> class Testing(object): >> def __init__(self, ): >> self.fig = plt.figure() >> array = np.random.rand(4,5) >> array = np.zeros((4,5)) >> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.)#, >> animated=True) >> self.pc.set_clim([0, 1]) >> self.points = [plt.scatter(np.random.rand(), np.random.rand())]#, >> animated=True)] >> >> def update(self, iter_num): >> array = np.random.rand(4*5) >> self.pc.set_array(array) >> for point in self.points: >> point.set_offsets([np.random.rand(), np.random.rand()]) >> #return (self.pc, ) + tuple(self.points) >> >> >> test = Testing() >> ani = animate.FuncAnimation(test.fig, test.update, interval=250, >> blit=False, frames=50) >> plt.show() >> #### >> Also this code solves the problem I was having with several scatter >> points being displayed upon multiple runs of the same code cell. >> >> I wasn't familiar with the "animated" keyword, and it is not well >> documented yet. Can you give me a quick explanation of what it is doing? >> >> Ben: thanks for the hint about the _stop() method. I might look into that >> for my example. >> >> Thank you all for your assistance. Things are working pretty much as I >> need now! >> >> Ryan >> >> On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tca...@gm...> >> wrote: >> >>> You can >>> >>> >>> ``` >>> >>> #import matplotlib >>> >>> #matplotlib.use('nbagg') >>> >>> #%matplotlib nbagg >>> >>> import numpy as np >>> >>> import matplotlib.pyplot as plt >>> >>> import matplotlib.animation as animate >>> >>> >>> class Testing(object): >>> >>> def __init__(self, ): >>> >>> self.fig = plt.figure() >>> >>> array = np.random.rand(4,5) >>> >>> array = np.zeros((4,5)) >>> >>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1., >>> animated=True) >>> >>> self.pc.set_clim([0, 1]) >>> >>> self.points = [plt.scatter(np.random.rand(), np.random.rand(), >>> animated=True)] >>> >>> >>> def update(self, iter_num): >>> >>> array = np.random.rand(4*5) >>> >>> self.pc.set_array(array) >>> >>> for point in self.points: >>> >>> point.set_offsets([np.random.rand(), np.random.rand()]) >>> >>> >>> return (self.pc, ) + tuple(self.points) >>> >>> >>> >>> test = Testing() >>> >>> ani = animate.FuncAnimation(test.fig, test.update, interval=10, >>> blit=False, frames=50) >>> >>> plt.show() >>> >>> ``` >>> >>> note the addition of the `set_clim` line in the `__init__` method. >>> >>> >>> You can also update the scatter artist in-place. The other changes will >>> make it a bit for performant if you use bliting (which does not work with >>> nbagg currently) >>> >>> Sorry I missed that part of the question first time through. >>> >>> Tom >>> >>> On Sun, Apr 12, 2015, 08:31 Ryan Nelson <rne...@gm...> wrote: >>> >>>> Tom, >>>> >>>> Thanks for the links. It does seem like fragments of my problem are >>>> addressed in each of those comments, so I guess I'll have to wait for a bit >>>> until those things get resolved. For now, I can just tell my students to >>>> restart the IPython kernel each time they run the animation, which isn't >>>> that hard. It's too bad that there isn't a 'stop' method now, but it's good >>>> to hear that it isn't a completely terrible idea. >>>> >>>> I do still need help with Question #3 from my original email, though, >>>> because it affects both the Qt and nbagg backends, and it is a bit of a >>>> show stopper. I can't quite understand why initializing a pcolor(mesh) with >>>> random numbers makes it possible to update the array in an animation, but >>>> if you use all zeros or ones, it seems to be immutable. >>>> >>>> Ryan >>>> >>>> On Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tca...@gm...> >>>> wrote: >>>> >>>>> Ryan, >>>>> >>>>> I have not looked at your exact issue yet, but there seems to be some >>>>> underlying issues with animation and nbagg which we have not tracked down >>>>> yet. See: >>>>> >>>>> https://github.com/matplotlib/matplotlib/pull/4290 >>>>> https://github.com/matplotlib/matplotlib/issues/4287 >>>>> https://github.com/matplotlib/matplotlib/issues/4288 >>>>> >>>>> Running until a given condition is an interesting idea, but I think >>>>> that means the animation objects needs to have a public 'stop' method first! >>>>> >>>>> Tom >>>>> >>>>> On Fri, Apr 10, 2015 at 3:00 PM Ryan Nelson <rne...@gm...> >>>>> wrote: >>>>> >>>>>> Good afternoon, all! >>>>>> >>>>>> I'm really digging the nbagg backend, and I'm trying to use it to >>>>>> make an animation. As the subject suggests, though, I'm having some issues >>>>>> with these features. I'm using Python 3.4, Matplotlib 1.4.3, and IPython >>>>>> 3.1. Below is a small code sample that emulates my system. The pcolor call >>>>>> can be substituted for pcolormesh, and I see the same behavior. (Sorry this >>>>>> is a bit long. I tried to break it up as best as possible.) >>>>>> >>>>>> ############# >>>>>> #import matplotlib >>>>>> #matplotlib.use('nbagg') >>>>>> #%matplotlib nbagg >>>>>> import numpy as np >>>>>> import matplotlib.pyplot as plt >>>>>> import matplotlib.animation as animate >>>>>> >>>>>> class Testing(object): >>>>>> def __init__(self, ): >>>>>> self.fig = plt.figure() >>>>>> array = np.random.rand(4,5) >>>>>> #array = np.zeros((4,5)) >>>>>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.) >>>>>> self.points = [plt.scatter(np.random.rand(), >>>>>> np.random.rand())] >>>>>> >>>>>> def update(self, iter_num): >>>>>> array = np.random.rand(4*5) >>>>>> self.pc.set_array(array) >>>>>> for point in self.points: >>>>>> point.remove() >>>>>> self.points = [plt.scatter(np.random.rand(), >>>>>> np.random.rand())] >>>>>> >>>>>> test = Testing() >>>>>> animate.FuncAnimation(test.fig, test.update, interval=1000, >>>>>> blit=False) >>>>>> plt.show() >>>>>> ############### >>>>>> >>>>>> 1. As is, this code runs fine with a Qt backend. It also runs fine as >>>>>> a first call in a notebook if the `show` call is commented out and the >>>>>> `%matplotlib` line is uncommented. However, if the `show` call is left in >>>>>> and the `matplotlib.use` call is uncommented, then the pcolor array >>>>>> changes, but the scatterpoint only shows on the first update and then >>>>>> disappears forever. What is the difference between these two invocations? >>>>>> >>>>>> 2. With the `%matplotlib` magic uncommented and `show` removed, the >>>>>> first invocation of this as a cell works fine. Closing the figure (with the >>>>>> red X) and running the cell again shows two scatter plot points. Running it >>>>>> a third time shows three scatter plot points. If you call `plt.clf` in the >>>>>> next cell, I get a series of errors as follows: >>>>>> _____ >>>>>> ERROR:tornado.application:Exception in callback <bound method >>>>>> TimerTornado._on_timer of <matplotlib.backends.backend_nbagg.TimerTornado >>>>>> object at 0x7f894cb10f98>> >>>>>> Traceback (most recent call last): >>>>>> File "/usr/lib64/python3.4/site-packages/tornado/ioloop.py", line >>>>>> 976, in _run >>>>>> return self.callback() >>>>>> File >>>>>> "/usr/lib64/python3.4/site-packages/matplotlib/backend_bases.py", line >>>>>> 1290, in _on_timer >>>>>> ret = func(*args, **kwargs) >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>> line 925, in _step >>>>>> still_going = Animation._step(self, *args) >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>> line 784, in _step >>>>>> self._draw_next_frame(framedata, self._blit) >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>> line 803, in _draw_next_frame >>>>>> self._draw_frame(framedata) >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>>> line 1106, in _draw_frame >>>>>> self._drawn_artists = self._func(framedata, *self._args) >>>>>> File "<ipython-input-2-f9290d8f6154>", line 22, in update >>>>>> point.remove() >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/artist.py", >>>>>> line 139, in remove >>>>>> self._remove_method(self) >>>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/axes/_base.py", >>>>>> line 1479, in <lambda> >>>>>> collection._remove_method = lambda h: self.collections.remove(h) >>>>>> ValueError: list.remove(x): x not in list >>>>>> ______ >>>>>> Why does this happen? Is there a way to close the animation cleanly? >>>>>> >>>>>> 3. If I uncomment the `np.zeros` call, the pcolor array never updates >>>>>> irrespective of the backend. I see the same behavior with `np.ones` as >>>>>> well, even if the dtype is set to `float`. Is there are a way to start with >>>>>> a all-zero pcolor that allow dynamic updates? >>>>>> >>>>>> 4. I'd like to be able to have the animation run until a certain >>>>>> condition is met. Is there a way to code a clean break for the animation? >>>>>> >>>>>> >>>>>> As always, any help is most appreciated! >>>>>> >>>>>> Ryan >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> ------------------------------------------------------------ >>>>>> ------------------ >>>>>> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >>>>>> Develop your own process in accordance with the BPMN 2 standard >>>>>> Learn Process modeling best practices with Bonita BPM through live >>>>>> exercises >>>>>> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >>>>>> event?utm_ >>>>>> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_ >>>>>> campaign=VA_SF_______________________________________________ >>>>>> Matplotlib-users mailing list >>>>>> Mat...@li... >>>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>>>> >>>>> >>>> >> >> >> ------------------------------------------------------------------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> > |
From: Ryan N. <rne...@gm...> - 2015-04-16 15:24:31
|
> > xnview says it is 128*128*8, but "print > imread('python-gray.png').shape" says (128, 128, 3), however I suppose > it should be (128, 128)! Not sure that this is true, but I guess that xnview is using the third dimension here to refer to a number of bytes. In this case, it is two bytes, one for the black/white level and the other for alpha level. When you import this with imread, the png is converted into a Numpy array. The default behavior in this case is to create an array which is 128*128*3 because the third dimmension is the (R,G,B) levels, which will all be equal for a gray scale image. This behavior is probably intentional so that you don't have to write different code to handle gray/color images. For python-color.png, it is my fault. xnview says it is 128*128*32, so > it has alpha channel. Hence "imread().shape =(128, 128, 4)" is right If the third dimension from xnview is bytes, then yes, you are correct. btw. imread return array which has value between 0 and 1 for PNG file. > But for other picture format, the value is 0~255. The manual says > matplotlib reads PNG only by it self, and other files via PIL.But I > think it is better to make the returned array consistent. That is most likely due to the way that PNG and e.g. older JPG are defined. PNG defines each RGBA value using float32, while older JPG uses uint8. Therefor, it would not make sense to change the dtype of the image on import. Hope that helps. Ryan On Thu, Apr 16, 2015 at 10:51 AM, oyster <lep...@gm...> wrote: > Firstly, thanks, Fabrice Silva > > I have checked my picture files again. > > For python-gray.png, now it is attacched here or can be downloaded > from > http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png > . > xnview says it is 128*128*8, but "print > imread('python-gray.png').shape" says (128, 128, 3), however I suppose > it should be (128, 128)! > > For python-color.png, it is my fault. xnview says it is 128*128*32, so > it has alpha channel. Hence "imread().shape =(128, 128, 4)" is right > > btw. imread return array which has value between 0 and 1 for PNG file. > But for other picture format, the value is 0~255. The manual says > matplotlib reads PNG only by it self, and other files via PIL.But I > think it is better to make the returned array consistent. > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |
From: Fabrice S. <si...@lm...> - 2015-04-16 15:23:31
|
Le jeudi 16 avril 2015, oyster a écrit : > Firstly, thanks, Fabrice Silva > > I have checked my picture files again. > > For python-gray.png, now it is attacched here or can be downloaded > from http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png. > xnview says it is 128*128*8, but "print > imread('python-gray.png').shape" says (128, 128, 3), however I suppose > it should be (128, 128)! Funnily (or not), the png is in fact 8-bits depth so you could infer it is grayscale, but matplotlib is right : your file uses a color palette. The 8-bits values refer to indices of the 256-length color palette. These indices are then converted back to the colorspace, so the shape is eventually (...,3). Unfortunately, the color palette is here the grayscale... -- Fabrice |
From: oyster <lep...@gm...> - 2015-04-16 14:52:04
|
Firstly, thanks, Fabrice Silva I have checked my picture files again. For python-gray.png, now it is attacched here or can be downloaded from http://bbs.blendercn.org/data/attachment/forum/201504/16/222351w3952n3o9968m9a5.png. xnview says it is 128*128*8, but "print imread('python-gray.png').shape" says (128, 128, 3), however I suppose it should be (128, 128)! For python-color.png, it is my fault. xnview says it is 128*128*32, so it has alpha channel. Hence "imread().shape =(128, 128, 4)" is right btw. imread return array which has value between 0 and 1 for PNG file. But for other picture format, the value is 0~255. The manual says matplotlib reads PNG only by it self, and other files via PIL.But I think it is better to make the returned array consistent. |
From: Benjamin R. <ben...@ou...> - 2015-04-16 13:49:07
|
That will be up to him. The only reason why I know about the work is because our publisher wanted to make sure that our two books didn't cover the same material. He isn't a regular on the mailing list, so I don't know if he even would see this message. I'll let him know that there is interest. Ben Root On Wed, Apr 15, 2015 at 9:16 PM, Chris O'Halloran <cm...@gm...> wrote: > On 16 April 2015 at 09:51, Benjamin Root <ben...@ou...> wrote: > >> A little birdie has told me that someone else is writing a new >> comprehensive matplotlib book (I think it would replace Sandros' book). >> Last I heard from the birdie, he was most of the way done with the >> manuscript. Based on my experience with the edit/review process, I would >> guess 2-3 more months to see it finished and published. >> >> > Oh cool. I'll look out for this. Will it be advertised on this list? > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |
From: Benjamin R. <ben...@ou...> - 2015-04-16 13:31:07
|
I just noticed your use of "animated=True". I have had trouble using that in the past with the animation module. It is a leftover from the days before the animation module and isn't actually used by it, IIRC. Try not supplying that argument. On Thu, Apr 16, 2015 at 8:18 AM, Ryan Nelson <rne...@gm...> wrote: > Tom, > > Thanks for the code. As it was given, I had to change `blit=True` in the > `FuncAnimation` call in order to get this to work in a regular Qt backend. > It did not work with the nbagg backend; however, if I used this code it > works fine: > #### > %matplotlib nbagg > > import numpy as np > import matplotlib.pyplot as plt > import matplotlib.animation as animate > > class Testing(object): > def __init__(self, ): > self.fig = plt.figure() > array = np.random.rand(4,5) > array = np.zeros((4,5)) > self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.)#, > animated=True) > self.pc.set_clim([0, 1]) > self.points = [plt.scatter(np.random.rand(), np.random.rand())]#, > animated=True)] > > def update(self, iter_num): > array = np.random.rand(4*5) > self.pc.set_array(array) > for point in self.points: > point.set_offsets([np.random.rand(), np.random.rand()]) > #return (self.pc, ) + tuple(self.points) > > > test = Testing() > ani = animate.FuncAnimation(test.fig, test.update, interval=250, > blit=False, frames=50) > plt.show() > #### > Also this code solves the problem I was having with several scatter points > being displayed upon multiple runs of the same code cell. > > I wasn't familiar with the "animated" keyword, and it is not well > documented yet. Can you give me a quick explanation of what it is doing? > > Ben: thanks for the hint about the _stop() method. I might look into that > for my example. > > Thank you all for your assistance. Things are working pretty much as I > need now! > > Ryan > > On Sun, Apr 12, 2015 at 9:24 AM, Thomas Caswell <tca...@gm...> > wrote: > >> You can >> >> >> ``` >> >> #import matplotlib >> >> #matplotlib.use('nbagg') >> >> #%matplotlib nbagg >> >> import numpy as np >> >> import matplotlib.pyplot as plt >> >> import matplotlib.animation as animate >> >> >> class Testing(object): >> >> def __init__(self, ): >> >> self.fig = plt.figure() >> >> array = np.random.rand(4,5) >> >> array = np.zeros((4,5)) >> >> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1., >> animated=True) >> >> self.pc.set_clim([0, 1]) >> >> self.points = [plt.scatter(np.random.rand(), np.random.rand(), >> animated=True)] >> >> >> def update(self, iter_num): >> >> array = np.random.rand(4*5) >> >> self.pc.set_array(array) >> >> for point in self.points: >> >> point.set_offsets([np.random.rand(), np.random.rand()]) >> >> >> return (self.pc, ) + tuple(self.points) >> >> >> >> test = Testing() >> >> ani = animate.FuncAnimation(test.fig, test.update, interval=10, >> blit=False, frames=50) >> >> plt.show() >> >> ``` >> >> note the addition of the `set_clim` line in the `__init__` method. >> >> >> You can also update the scatter artist in-place. The other changes will >> make it a bit for performant if you use bliting (which does not work with >> nbagg currently) >> >> Sorry I missed that part of the question first time through. >> >> Tom >> >> On Sun, Apr 12, 2015, 08:31 Ryan Nelson <rne...@gm...> wrote: >> >>> Tom, >>> >>> Thanks for the links. It does seem like fragments of my problem are >>> addressed in each of those comments, so I guess I'll have to wait for a bit >>> until those things get resolved. For now, I can just tell my students to >>> restart the IPython kernel each time they run the animation, which isn't >>> that hard. It's too bad that there isn't a 'stop' method now, but it's good >>> to hear that it isn't a completely terrible idea. >>> >>> I do still need help with Question #3 from my original email, though, >>> because it affects both the Qt and nbagg backends, and it is a bit of a >>> show stopper. I can't quite understand why initializing a pcolor(mesh) with >>> random numbers makes it possible to update the array in an animation, but >>> if you use all zeros or ones, it seems to be immutable. >>> >>> Ryan >>> >>> On Sat, Apr 11, 2015 at 8:35 PM, Thomas Caswell <tca...@gm...> >>> wrote: >>> >>>> Ryan, >>>> >>>> I have not looked at your exact issue yet, but there seems to be some >>>> underlying issues with animation and nbagg which we have not tracked down >>>> yet. See: >>>> >>>> https://github.com/matplotlib/matplotlib/pull/4290 >>>> https://github.com/matplotlib/matplotlib/issues/4287 >>>> https://github.com/matplotlib/matplotlib/issues/4288 >>>> >>>> Running until a given condition is an interesting idea, but I think >>>> that means the animation objects needs to have a public 'stop' method first! >>>> >>>> Tom >>>> >>>> On Fri, Apr 10, 2015 at 3:00 PM Ryan Nelson <rne...@gm...> >>>> wrote: >>>> >>>>> Good afternoon, all! >>>>> >>>>> I'm really digging the nbagg backend, and I'm trying to use it to make >>>>> an animation. As the subject suggests, though, I'm having some issues with >>>>> these features. I'm using Python 3.4, Matplotlib 1.4.3, and IPython 3.1. >>>>> Below is a small code sample that emulates my system. The pcolor call can >>>>> be substituted for pcolormesh, and I see the same behavior. (Sorry this is >>>>> a bit long. I tried to break it up as best as possible.) >>>>> >>>>> ############# >>>>> #import matplotlib >>>>> #matplotlib.use('nbagg') >>>>> #%matplotlib nbagg >>>>> import numpy as np >>>>> import matplotlib.pyplot as plt >>>>> import matplotlib.animation as animate >>>>> >>>>> class Testing(object): >>>>> def __init__(self, ): >>>>> self.fig = plt.figure() >>>>> array = np.random.rand(4,5) >>>>> #array = np.zeros((4,5)) >>>>> self.pc = plt.pcolor(array, edgecolor='k', linewidth=1.) >>>>> self.points = [plt.scatter(np.random.rand(), np.random.rand())] >>>>> >>>>> def update(self, iter_num): >>>>> array = np.random.rand(4*5) >>>>> self.pc.set_array(array) >>>>> for point in self.points: >>>>> point.remove() >>>>> self.points = [plt.scatter(np.random.rand(), np.random.rand())] >>>>> >>>>> test = Testing() >>>>> animate.FuncAnimation(test.fig, test.update, interval=1000, blit=False) >>>>> plt.show() >>>>> ############### >>>>> >>>>> 1. As is, this code runs fine with a Qt backend. It also runs fine as >>>>> a first call in a notebook if the `show` call is commented out and the >>>>> `%matplotlib` line is uncommented. However, if the `show` call is left in >>>>> and the `matplotlib.use` call is uncommented, then the pcolor array >>>>> changes, but the scatterpoint only shows on the first update and then >>>>> disappears forever. What is the difference between these two invocations? >>>>> >>>>> 2. With the `%matplotlib` magic uncommented and `show` removed, the >>>>> first invocation of this as a cell works fine. Closing the figure (with the >>>>> red X) and running the cell again shows two scatter plot points. Running it >>>>> a third time shows three scatter plot points. If you call `plt.clf` in the >>>>> next cell, I get a series of errors as follows: >>>>> _____ >>>>> ERROR:tornado.application:Exception in callback <bound method >>>>> TimerTornado._on_timer of <matplotlib.backends.backend_nbagg.TimerTornado >>>>> object at 0x7f894cb10f98>> >>>>> Traceback (most recent call last): >>>>> File "/usr/lib64/python3.4/site-packages/tornado/ioloop.py", line >>>>> 976, in _run >>>>> return self.callback() >>>>> File >>>>> "/usr/lib64/python3.4/site-packages/matplotlib/backend_bases.py", line >>>>> 1290, in _on_timer >>>>> ret = func(*args, **kwargs) >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>> line 925, in _step >>>>> still_going = Animation._step(self, *args) >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>> line 784, in _step >>>>> self._draw_next_frame(framedata, self._blit) >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>> line 803, in _draw_next_frame >>>>> self._draw_frame(framedata) >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/animation.py", >>>>> line 1106, in _draw_frame >>>>> self._drawn_artists = self._func(framedata, *self._args) >>>>> File "<ipython-input-2-f9290d8f6154>", line 22, in update >>>>> point.remove() >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/artist.py", line >>>>> 139, in remove >>>>> self._remove_method(self) >>>>> File "/usr/lib64/python3.4/site-packages/matplotlib/axes/_base.py", >>>>> line 1479, in <lambda> >>>>> collection._remove_method = lambda h: self.collections.remove(h) >>>>> ValueError: list.remove(x): x not in list >>>>> ______ >>>>> Why does this happen? Is there a way to close the animation cleanly? >>>>> >>>>> 3. If I uncomment the `np.zeros` call, the pcolor array never updates >>>>> irrespective of the backend. I see the same behavior with `np.ones` as >>>>> well, even if the dtype is set to `float`. Is there are a way to start with >>>>> a all-zero pcolor that allow dynamic updates? >>>>> >>>>> 4. I'd like to be able to have the animation run until a certain >>>>> condition is met. Is there a way to code a clean break for the animation? >>>>> >>>>> >>>>> As always, any help is most appreciated! >>>>> >>>>> Ryan >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> ------------------------------------------------------------ >>>>> ------------------ >>>>> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >>>>> Develop your own process in accordance with the BPMN 2 standard >>>>> Learn Process modeling best practices with Bonita BPM through live >>>>> exercises >>>>> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >>>>> event?utm_ >>>>> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_ >>>>> campaign=VA_SF_______________________________________________ >>>>> Matplotlib-users mailing list >>>>> Mat...@li... >>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>>> >>>> >>> > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |