Issue 1:
Colors

While I was in the process of writing some colormap manipulation scripts, I went into the MPL code on 'colors' to find out how exactly it handles the conversion between the normalized RGBA tuples that MPL uses, and the actual 8-bit RGBA tuples that are used for colors in general.

Looking at the colors module, I noticed that the conversion from normalized to 8-bit tuples is inconsistent in several places.

For example, when one requests some colors from a Colormap object in their 8-bit forms by using bytes=True, the normalized values are multiplied by 255 and then rounded down, as shown in

matplotlib/lib/matplotlib/colors.py

Lines 575 to 583
in
8bddf0a

if bytes:

lut = (self._lut * 255).astype(np.uint8)

else:

lut = self._lut.copy() # Don't let alpha modify original _lut.

if alpha is not None:

alpha = np.clip(alpha, 0, 1)

if bytes:

alpha = int(alpha * 255)

However, if I were to convert a normalized RGBA-tuple into an RGBA-hex (which should be the same as an 8-bit RGBA-tuple) using the to_hex function, then the normalized values are multiplied by 255 and rounded to nearest, as shown in

matplotlib/lib/matplotlib/colors.py

Lines 333 to 343
in
8bddf0a

def to_hex(c, keep_alpha=False):

"""

Convert *c* to a hex color.

Uses the ``#rrggbb`` format if *keep_alpha* is False (the default),

``#rrggbbaa`` otherwise.

"""

c = to_rgba(c)

if not keep_alpha:

c = c[:3]

return "#" + "".join(format(int(round(val * 255)), "02x") for val in c)

If I go over the several other modules that deal with this conversion, I see that rounding down is much more common than rounding to nearest, even though I would have expected the latter (picking the closest corresponding color makes much more sense than picking the closest darker color).

The latter would also ensure that doing 8-bit -> normalized -> 8-bit always gives the same values back, regardless of potential floating point errors.

Is there a reason why there are two different conversions for the same thing, and why the (in my opinion) worse conversion is much more common?

Colormaps

I also found a similar peculiarity for picking colors from a Colormap object, shown in

matplotlib/lib/matplotlib/colors.py

Lines 558 to 568
in
8bddf0a

if xa.dtype.kind == "f":

with np.errstate(invalid="ignore"):

xa *= self.N

# Negative values are out of range, but astype(int) would

# truncate them towards zero.

xa[xa < 0] = -1

# xa == 1 (== N after multiplication) is not out of range.

xa[xa == self.N] = self.N - 1

# Avoid converting large positive values to negative integers.

np.clip(xa, -1, self.N, out=xa)

xa = xa.astype(int)

I would have expected here that the nearest color in the colormap is selected when a fraction is given, i.e., xa is calculated as

xa = np.rint(xa*(self.N-1))

instead of

xa *= self.N

Issue 2:
Bug report

Bug summary

imsave saves some pixels wrong to output image, or possibly it is always mapping certain values of the input array to the wrong output values. Colormap values appear correct, but actual data saved does not match colormap.

Code for reproduction

#!/usr/bin/env python3
"""Test imsave using gray colormap
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import PIL

def print_arrays_cols(*args):
for i in range(len(args[1])):
row_vals = []
for (j, arg) in enumerate(args):
print("%.3f"%(arg[i]), end="")
if j < len(args)-1:
print("\t\t", end="")
row_vals.append(arg[i])
if all([x==row_vals[0] for x in row_vals]):
print("")
else:
print(" ****")

def main():
plt.gray()
test_array = np.vstack((np.arange(0,256), np.arange(0,256)))
test_array_cm_gray = matplotlib.cm.gray(test_array)
# scale max to 255
test_array_cm_gray = test_array_cm_gray * 255
# save test_array to png
plt.imsave('testme.png', test_array, format='png')
# save test_array to tiff
plt.imsave('testme.tif', test_array, format='tiff')

# imread from png
test_png_load = plt.imread('testme.png')
# scale max to 255
test_png_load = test_png_load * 255
# imread from tiff
test_tiff_load = plt.imread('testme.tif')
# pil open from png
pil_png_image = PIL.Image.open('testme.png')
test_png_pil_load = list(pil_png_image.getdata())
# just get first row, and R of RGBA
test_png_pil_load = [x[0] for x in test_png_pil_load[0:256]]
# pil open from tiff
pil_tiff_image = PIL.Image.open('testme.tif')
test_tiff_pil_load = list(pil_tiff_image.getdata())
# just get first row
test_tiff_pil_load = test_png_pil_load[0:256]

# print orig, colormap, and 2 methods of loading png image data
print("test_array\tcm.gray()\tpng_pil_load\tpng_imread_load")
print("----------\t---------\t------------\t---------------")
print_arrays_cols(
test_array[0,:].flatten(),
test_array_cm_gray[0,:,0].flatten(),
test_png_pil_load,
test_png_load[0,:,0].flatten(),
)

# print orig, colormap, and 2 methods of loading tiff image data
print("")
print("test_array\tcm.gray()\ttiff_pil_load\ttiff_imread_load")
print("----------\t---------\t-------------\t----------------")
print_arrays_cols(
test_array[0,:].flatten(),
test_array_cm_gray[0,:,0].flatten(),
test_tiff_pil_load,
test_tiff_load[0,:,0].flatten(),
)

if __name__ == '__main__':
main()

Actual outcome

test_array	cm.gray()	png_pil_load	png_imread_load
----------	---------	------------	---------------
0.000	0.000	0.000	0.000
1.000	1.000	1.000	1.000
2.000	2.000	2.000	2.000
3.000	3.000	3.000	3.000
4.000	4.000	4.000	4.000
5.000	5.000	5.000	5.000
6.000	6.000	6.000	6.000
7.000	7.000	7.000	7.000
8.000	8.000	8.000	8.000
9.000	9.000	9.000	9.000
10.000	10.000	10.000	10.000
11.000	11.000	11.000	11.000
12.000	12.000	12.000	12.000
13.000	13.000	13.000	13.000
14.000	14.000	14.000	14.000
15.000	15.000	15.000	15.000
16.000	16.000	16.000	16.000
17.000	17.000	17.000	17.000
18.000	18.000	18.000	18.000
19.000	19.000	19.000	19.000
20.000	20.000	20.000	20.000
21.000	21.000	21.000	21.000
22.000	22.000	22.000	22.000
23.000	23.000	23.000	23.000
24.000	24.000	24.000	24.000
25.000	25.000	25.000	25.000
26.000	26.000	26.000	26.000
27.000	27.000	27.000	27.000
28.000	28.000	28.000	28.000
29.000	29.000	29.000	29.000
30.000	30.000	30.000	30.000
31.000	31.000	31.000	31.000
32.000	32.000	32.000	32.000
33.000	33.000	32.000	32.000 ****
34.000	34.000	34.000	34.000
35.000	35.000	35.000	35.000
36.000	36.000	36.000	36.000
37.000	37.000	36.000	36.000 ****
38.000	38.000	38.000	38.000
39.000	39.000	39.000	39.000
40.000	40.000	40.000	40.000
41.000	41.000	40.000	40.000 ****
42.000	42.000	42.000	42.000
43.000	43.000	43.000	43.000
44.000	44.000	44.000	44.000
45.000	45.000	44.000	44.000 ****
46.000	46.000	46.000	46.000
47.000	47.000	47.000	47.000
48.000	48.000	48.000	48.000
49.000	49.000	48.000	48.000 ****
50.000	50.000	50.000	50.000
51.000	51.000	51.000	51.000
52.000	52.000	52.000	52.000
53.000	53.000	52.000	52.000 ****
54.000	54.000	54.000	54.000
55.000	55.000	55.000	55.000
56.000	56.000	56.000	56.000
57.000	57.000	56.000	56.000 ****
58.000	58.000	58.000	58.000
59.000	59.000	59.000	59.000
60.000	60.000	60.000	60.000
61.000	61.000	60.000	60.000 ****
62.000	62.000	62.000	62.000
63.000	63.000	63.000	63.000
64.000	64.000	64.000	64.000
65.000	65.000	65.000	65.000
66.000	66.000	65.000	65.000 ****
67.000	67.000	67.000	67.000
68.000	68.000	68.000	68.000
69.000	69.000	69.000	69.000
70.000	70.000	70.000	70.000
71.000	71.000	71.000	71.000
72.000	72.000	72.000	72.000
73.000	73.000	73.000	73.000
74.000	74.000	73.000	73.000 ****
75.000	75.000	75.000	75.000
76.000	76.000	76.000	76.000
77.000	77.000	77.000	77.000
78.000	78.000	78.000	78.000
79.000	79.000	79.000	79.000
80.000	80.000	80.000	80.000
81.000	81.000	81.000	81.000
82.000	82.000	81.000	81.000 ****
83.000	83.000	83.000	83.000
84.000	84.000	84.000	84.000
85.000	85.000	85.000	85.000
86.000	86.000	86.000	86.000
87.000	87.000	87.000	87.000
88.000	88.000	88.000	88.000
89.000	89.000	89.000	89.000
90.000	90.000	89.000	89.000 ****
91.000	91.000	91.000	91.000
92.000	92.000	92.000	92.000
93.000	93.000	93.000	93.000
94.000	94.000	94.000	94.000
95.000	95.000	95.000	95.000
96.000	96.000	96.000	96.000
97.000	97.000	97.000	97.000
98.000	98.000	97.000	97.000 ****
99.000	99.000	99.000	99.000
100.000	100.000	100.000	100.000
101.000	101.000	101.000	101.000
102.000	102.000	102.000	102.000
103.000	103.000	103.000	103.000
104.000	104.000	104.000	104.000
105.000	105.000	105.000	105.000
106.000	106.000	105.000	105.000 ****
107.000	107.000	107.000	107.000
108.000	108.000	108.000	108.000
109.000	109.000	109.000	109.000
110.000	110.000	110.000	110.000
111.000	111.000	111.000	111.000
112.000	112.000	112.000	112.000
113.000	113.000	113.000	113.000
114.000	114.000	113.000	113.000 ****
115.000	115.000	115.000	115.000
116.000	116.000	116.000	116.000
117.000	117.000	117.000	117.000
118.000	118.000	118.000	118.000
119.000	119.000	119.000	119.000
120.000	120.000	120.000	120.000
121.000	121.000	121.000	121.000
122.000	122.000	121.000	121.000 ****
123.000	123.000	123.000	123.000
124.000	124.000	124.000	124.000
125.000	125.000	125.000	125.000
126.000	126.000	126.000	126.000
127.000	127.000	127.000	127.000
128.000	128.000	128.000	128.000
129.000	129.000	129.000	129.000
130.000	130.000	130.000	130.000
131.000	131.000	131.000	131.000
132.000	132.000	131.000	131.000 ****
133.000	133.000	133.000	133.000
134.000	134.000	134.000	134.000
135.000	135.000	135.000	135.000
136.000	136.000	136.000	136.000
137.000	137.000	137.000	137.000
138.000	138.000	138.000	138.000
139.000	139.000	139.000	139.000
140.000	140.000	140.000	140.000
141.000	141.000	141.000	141.000
142.000	142.000	142.000	142.000
143.000	143.000	143.000	143.000
144.000	144.000	144.000	144.000
145.000	145.000	145.000	145.000
146.000	146.000	146.000	146.000
147.000	147.000	147.000	147.000
148.000	148.000	147.000	147.000 ****
149.000	149.000	149.000	149.000
150.000	150.000	150.000	150.000
151.000	151.000	151.000	151.000
152.000	152.000	152.000	152.000
153.000	153.000	153.000	153.000
154.000	154.000	154.000	154.000
155.000	155.000	155.000	155.000
156.000	156.000	156.000	156.000
157.000	157.000	157.000	157.000
158.000	158.000	158.000	158.000
159.000	159.000	159.000	159.000
160.000	160.000	160.000	160.000
161.000	161.000	161.000	161.000
162.000	162.000	162.000	162.000
163.000	163.000	163.000	163.000
164.000	164.000	163.000	163.000 ****
165.000	165.000	165.000	165.000
166.000	166.000	166.000	166.000
167.000	167.000	167.000	167.000
168.000	168.000	168.000	168.000
169.000	169.000	169.000	169.000
170.000	170.000	170.000	170.000
171.000	171.000	171.000	171.000
172.000	172.000	172.000	172.000
173.000	173.000	173.000	173.000
174.000	174.000	174.000	174.000
175.000	175.000	175.000	175.000
176.000	176.000	176.000	176.000
177.000	177.000	177.000	177.000
178.000	178.000	178.000	178.000
179.000	179.000	179.000	179.000
180.000	180.000	179.000	179.000 ****
181.000	181.000	181.000	181.000
182.000	182.000	182.000	182.000
183.000	183.000	183.000	183.000
184.000	184.000	184.000	184.000
185.000	185.000	185.000	185.000
186.000	186.000	186.000	186.000
187.000	187.000	187.000	187.000
188.000	188.000	188.000	188.000
189.000	189.000	189.000	189.000
190.000	190.000	190.000	190.000
191.000	191.000	191.000	191.000
192.000	192.000	192.000	192.000
193.000	193.000	193.000	193.000
194.000	194.000	194.000	194.000
195.000	195.000	195.000	195.000
196.000	196.000	195.000	195.000 ****
197.000	197.000	197.000	197.000
198.000	198.000	198.000	198.000
199.000	199.000	199.000	199.000
200.000	200.000	200.000	200.000
201.000	201.000	201.000	201.000
202.000	202.000	202.000	202.000
203.000	203.000	203.000	203.000
204.000	204.000	204.000	204.000
205.000	205.000	205.000	205.000
206.000	206.000	206.000	206.000
207.000	207.000	207.000	207.000
208.000	208.000	208.000	208.000
209.000	209.000	209.000	209.000
210.000	210.000	210.000	210.000
211.000	211.000	211.000	211.000
212.000	212.000	211.000	211.000 ****
213.000	213.000	213.000	213.000
214.000	214.000	214.000	214.000
215.000	215.000	215.000	215.000
216.000	216.000	216.000	216.000
217.000	217.000	217.000	217.000
218.000	218.000	218.000	218.000
219.000	219.000	219.000	219.000
220.000	220.000	220.000	220.000
221.000	221.000	221.000	221.000
222.000	222.000	222.000	222.000
223.000	223.000	223.000	223.000
224.000	224.000	224.000	224.000
225.000	225.000	225.000	225.000
226.000	226.000	226.000	226.000
227.000	227.000	227.000	227.000
228.000	228.000	227.000	227.000 ****
229.000	229.000	229.000	229.000
230.000	230.000	230.000	230.000
231.000	231.000	231.000	231.000
232.000	232.000	232.000	232.000
233.000	233.000	233.000	233.000
234.000	234.000	234.000	234.000
235.000	235.000	235.000	235.000
236.000	236.000	236.000	236.000
237.000	237.000	237.000	237.000
238.000	238.000	238.000	238.000
239.000	239.000	239.000	239.000
240.000	240.000	240.000	240.000
241.000	241.000	241.000	241.000
242.000	242.000	242.000	242.000
243.000	243.000	243.000	243.000
244.000	244.000	243.000	243.000 ****
245.000	245.000	245.000	245.000
246.000	246.000	246.000	246.000
247.000	247.000	247.000	247.000
248.000	248.000	248.000	248.000
249.000	249.000	249.000	249.000
250.000	250.000	250.000	250.000
251.000	251.000	251.000	251.000
252.000	252.000	252.000	252.000
253.000	253.000	253.000	253.000
254.000	254.000	254.000	254.000
255.000	255.000	255.000	255.000

test_array	cm.gray()	tiff_pil_load	tiff_imread_load
----------	---------	-------------	----------------
0.000	0.000	0.000	0.000
1.000	1.000	1.000	1.000
2.000	2.000	2.000	2.000
3.000	3.000	3.000	3.000
4.000	4.000	4.000	4.000
5.000	5.000	5.000	5.000
6.000	6.000	6.000	6.000
7.000	7.000	7.000	7.000
8.000	8.000	8.000	8.000
9.000	9.000	9.000	9.000
10.000	10.000	10.000	10.000
11.000	11.000	11.000	11.000
12.000	12.000	12.000	12.000
13.000	13.000	13.000	13.000
14.000	14.000	14.000	14.000
15.000	15.000	15.000	15.000
16.000	16.000	16.000	16.000
17.000	17.000	17.000	17.000
18.000	18.000	18.000	18.000
19.000	19.000	19.000	19.000
20.000	20.000	20.000	20.000
21.000	21.000	21.000	21.000
22.000	22.000	22.000	22.000
23.000	23.000	23.000	23.000
24.000	24.000	24.000	24.000
25.000	25.000	25.000	25.000
26.000	26.000	26.000	26.000
27.000	27.000	27.000	27.000
28.000	28.000	28.000	28.000
29.000	29.000	29.000	29.000
30.000	30.000	30.000	30.000
31.000	31.000	31.000	31.000
32.000	32.000	32.000	32.000
33.000	33.000	32.000	32.000 ****
34.000	34.000	34.000	34.000
35.000	35.000	35.000	35.000
36.000	36.000	36.000	36.000
37.000	37.000	36.000	36.000 ****
38.000	38.000	38.000	38.000
39.000	39.000	39.000	39.000
40.000	40.000	40.000	40.000
41.000	41.000	40.000	40.000 ****
42.000	42.000	42.000	42.000
43.000	43.000	43.000	43.000
44.000	44.000	44.000	44.000
45.000	45.000	44.000	44.000 ****
46.000	46.000	46.000	46.000
47.000	47.000	47.000	47.000
48.000	48.000	48.000	48.000
49.000	49.000	48.000	48.000 ****
50.000	50.000	50.000	50.000
51.000	51.000	51.000	51.000
52.000	52.000	52.000	52.000
53.000	53.000	52.000	52.000 ****
54.000	54.000	54.000	54.000
55.000	55.000	55.000	55.000
56.000	56.000	56.000	56.000
57.000	57.000	56.000	56.000 ****
58.000	58.000	58.000	58.000
59.000	59.000	59.000	59.000
60.000	60.000	60.000	60.000
61.000	61.000	60.000	60.000 ****
62.000	62.000	62.000	62.000
63.000	63.000	63.000	63.000
64.000	64.000	64.000	64.000
65.000	65.000	65.000	65.000
66.000	66.000	65.000	65.000 ****
67.000	67.000	67.000	67.000
68.000	68.000	68.000	68.000
69.000	69.000	69.000	69.000
70.000	70.000	70.000	70.000
71.000	71.000	71.000	71.000
72.000	72.000	72.000	72.000
73.000	73.000	73.000	73.000
74.000	74.000	73.000	73.000 ****
75.000	75.000	75.000	75.000
76.000	76.000	76.000	76.000
77.000	77.000	77.000	77.000
78.000	78.000	78.000	78.000
79.000	79.000	79.000	79.000
80.000	80.000	80.000	80.000
81.000	81.000	81.000	81.000
82.000	82.000	81.000	81.000 ****
83.000	83.000	83.000	83.000
84.000	84.000	84.000	84.000
85.000	85.000	85.000	85.000
86.000	86.000	86.000	86.000
87.000	87.000	87.000	87.000
88.000	88.000	88.000	88.000
89.000	89.000	89.000	89.000
90.000	90.000	89.000	89.000 ****
91.000	91.000	91.000	91.000
92.000	92.000	92.000	92.000
93.000	93.000	93.000	93.000
94.000	94.000	94.000	94.000
95.000	95.000	95.000	95.000
96.000	96.000	96.000	96.000
97.000	97.000	97.000	97.000
98.000	98.000	97.000	97.000 ****
99.000	99.000	99.000	99.000
100.000	100.000	100.000	100.000
101.000	101.000	101.000	101.000
102.000	102.000	102.000	102.000
103.000	103.000	103.000	103.000
104.000	104.000	104.000	104.000
105.000	105.000	105.000	105.000
106.000	106.000	105.000	105.000 ****
107.000	107.000	107.000	107.000
108.000	108.000	108.000	108.000
109.000	109.000	109.000	109.000
110.000	110.000	110.000	110.000
111.000	111.000	111.000	111.000
112.000	112.000	112.000	112.000
113.000	113.000	113.000	113.000
114.000	114.000	113.000	113.000 ****
115.000	115.000	115.000	115.000
116.000	116.000	116.000	116.000
117.000	117.000	117.000	117.000
118.000	118.000	118.000	118.000
119.000	119.000	119.000	119.000
120.000	120.000	120.000	120.000
121.000	121.000	121.000	121.000
122.000	122.000	121.000	121.000 ****
123.000	123.000	123.000	123.000
124.000	124.000	124.000	124.000
125.000	125.000	125.000	125.000
126.000	126.000	126.000	126.000
127.000	127.000	127.000	127.000
128.000	128.000	128.000	128.000
129.000	129.000	129.000	129.000
130.000	130.000	130.000	130.000
131.000	131.000	131.000	131.000
132.000	132.000	131.000	131.000 ****
133.000	133.000	133.000	133.000
134.000	134.000	134.000	134.000
135.000	135.000	135.000	135.000
136.000	136.000	136.000	136.000
137.000	137.000	137.000	137.000
138.000	138.000	138.000	138.000
139.000	139.000	139.000	139.000
140.000	140.000	140.000	140.000
141.000	141.000	141.000	141.000
142.000	142.000	142.000	142.000
143.000	143.000	143.000	143.000
144.000	144.000	144.000	144.000
145.000	145.000	145.000	145.000
146.000	146.000	146.000	146.000
147.000	147.000	147.000	147.000
148.000	148.000	147.000	147.000 ****
149.000	149.000	149.000	149.000
150.000	150.000	150.000	150.000
151.000	151.000	151.000	151.000
152.000	152.000	152.000	152.000
153.000	153.000	153.000	153.000
154.000	154.000	154.000	154.000
155.000	155.000	155.000	155.000
156.000	156.000	156.000	156.000
157.000	157.000	157.000	157.000
158.000	158.000	158.000	158.000
159.000	159.000	159.000	159.000
160.000	160.000	160.000	160.000
161.000	161.000	161.000	161.000
162.000	162.000	162.000	162.000
163.000	163.000	163.000	163.000
164.000	164.000	163.000	163.000 ****
165.000	165.000	165.000	165.000
166.000	166.000	166.000	166.000
167.000	167.000	167.000	167.000
168.000	168.000	168.000	168.000
169.000	169.000	169.000	169.000
170.000	170.000	170.000	170.000
171.000	171.000	171.000	171.000
172.000	172.000	172.000	172.000
173.000	173.000	173.000	173.000
174.000	174.000	174.000	174.000
175.000	175.000	175.000	175.000
176.000	176.000	176.000	176.000
177.000	177.000	177.000	177.000
178.000	178.000	178.000	178.000
179.000	179.000	179.000	179.000
180.000	180.000	179.000	179.000 ****
181.000	181.000	181.000	181.000
182.000	182.000	182.000	182.000
183.000	183.000	183.000	183.000
184.000	184.000	184.000	184.000
185.000	185.000	185.000	185.000
186.000	186.000	186.000	186.000
187.000	187.000	187.000	187.000
188.000	188.000	188.000	188.000
189.000	189.000	189.000	189.000
190.000	190.000	190.000	190.000
191.000	191.000	191.000	191.000
192.000	192.000	192.000	192.000
193.000	193.000	193.000	193.000
194.000	194.000	194.000	194.000
195.000	195.000	195.000	195.000
196.000	196.000	195.000	195.000 ****
197.000	197.000	197.000	197.000
198.000	198.000	198.000	198.000
199.000	199.000	199.000	199.000
200.000	200.000	200.000	200.000
201.000	201.000	201.000	201.000
202.000	202.000	202.000	202.000
203.000	203.000	203.000	203.000
204.000	204.000	204.000	204.000
205.000	205.000	205.000	205.000
206.000	206.000	206.000	206.000
207.000	207.000	207.000	207.000
208.000	208.000	208.000	208.000
209.000	209.000	209.000	209.000
210.000	210.000	210.000	210.000
211.000	211.000	211.000	211.000
212.000	212.000	211.000	211.000 ****
213.000	213.000	213.000	213.000
214.000	214.000	214.000	214.000
215.000	215.000	215.000	215.000
216.000	216.000	216.000	216.000
217.000	217.000	217.000	217.000
218.000	218.000	218.000	218.000
219.000	219.000	219.000	219.000
220.000	220.000	220.000	220.000
221.000	221.000	221.000	221.000
222.000	222.000	222.000	222.000
223.000	223.000	223.000	223.000
224.000	224.000	224.000	224.000
225.000	225.000	225.000	225.000
226.000	226.000	226.000	226.000
227.000	227.000	227.000	227.000
228.000	228.000	227.000	227.000 ****
229.000	229.000	229.000	229.000
230.000	230.000	230.000	230.000
231.000	231.000	231.000	231.000
232.000	232.000	232.000	232.000
233.000	233.000	233.000	233.000
234.000	234.000	234.000	234.000
235.000	235.000	235.000	235.000
236.000	236.000	236.000	236.000
237.000	237.000	237.000	237.000
238.000	238.000	238.000	238.000
239.000	239.000	239.000	239.000
240.000	240.000	240.000	240.000
241.000	241.000	241.000	241.000
242.000	242.000	242.000	242.000
243.000	243.000	243.000	243.000
244.000	244.000	243.000	243.000 ****
245.000	245.000	245.000	245.000
246.000	246.000	246.000	246.000
247.000	247.000	247.000	247.000
248.000	248.000	248.000	248.000
249.000	249.000	249.000	249.000
250.000	250.000	250.000	250.000
251.000	251.000	251.000	251.000
252.000	252.000	252.000	252.000
253.000	253.000	253.000	253.000
254.000	254.000	254.000	254.000
255.000	255.000	255.000	255.000

Expected outcome

In the console output, lines with asterisks '****' indicate lines where the image read-back shows image has wrong value. This happens with both an imsave'd png or tiff output image. Image read-back is verified by reading back using two different packages (Pillow and maptlotlib) to eliminate the possibility of the image read being the issue.

In the code output I'm only comparing the 'R' byte of the RGBA data, because the other bytes appear to be consistent, i.e. R=G=B and A=255.

From the console output you can see:

colormap always outputs the correct values based on the input array and 'gray' colormap

image read back using imread shows some wrong values were saved

image read back using PIL getdata() shows the same wrong values

Matplotlib version

Operating system:

macOS 10.13.6

Windows 10

Matplotlib version:

2.2.3 (macOS 10.13.6)

2.2.3 (Windows 10)

Matplotlib backend (print(matplotlib.get_backend())): and

'MacOSX' (macOS 10.13.6)

'TkAgg' (Windows 10)

Python version:

3.7.0 (macOS 10.13.6)

3.6.6 (Windows 10)

Jupyter version (if applicable): N/A

Other libraries:

Pillow 5.2.0 (macOS 10.13.6)

Pillow 5.2.0 (Windows 10)

matplotlib was installed on macOS using pip3 install into a homebrew python

matplotlib was installed on Win10 using pip3 install --user