Undefined color model and inconsistencies between backends

Hi,

While playing around for an afternoon with colors in matplotlib, I came
across some inconsistencies. I was trying to define colors in sRGB (my
understanding is that sRGB as a standardized color space is
device-independent). Giving RGB values to matplotlib, I checked the
output with a color picker -- Color Maker from the Mac App Store, set
to the sRGB mode, but the built-in DigitalColor Meter gives the same
result. It turns out that the colors I see in the output are not what I
specified. This makes playing around with colors, a bit difficult:
http://nbviewer.ipython.org/gist/goerz/9aab94f5322d5a457625
As far as I can tell, Matplotlib does not specify in
which color model in interprets RGB values (this should ideally be
stated in the documentation). Also, the output in different backends
(IPython notebook, and interactive GUI) gave different results. As a
minimal example, consider the following:

    import pylab
    import numpy as np
    import matplotlib
    #%matplotlib inline
    # draw line with sRGB color 228, 26, 28
    pylab.plot(np.linspace(0,10, 10), np.linspace(0,20,10), linewidth=10,
               color=(0.894, 0.102, 0.110))
    pylab.show()
    # Colorpicker shows 210, 46, 13 in GUI view
    # Colorpicker shows 229, 39, 27 in iPython Notebook

In the IPython notebook, direct PIL graphics do seem to give the right
colors cf. In [5] in the linked IPython notebook (even though PIL also
does not explicitly specify its color model). Just matplotlib seems
off. Of course, I'm doing some slightly crazy stuff in the Notebook,
displaying every matplotlib output through PIL, but I cecked that
`%matplotlib inline` actually produces the same colors.

Should I file this on github as a bug report?

Best,
Michael

P.S.: please CC for direct replies

Hi,

While playing around for an afternoon with colors in matplotlib, I came
across some inconsistencies. I was trying to define colors in sRGB (my
understanding is that sRGB as a standardized color space is
device-independent). Giving RGB values to matplotlib, I checked the
output with a color picker -- Color Maker from the Mac App Store, set
to the sRGB mode, but the built-in DigitalColor Meter gives the same
result. It turns out that the colors I see in the output are not what I
specified. This makes playing around with colors, a bit difficult:
http://nbviewer.ipython.org/gist/goerz/9aab94f5322d5a457625
As far as I can tell, Matplotlib does not specify in
which color model in interprets RGB values (this should ideally be
stated in the documentation). Also, the output in different backends
(IPython notebook, and interactive GUI) gave different results. As a
minimal example, consider the following:

Matplotlib doesn't interpret RGB values; that is left to the display device. Matplotlib simply writes the RGB values in a file, unmodified, or sends them via a GUI backend to a display, also unmodified *by mpl*. What you put in, is what it puts out.

Thanks for pointing out the DigitalColor Meter--I hadn't noticed it.

What I see with your example is that the MacOSX backend *display* is interpreting RGB as sRGB, and the qt4agg backend *display* is interpreting RGB as native values (based on matching with DigitalColor Meter).

I haven't tried this with inline plots in the notebook, but mpl is merely feeding RGB values to the browser, just as would occur when displaying a png, and it is up to the browser to decide how to convert them into pixel intensity.

I don't see that there is a bug here.

Eric

···

On 2014/05/16 4:41 PM, Michael Goerz wrote:

     import pylab
     import numpy as np
     import matplotlib
     #%matplotlib inline
     # draw line with sRGB color 228, 26, 28
     pylab.plot(np.linspace(0,10, 10), np.linspace(0,20,10), linewidth=10,
                color=(0.894, 0.102, 0.110))
     pylab.show()
     # Colorpicker shows 210, 46, 13 in GUI view
     # Colorpicker shows 229, 39, 27 in iPython Notebook

In the IPython notebook, direct PIL graphics do seem to give the right
colors cf. In [5] in the linked IPython notebook (even though PIL also
does not explicitly specify its color model). Just matplotlib seems
off. Of course, I'm doing some slightly crazy stuff in the Notebook,
displaying every matplotlib output through PIL, but I cecked that
`%matplotlib inline` actually produces the same colors.

Should I file this on github as a bug report?

Best,
Michael

P.S.: please CC for direct replies

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

>While playing around for an afternoon with colors in matplotlib, I came
>across some inconsistencies. I was trying to define colors in sRGB (my
>understanding is that sRGB as a standardized color space is
>device-independent). Giving RGB values to matplotlib, I checked the
>output with a color picker -- Color Maker from the Mac App Store, set
>to the sRGB mode, but the built-in DigitalColor Meter gives the same
>result. It turns out that the colors I see in the output are not what I
>specified. This makes playing around with colors, a bit difficult:
>http://nbviewer.ipython.org/gist/goerz/9aab94f5322d5a457625
>As far as I can tell, Matplotlib does not specify in
>which color model in interprets RGB values (this should ideally be
>stated in the documentation). Also, the output in different backends
>(IPython notebook, and interactive GUI) gave different results. As a
>minimal example, consider the following:
Matplotlib doesn't interpret RGB values; that is left to the display
device. Matplotlib simply writes the RGB values in a file,
unmodified, or sends them via a GUI backend to a display, also
unmodified *by mpl*. What you put in, is what it puts out.

Thanks for pointing out the DigitalColor Meter--I hadn't noticed it.

What I see with your example is that the MacOSX backend *display* is
interpreting RGB as sRGB, and the qt4agg backend *display* is
interpreting RGB as native values (based on matching with
DigitalColor Meter).

I haven't tried this with inline plots in the notebook, but mpl is
merely feeding RGB values to the browser, just as would occur when
displaying a png, and it is up to the browser to decide how to
convert them into pixel intensity.

I don't see that there is a bug here.

Fair enough, so that would imply that there is a difference between the
png streams produced by matplotlib and the "direct" PIL image. I might
be seeing the problems discussed here: https://hsivonen.fi/png-gamma/
It might be that the matplotlib png stream is "untagged", whereas the
PIL image is tagged properly as sRGB. I'd have to decode the base64
data from the notebook to check this.

Beyond that it seems quite tricky to understands how in a given
application, or matplotlib backend in this case, a given RGB color
input yields a specific output on my screen, and how to make this
consistent (consistency obviously being more important than
accurateness with respect to some "real" color model). Maybe this just
goes to show what I realized these last couple of days, that colors are
a huge can of worms.

···

On Fri, 16 May 2014, Eric Firing wrote:

On 2014/05/16 4:41 PM, Michael Goerz wrote:

> import pylab
> import numpy as np
> import matplotlib
> #%matplotlib inline
> # draw line with sRGB color 228, 26, 28
> pylab.plot(np.linspace(0,10, 10), np.linspace(0,20,10), linewidth=10,
> color=(0.894, 0.102, 0.110))
> pylab.show()
> # Colorpicker shows 210, 46, 13 in GUI view
> # Colorpicker shows 229, 39, 27 in iPython Notebook
>
>In the IPython notebook, direct PIL graphics do seem to give the right
>colors cf. In [5] in the linked IPython notebook (even though PIL also
>does not explicitly specify its color model). Just matplotlib seems
>off. Of course, I'm doing some slightly crazy stuff in the Notebook,
>displaying every matplotlib output through PIL, but I cecked that
>`%matplotlib inline` actually produces the same colors.
>
>Should I file this on github as a bug report?
>
>Best,
>Michael
>
>P.S.: please CC for direct replies

FWIW I can't tell any difference between colors in different backends.
I tried agg, cairo, several interactive backends and ipython inline in
Ubuntu.

Goyo

2014-05-17 6:14 GMT+02:00 Michael Goerz <goerz@...4531...>:

···

On Fri, 16 May 2014, Eric Firing wrote:

On 2014/05/16 4:41 PM, Michael Goerz wrote:
>While playing around for an afternoon with colors in matplotlib, I came
>across some inconsistencies. I was trying to define colors in sRGB (my
>understanding is that sRGB as a standardized color space is
>device-independent). Giving RGB values to matplotlib, I checked the
>output with a color picker -- Color Maker from the Mac App Store, set
>to the sRGB mode, but the built-in DigitalColor Meter gives the same
>result. It turns out that the colors I see in the output are not what I
>specified. This makes playing around with colors, a bit difficult:
>http://nbviewer.ipython.org/gist/goerz/9aab94f5322d5a457625
>As far as I can tell, Matplotlib does not specify in
>which color model in interprets RGB values (this should ideally be
>stated in the documentation). Also, the output in different backends
>(IPython notebook, and interactive GUI) gave different results. As a
>minimal example, consider the following:
Matplotlib doesn't interpret RGB values; that is left to the display
device. Matplotlib simply writes the RGB values in a file,
unmodified, or sends them via a GUI backend to a display, also
unmodified *by mpl*. What you put in, is what it puts out.

Thanks for pointing out the DigitalColor Meter--I hadn't noticed it.

What I see with your example is that the MacOSX backend *display* is
interpreting RGB as sRGB, and the qt4agg backend *display* is
interpreting RGB as native values (based on matching with
DigitalColor Meter).

I haven't tried this with inline plots in the notebook, but mpl is
merely feeding RGB values to the browser, just as would occur when
displaying a png, and it is up to the browser to decide how to
convert them into pixel intensity.

I don't see that there is a bug here.

Fair enough, so that would imply that there is a difference between the
png streams produced by matplotlib and the "direct" PIL image. I might
be seeing the problems discussed here: https://hsivonen.fi/png-gamma/
It might be that the matplotlib png stream is "untagged", whereas the
PIL image is tagged properly as sRGB. I'd have to decode the base64
data from the notebook to check this.

Beyond that it seems quite tricky to understands how in a given
application, or matplotlib backend in this case, a given RGB color
input yields a specific output on my screen, and how to make this
consistent (consistency obviously being more important than
accurateness with respect to some "real" color model). Maybe this just
goes to show what I realized these last couple of days, that colors are
a huge can of worms.

> import pylab
> import numpy as np
> import matplotlib
> #%matplotlib inline
> # draw line with sRGB color 228, 26, 28
> pylab.plot(np.linspace(0,10, 10), np.linspace(0,20,10), linewidth=10,
> color=(0.894, 0.102, 0.110))
> pylab.show()
> # Colorpicker shows 210, 46, 13 in GUI view
> # Colorpicker shows 229, 39, 27 in iPython Notebook
>
>In the IPython notebook, direct PIL graphics do seem to give the right
>colors cf. In [5] in the linked IPython notebook (even though PIL also
>does not explicitly specify its color model). Just matplotlib seems
>off. Of course, I'm doing some slightly crazy stuff in the Notebook,
>displaying every matplotlib output through PIL, but I cecked that
>`%matplotlib inline` actually produces the same colors.
>
>Should I file this on github as a bug report?
>
>Best,
>Michael
>
>P.S.: please CC for direct replies

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users