From: Chad K. <cck...@gm...> - 2008-12-08 18:45:24
|
I've got many series of data that I want to plot, and each has an additional scalar that is valid for the whole series. What I want to do is plot all these series on top of each other (plot can do this just fine), but with the additional scalar changing the color, efectively using color as the z-axis. I'm not seeing how to do that. If there was a function where I could give a color map a value and it would spit out the color, that would work, but I haven't seen it. Thanks for your help. --Chad Kidder |
From: John H. <jd...@gm...> - 2008-12-08 18:53:08
|
On Mon, Dec 8, 2008 at 12:45 PM, Chad Kidder <cck...@gm...> wrote: > I've got many series of data that I want to plot, and each has an > additional scalar that is valid for the whole series. What I want to > do is plot all these series on top of each other (plot can do this > just fine), but with the additional scalar changing the color, > efectively using color as the z-axis. I'm not seeing how to do that. > If there was a function where I could give a color map a value and it > would spit out the color, that would work, but I haven't seen it. > Thanks for your help. Check out the scatter_demo -- scatter takes an optional argument 'c' for the color and an optional colormap http://matplotlib.sourceforge.net/users/screenshots.html#scatter-demo > > --Chad Kidder > > > > ------------------------------------------------------------------------------ > SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada. > The future of the web can't happen without you. Join us at MIX09 to help > pave the way to the Next Web now. Learn more and register at > http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |
From: Ryan M. <rm...@gm...> - 2008-12-08 18:55:56
|
Chad Kidder wrote: > I've got many series of data that I want to plot, and each has an > additional scalar that is valid for the whole series. What I want to > do is plot all these series on top of each other (plot can do this > just fine), but with the additional scalar changing the color, > efectively using color as the z-axis. I'm not seeing how to do that. > If there was a function where I could give a color map a value and it > would spit out the color, that would work, but I haven't seen it. > Thanks for your help. Try using scatter instead of plot. Specifically, the 'c' keyword argument: *c*: a color. *c* can be a single color format string, or a sequence of color specifications of length *N*, or a sequence of *N* numbers to be mapped to colors using the *cmap* and *norm* specified via kwargs (see below). Note that *c* should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped. *c* can be a 2-D array in which the rows are RGB or RGBA, however. For example: import numpy as np import matplotlib.pyplot as plt x = np.random.randn(100) y = np.random.randn(100) data = x**2 + y**2 plt.scatter(x, y, c=data) plt.show() Ryan -- Ryan May Graduate Research Assistant School of Meteorology University of Oklahoma |
From: Chad K. <cck...@gm...> - 2008-12-08 19:25:27
|
On Dec 8, 2008, at 12:55 PM, Ryan May wrote: > Chad Kidder wrote: >> I've got many series of data that I want to plot, and each has an >> additional scalar that is valid for the whole series. What I want >> to do is plot all these series on top of each other (plot can do >> this just fine), but with the additional scalar changing the >> color, efectively using color as the z-axis. I'm not seeing how >> to do that. If there was a function where I could give a color >> map a value and it would spit out the color, that would work, but >> I haven't seen it. Thanks for your help. > > Try using scatter instead of plot. Specifically, the 'c' keyword > argument: > > *c*: > a color. *c* can be a single color format string, or a > sequence of color specifications of length *N*, or a > sequence of *N* numbers to be mapped to colors using the > *cmap* and *norm* specified via kwargs (see below). Note > that *c* should not be a single numeric RGB or RGBA > sequence because that is indistinguishable from an array > of values to be colormapped. *c* can be a 2-D array in > which the rows are RGB or RGBA, however. > > For example: > > import numpy as np > import matplotlib.pyplot as plt > > x = np.random.randn(100) > y = np.random.randn(100) > data = x**2 + y**2 > plt.scatter(x, y, c=data) > plt.show() > > Ryan > Close, but not quite what I want. Maybe this will tell what I want to do better: ---------------------- import numpy as n import matplotlib.pyplot as p nlines = 100 z = n.random.rand(nlines) x = n.array(range(nlines)) t1, t2 = n.meshgrid(x,z) y = t1+t2-0.5 for ii in range(nlines): p.plot(x,y[ii,:],color = str(z[ii])) p.show() ------------------- Instead of getting a grayscale plot out, I'd like to use a colormap like jet() or winter(). Any ideas there? --Chad Kidder |
From: John H. <jd...@gm...> - 2008-12-08 19:47:17
|
On Mon, Dec 8, 2008 at 1:25 PM, Chad Kidder <cck...@gm...> wrote: ------------------- > Instead of getting a grayscale plot out, I'd like to use a colormap > like jet() or winter(). Any ideas there? How about? import matplotlib.cm as cm for ii in range(nlines): color = cm.jet(z[ii]) p.plot(x,y[ii,:],color=color) All of the mpl colormaps are callable, so if you pass in a [0..1] normalized value they will return an RGB tuple JDH |
From: Ryan M. <rm...@gm...> - 2008-12-08 20:00:26
|
Chad Kidder wrote: > On Dec 8, 2008, at 12:55 PM, Ryan May wrote: > >> Chad Kidder wrote: >>> I've got many series of data that I want to plot, and each has an >>> additional scalar that is valid for the whole series. What I want >>> to do is plot all these series on top of each other (plot can do >>> this just fine), but with the additional scalar changing the >>> color, efectively using color as the z-axis. I'm not seeing how >>> to do that. If there was a function where I could give a color >>> map a value and it would spit out the color, that would work, but >>> I haven't seen it. Thanks for your help. >> Try using scatter instead of plot. Specifically, the 'c' keyword >> argument: >> >> *c*: >> a color. *c* can be a single color format string, or a >> sequence of color specifications of length *N*, or a >> sequence of *N* numbers to be mapped to colors using the >> *cmap* and *norm* specified via kwargs (see below). Note >> that *c* should not be a single numeric RGB or RGBA >> sequence because that is indistinguishable from an array >> of values to be colormapped. *c* can be a 2-D array in >> which the rows are RGB or RGBA, however. Here's what you're looking for: import numpy as n import matplotlib.pyplot as p import matplotlib.colors as mcolors import matplotlib.cm as cm cmap = cm.get_cmap('winter') norm = mcolors.Normalize(0, 1) #Range of z nlines = 100 z = n.random.rand(nlines) x = n.arange(nlines) t1, t2 = n.meshgrid(x,z) y = t1+t2-0.5 #Uses normalize to map z values to range of 0 to 1. #Cmap maps these normalized values to colors colors = cmap(norm(z)) for ii in range(nlines): p.plot(x, y[ii], color=colors[ii]) p.show() Ryan -- Ryan May Graduate Research Assistant School of Meteorology University of Oklahoma |
From: Chad K. <cck...@gm...> - 2008-12-08 20:20:14
|
On Dec 8, 2008, at 2:00 PM, Ryan May wrote: > Chad Kidder wrote: >> On Dec 8, 2008, at 12:55 PM, Ryan May wrote: >>> Chad Kidder wrote: >>>> I've got many series of data that I want to plot, and each has >>>> an additional scalar that is valid for the whole series. What >>>> I want to do is plot all these series on top of each other >>>> (plot can do this just fine), but with the additional scalar >>>> changing the color, efectively using color as the z-axis. I'm >>>> not seeing how to do that. If there was a function where I >>>> could give a color map a value and it would spit out the color, >>>> that would work, but I haven't seen it. Thanks for your help. >>> Try using scatter instead of plot. Specifically, the 'c' keyword >>> argument: >>> >>> *c*: >>> a color. *c* can be a single color format string, or a >>> sequence of color specifications of length *N*, or a >>> sequence of *N* numbers to be mapped to colors using the >>> *cmap* and *norm* specified via kwargs (see below). Note >>> that *c* should not be a single numeric RGB or RGBA >>> sequence because that is indistinguishable from an array >>> of values to be colormapped. *c* can be a 2-D array in >>> which the rows are RGB or RGBA, however. > > Here's what you're looking for: > > import numpy as n > import matplotlib.pyplot as p > import matplotlib.colors as mcolors > import matplotlib.cm as cm > > cmap = cm.get_cmap('winter') > norm = mcolors.Normalize(0, 1) #Range of z > > nlines = 100 > z = n.random.rand(nlines) > x = n.arange(nlines) > t1, t2 = n.meshgrid(x,z) > y = t1+t2-0.5 > > #Uses normalize to map z values to range of 0 to 1. > #Cmap maps these normalized values to colors > colors = cmap(norm(z)) > for ii in range(nlines): > p.plot(x, y[ii], color=colors[ii]) > p.show() > > Ryan Thanks all. I had tried something close, but it didn't work. This works great. |
From: Eric F. <ef...@ha...> - 2008-12-08 19:57:28
|
Chad Kidder wrote: > On Dec 8, 2008, at 12:55 PM, Ryan May wrote: > >> Chad Kidder wrote: >>> I've got many series of data that I want to plot, and each has an >>> additional scalar that is valid for the whole series. What I want >>> to do is plot all these series on top of each other (plot can do >>> this just fine), but with the additional scalar changing the >>> color, efectively using color as the z-axis. I'm not seeing how >>> to do that. If there was a function where I could give a color >>> map a value and it would spit out the color, that would work, but >>> I haven't seen it. Thanks for your help. >> Try using scatter instead of plot. Specifically, the 'c' keyword >> argument: >> >> *c*: >> a color. *c* can be a single color format string, or a >> sequence of color specifications of length *N*, or a >> sequence of *N* numbers to be mapped to colors using the >> *cmap* and *norm* specified via kwargs (see below). Note >> that *c* should not be a single numeric RGB or RGBA >> sequence because that is indistinguishable from an array >> of values to be colormapped. *c* can be a 2-D array in >> which the rows are RGB or RGBA, however. >> >> For example: >> >> import numpy as np >> import matplotlib.pyplot as plt >> >> x = np.random.randn(100) >> y = np.random.randn(100) >> data = x**2 + y**2 >> plt.scatter(x, y, c=data) >> plt.show() >> >> Ryan >> > > Close, but not quite what I want. Maybe this will tell what I want to > do better: > > ---------------------- > import numpy as n > import matplotlib.pyplot as p > > nlines = 100 > z = n.random.rand(nlines) > x = n.array(range(nlines)) > t1, t2 = n.meshgrid(x,z) > y = t1+t2-0.5 > for ii in range(nlines): > p.plot(x,y[ii,:],color = str(z[ii])) > p.show() > ------------------- > Instead of getting a grayscale plot out, I'd like to use a colormap > like jet() or winter(). Any ideas there? In [6]:cmap = get_cmap('jet') In [7]:cmap(0.2) Out[7]:(0.0, 0.29999999999999999, 1.0, 1.0) In [8]:cmap(0.8) Out[8]:(1.0, 0.40740740740740755, 0.0, 1.0) The pyplot.get_cmap() function gets a colormap by name. Calling that colormap with a floating-point argument in the 0-1 range returns the mapped color as an rgba tuple, which will be accepted by the color kwarg of plot. You can use pyplot.normalize to map your z range to the 0-1 range: In [2]:norm = normalize(vmin=2, vmax=4) In [3]:norm(3) Out[3]:0.5 Alternatively, you can use a LineCollection. See the examples/pylab_examples/line_collection2.py script. Eric > > > > > > --Chad Kidder > > ------------------------------------------------------------------------------ > SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada. > The future of the web can't happen without you. Join us at MIX09 to help > pave the way to the Next Web now. Learn more and register at > http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users |