From: Xavier G. <xav...@gm...> - 2011-04-23 00:33:29
|
Hi, Imagine you have this code: import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt delta = 0.25 x = y = np.arange(-3.0, 3.0, delta) X, Y = np.meshgrid(x, y) Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = Z2-Z1 # difference of Gaussians plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3]) Then you want to change the color of a few pixels to red. You have a list of coordinates (i,j) and each pixel in this list should now be red. I could play with masked arrays like in: http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html but I would prefer a simple "display this pixel (i,j) in red whatever his value is" function. Xavier |
From: Paul I. <piv...@gm...> - 2011-04-23 01:19:17
|
Hi Xavier, Xavier Gnata, on 2011-04-23 02:33, wrote: > Imagine you have this code: > > import numpy as np > import matplotlib.cm as cm > import matplotlib.mlab as mlab > import matplotlib.pyplot as plt > > delta = 0.25 > x = y = np.arange(-3.0, 3.0, delta) > X, Y = np.meshgrid(x, y) > Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) > Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) > Z = Z2-Z1 # difference of Gaussians > > plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3]) > Then you want to change the color of a few pixels to red. > You have a list of coordinates (i,j) and each pixel in this list should > now be red. > > I could play with masked arrays like in: > http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html > but I would prefer a simple "display this pixel (i,j) in red whatever > his value is" function. Since you're using a gray color map for that image, you won't be able to set a particular pixel to red. You'll have to either overlay a new image that would be masked out everywhere except for the pixels you want to change, as you mentioned, or create new image patches at the corresponding positions like this: idx2im = lambda i,j: (x[i],x[j+1],y[i],y[j+1] ) plt.imshow([[.9]], extent=idx2im(12,12), cmap =cm.jet, origin='lower',vmin=0,vmax=1) or something like this: plt.Rectangle((x[10],y[10]),width=delta,height=delta,color='red') ax = plt.gca() ax.add_artist(r) plt.draw() best, -- Paul Ivanov 314 address only used for lists, off-list direct email at: http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7 |
From: Xavier G. <xav...@gm...> - 2011-04-25 21:25:36
|
On 04/23/2011 03:19 AM, Paul Ivanov wrote: > Hi Xavier, > > Xavier Gnata, on 2011-04-23 02:33, wrote: >> Imagine you have this code: >> >> import numpy as np >> import matplotlib.cm as cm >> import matplotlib.mlab as mlab >> import matplotlib.pyplot as plt >> >> delta = 0.25 >> x = y = np.arange(-3.0, 3.0, delta) >> X, Y = np.meshgrid(x, y) >> Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) >> Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) >> Z = Z2-Z1 # difference of Gaussians >> >> plt.imshow(Z, interpolation='nearest', cmap=cm.gray, origin='lower', extent=[-3,3,-3,3]) >> Then you want to change the color of a few pixels to red. >> You have a list of coordinates (i,j) and each pixel in this list should >> now be red. >> >> I could play with masked arrays like in: >> http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html >> but I would prefer a simple "display this pixel (i,j) in red whatever >> his value is" function. > Since you're using a gray color map for that image, you won't be > able to set a particular pixel to red. You'll have to either > overlay a new image that would be masked out everywhere except > for the pixels you want to change, as you mentioned, or create > new image patches at the corresponding positions like this: > > idx2im = lambda i,j: (x[i],x[j+1],y[i],y[j+1] ) > plt.imshow([[.9]], extent=idx2im(12,12), cmap =cm.jet, origin='lower',vmin=0,vmax=1) > > or something like this: > > plt.Rectangle((x[10],y[10]),width=delta,height=delta,color='red') > ax = plt.gca() > ax.add_artist(r) > plt.draw() > > > best, Thanks. The code using "Rectangle" works very well. Using masks is more efficient but overshoot if I want to change only a few pixels. Xavier |