Sandy_Bio_Perl has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks. I am using Color::Spectrum to generate colour codes. (Which is a very cool module, thanks). I have a hash of peptides, and apply colour codes to each peptide which is sorted by value. However, Color::Spectrum seems to apply colour changes evenly, and I cannot see an option to have the changes in colour vary according the value of the keys. Moreover, as the colours change 'smoothly' from top to bottom, the peptides with the same value e.g. the last four that have the value 1 are not all the same colour

Does anyone have module or method that (a) allows colour to change with respect to values and (b) provide a consistency so that keys of the same value are the same colour? Many thanks.

#!/usr/bin/perl use strict; use warnings; use Color::Spectrum qw (generate); $uniqueBinders = scalar (keys %bindersHash); my @colours = generate($uniqueBinders, '#FF0000', '#0060BF');

--Data--

This hash %bindersHash HISCLTFGR = 16 MQLFHLCLI = 8 WGMDIDPYK = 4 YVNVNMGLK = 3 AYRPPNAPI = 2 ELMNLATWV = 2 EYLVSFGVW = 1 FFPSIRDLL = 1 FLPSDFFPS = 1 IISCSCPTV = 1

Replies are listed 'Best First'.
Re: Generating colour codes according to value
by choroba (Cardinal) on Aug 17, 2016 at 18:08 UTC
    Group the peptides by frequencies, generate colours for the groups, not for individual peptides.

    #!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use Color::Spectrum qw{ generate }; my %binders = ( HISCLTFGR => 16, MQLFHLCLI => 8, WGMDIDPYK => 4, YVNVNMGLK => 3, AYRPPNAPI => 2, ELMNLATWV => 2, EYLVSFGVW => 1, FFPSIRDLL => 1, FLPSDFFPS => 1, IISCSCPTV => 1, ); my %freq; push @{ $freq{ $binders{$_} } }, $_ for keys %binders; my @colours = generate(scalar keys %freq, '#FF0000', '#0060BF'); my %colour; @colour{ @{ $freq{$_} } } = (pop @colours) x @{ $freq{$_} } for sort { $a <=> $b } keys %freq; say "$_ : $colour{$_}" for keys %colour;

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      Thank you. It works well. Much appreciated

Re: Generating colour codes according to value
by Anonymous Monk on Aug 17, 2016 at 17:17 UTC
    Given that you seem to want to have one color per hash value, why do you use the number of hash keys as the number of colors to generate?

      I want to have one colour per unique peptide, from red to green, with red associated with the most frequently observed peptides. $uniqueBinders just lets me know how many unique peptides there are in the list, so each unique binder will be the same colour. So, all 16 HISCLTFGR peptides will be red. However, peptides EYLVSFGVW and IISCSCPTV which both only appear once are not the same colour, because Color::Spectrum continues to alter the colour codes as the values in @colours change with each element from 'hot' to 'cold'. I would like peptides of a similar frequency to be the same colour

        "I want to have one colour per unique peptide, [...] I would like peptides of a similar frequency to be the same colour"

        Isn't that contradictory?