Re: [Matplotlib-users] visualizing colormaps for complex functions
Hi Gary, Thanks for responding. It looks like the mpmath does what I'm looking for. Your code looks interesting, as it lowers the number of dependencies needed. I hope I'll find the time to really incorporate this features to something that can come as part to matplotlib. Regarding the plots I've pointed to, I didn't make them, so I don't know how the author did it (expect that he used Mathematica). Thanks, Guy On Sat, Apr 3, 2010 at 4:29 AM, Gary Ruben wrote: > Hi Guy, > > I am also interested in the answer to this. The cplot function in the > mpmath module does exactly this using matplotlib, but very inefficiently, as > it computes the colour of each pixel in the image in hls colour-space and > generates the corresponding rgb value directly. I suspect this is how it has > to be done, as colormaps in matplotlib are 1D sequences and the black-white > (lightness) value is really another dimension. However mpmath's method can > be improved by doing the mapping using array operations instead of computing > it for each pixel. > > I've attached a function I wrote to reproduce the Sage cplot command in my > own work. It's a bit old and can be improved. It takes the Arg and Abs of a > complex array as the first two arguments - you can easily change this to > compute these inside the function if you prefer. The line > np.vectorize(hls_to_rgb) can be replaced - recent versions of matplotlib > have a vectorized function called hsv_to_rgb() inside colors.py - so you > replace the return line with the commented-out version if you first import > hsv_to_rgb from colors. > > I hope this helps. > > I'm also curious: the plots you point to also show plots of the function > "extrema", which are the phase singularities - does mathematica have a > function that gives you these, or did you write your own function to find > them? > > regards, > Gary > > > Guy Rutenberg wrote: > >> Hi, >> >> Is there a way to generate colormaps for complex-valued functions using >> matplotlib? The type of plots I'm looking for are like the plots in: >> http://commons.wikimedia.org/wiki/User:Jan_Homann/Mathematics >> >> Thanks in advance, >> >> Guy >> > > def cplot_like(ph, intens=None, int_exponent=1.0, s=1.0, l_bias=1.0, > drape=0, is_like_mpmath=False): >''' >Implements the mpmath cplot-like default_color_function >The combined image is generated in hls colourspace then transformed to > rgb >*phase* >A filename or 2D n x m array containing phase data in the range > -pi->pi >*intens* >If None, set to 1.0 >A filename or 2D n x m array containing intensity or amplitude data > in the range 0->max >*int_exponent* >Default 1.0 applies the intens mask directly to the hls > lightness-channel >0.6 works well when drape==0 >*s* >saturation. Defaults to 1.0. mpmath uses 0.8. >*l_bias* >biases the mean lightness value away from 0.5. mpmath uses 1.0. >Examples are: l_bias=2 -> mean=0.33 (ie darker), l_bias=0.5 -> > mean=0.66 (lighter) >*drape* >If >1, drapes a structured maximum filter of size drape x drape over > the intensity data >*is_like_mpmath* >If True, sets int_exponent = 0.3, s = 0.8 >''' >from colorsys import hls_to_rgb > >if type(ph) is str: >cph = plt.imread(ph)/256.*2*pi-pi # -pi->pi >if len(cph.shape) == 3: cph = cph[...,0] # if ph is RGB or > RGBA, extract the R-plane >else: >cph = ph.copy() > >if intens is None: >cintens = np.ones_like(cph) >elif type(intens) is str: >cintens = plt.imread(intens)/255. # 0->1 >if len(cintens.shape) == 3: cintens = cintens[...,0] # if intens > is RGB or RGBA, extract the R-plane >else: >cintens = intens.copy() >cintens /= cintens.max() # autoscale intensity > data to 0->1 > >if drape > 1: ># envelope the intensity >cintens = maximum_filter(cintens, size=drape) > >h = ((cph + pi) / (2*pi)) % 1.0 > >if is_like_mpmath: ># apply mpmath values >int_exponent = 0.3 >s = 0.8 > >l = 1.0 - l_bias/(l_bias+cintens**int_exponent) >v_hls_to_rgb = np.vectorize(hls_to_rgb) > >#~ return hsv_to_rgb(dstack((h,np.ones_like(h),l))) >return dstack(v_hls_to_rgb(h,l,s)) > -- Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] visualizing colormaps for complex functions
Hi Guy, I am also interested in the answer to this. The cplot function in the mpmath module does exactly this using matplotlib, but very inefficiently, as it computes the colour of each pixel in the image in hls colour-space and generates the corresponding rgb value directly. I suspect this is how it has to be done, as colormaps in matplotlib are 1D sequences and the black-white (lightness) value is really another dimension. However mpmath's method can be improved by doing the mapping using array operations instead of computing it for each pixel. I've attached a function I wrote to reproduce the Sage cplot command in my own work. It's a bit old and can be improved. It takes the Arg and Abs of a complex array as the first two arguments - you can easily change this to compute these inside the function if you prefer. The line np.vectorize(hls_to_rgb) can be replaced - recent versions of matplotlib have a vectorized function called hsv_to_rgb() inside colors.py - so you replace the return line with the commented-out version if you first import hsv_to_rgb from colors. I hope this helps. I'm also curious: the plots you point to also show plots of the function "extrema", which are the phase singularities - does mathematica have a function that gives you these, or did you write your own function to find them? regards, Gary Guy Rutenberg wrote: Hi, Is there a way to generate colormaps for complex-valued functions using matplotlib? The type of plots I'm looking for are like the plots in: http://commons.wikimedia.org/wiki/User:Jan_Homann/Mathematics Thanks in advance, Guy def cplot_like(ph, intens=None, int_exponent=1.0, s=1.0, l_bias=1.0, drape=0, is_like_mpmath=False): ''' Implements the mpmath cplot-like default_color_function The combined image is generated in hls colourspace then transformed to rgb *phase* A filename or 2D n x m array containing phase data in the range -pi->pi *intens* If None, set to 1.0 A filename or 2D n x m array containing intensity or amplitude data in the range 0->max *int_exponent* Default 1.0 applies the intens mask directly to the hls lightness-channel 0.6 works well when drape==0 *s* saturation. Defaults to 1.0. mpmath uses 0.8. *l_bias* biases the mean lightness value away from 0.5. mpmath uses 1.0. Examples are: l_bias=2 -> mean=0.33 (ie darker), l_bias=0.5 -> mean=0.66 (lighter) *drape* If >1, drapes a structured maximum filter of size drape x drape over the intensity data *is_like_mpmath* If True, sets int_exponent = 0.3, s = 0.8 ''' from colorsys import hls_to_rgb if type(ph) is str: cph = plt.imread(ph)/256.*2*pi-pi # -pi->pi if len(cph.shape) == 3: cph = cph[...,0] # if ph is RGB or RGBA, extract the R-plane else: cph = ph.copy() if intens is None: cintens = np.ones_like(cph) elif type(intens) is str: cintens = plt.imread(intens)/255. # 0->1 if len(cintens.shape) == 3: cintens = cintens[...,0] # if intens is RGB or RGBA, extract the R-plane else: cintens = intens.copy() cintens /= cintens.max() # autoscale intensity data to 0->1 if drape > 1: # envelope the intensity cintens = maximum_filter(cintens, size=drape) h = ((cph + pi) / (2*pi)) % 1.0 if is_like_mpmath: # apply mpmath values int_exponent = 0.3 s = 0.8 l = 1.0 - l_bias/(l_bias+cintens**int_exponent) v_hls_to_rgb = np.vectorize(hls_to_rgb) #~ return hsv_to_rgb(dstack((h,np.ones_like(h),l))) return dstack(v_hls_to_rgb(h,l,s))-- Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
[Matplotlib-users] visualizing colormaps for complex functions
Hi, Is there a way to generate colormaps for complex-valued functions using matplotlib? The type of plots I'm looking for are like the plots in: http://commons.wikimedia.org/wiki/User:Jan_Homann/Mathematics Thanks in advance, Guy http://www.guyrutenberg.com -- Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users