from __future__ import (absolute_import, division, print_function, unicode_literals) import six import numpy as np from matplotlib.testing.decorators import image_comparison, knownfailureif, cleanup from matplotlib import rcParams import matplotlib.pyplot as plt from nose.tools import assert_raises from numpy.testing import assert_array_equal, assert_array_almost_equal import io import os try: from PIL import Image HAS_PIL = True except ImportError: HAS_PIL = False @image_comparison(baseline_images=['image_interps']) def test_image_interps(): 'make the basic nearest, bilinear and bicubic interps' X = np.arange(100) X = X.reshape(5, 20) fig = plt.figure() ax1 = fig.add_subplot(311) ax1.imshow(X, interpolation='nearest') ax1.set_title('three interpolations') ax1.set_ylabel('nearest') ax2 = fig.add_subplot(312) ax2.imshow(X, interpolation='bilinear') ax2.set_ylabel('bilinear') ax3 = fig.add_subplot(313) ax3.imshow(X, interpolation='bicubic') ax3.set_ylabel('bicubic') @image_comparison(baseline_images=['interp_nearest_vs_none'], extensions=['pdf', 'svg'], remove_text=True) def test_interp_nearest_vs_none(): 'Test the effect of "nearest" and "none" interpolation' # Setting dpi to something really small makes the difference very # visible. This works fine with pdf, since the dpi setting doesn't # affect anything but images, but the agg output becomes unusably # small. rcParams['savefig.dpi'] = 3 X = np.array([[[218, 165, 32], [122, 103, 238]], [[127, 255, 0], [255, 99, 71]]], dtype=np.uint8) fig = plt.figure() ax1 = fig.add_subplot(121) ax1.imshow(X, interpolation='none') ax1.set_title('interpolation none') ax2 = fig.add_subplot(122) ax2.imshow(X, interpolation='nearest') ax2.set_title('interpolation nearest') @image_comparison(baseline_images=['figimage-0', 'figimage-1'], extensions=['png']) def test_figimage(): 'test the figimage method' for suppressComposite in False, True: fig = plt.figure(figsize=(2,2), dpi=100) fig.suppressComposite = suppressComposite x,y = np.ix_(np.arange(100.0)/100.0, np.arange(100.0)/100.0) z = np.sin(x**2 + y**2 - x*y) c = np.sin(20*x**2 + 50*y**2) img = z + c/5 fig.figimage(img, xo=0, yo=0, origin='lower') fig.figimage(img[::-1,:], xo=0, yo=100, origin='lower') fig.figimage(img[:,::-1], xo=100, yo=0, origin='lower') fig.figimage(img[::-1,::-1], xo=100, yo=100, origin='lower') @cleanup def test_image_python_io(): fig = plt.figure() ax = fig.add_subplot(111) ax.plot([1,2,3]) buffer = io.BytesIO() fig.savefig(buffer) buffer.seek(0) plt.imread(buffer) @knownfailureif(not HAS_PIL) def test_imread_pil_uint16(): img = plt.imread(os.path.join(os.path.dirname(__file__), 'baseline_images', 'test_image', 'uint16.tif')) assert (img.dtype == np.uint16) assert np.sum(img) == 134184960 # def test_image_unicode_io(): # fig = plt.figure() # ax = fig.add_subplot(111) # ax.plot([1,2,3]) # fname = u"\u0a3a\u0a3a.png" # fig.savefig(fname) # plt.imread(fname) # os.remove(fname) def test_imsave(): # The goal here is that the user can specify an output logical DPI # for the image, but this will not actually add any extra pixels # to the image, it will merely be used for metadata purposes. # So we do the traditional case (dpi == 1), and the new case (dpi # == 100) and read the resulting PNG files back in and make sure # the data is 100% identical. from numpy import random random.seed(1) data = random.rand(256, 128) buff_dpi1 = io.BytesIO() plt.imsave(buff_dpi1, data, dpi=1) buff_dpi100 = io.BytesIO() plt.imsave(buff_dpi100, data, dpi=100) buff_dpi1.seek(0) arr_dpi1 = plt.imread(buff_dpi1) buff_dpi100.seek(0) arr_dpi100 = plt.imread(buff_dpi100) assert arr_dpi1.shape == (256, 128, 4) assert arr_dpi100.shape == (256, 128, 4) assert_array_equal(arr_dpi1, arr_dpi100) def test_imsave_color_alpha(): # Test that imsave accept arrays with ndim=3 where the third dimension is # color and alpha without raising any exceptions, and that the data is # acceptably preserved through a save/read roundtrip. from numpy import random random.seed(1) data = random.rand(256, 128, 4) buff = io.BytesIO() plt.imsave(buff, data) buff.seek(0) arr_buf = plt.imread(buff) # Recreate the float -> uint8 -> float32 conversion of the data data = (255*data).astype('uint8').astype('float32')/255 # Wherever alpha values were rounded down to 0, the rgb values all get set # to 0 during imsave (this is reasonable behaviour). # Recreate that here: for j in range(3): data[data[:, :, 3] == 0, j] = 1 assert_array_equal(data, arr_buf) @image_comparison(baseline_images=['image_clip']) def test_image_clip(): from math import pi fig = plt.figure() ax = fig.add_subplot(111, projection='hammer') d = [[1,2],[3,4]] im = ax.imshow(d, extent=(-pi,pi,-pi/2,pi/2)) @image_comparison(baseline_images=['image_cliprect']) def test_image_cliprect(): import matplotlib.patches as patches fig = plt.figure() ax = fig.add_subplot(111) d = [[1,2],[3,4]] im = ax.imshow(d, extent=(0,5,0,5)) rect = patches.Rectangle(xy=(1,1), width=2, height=2, transform=im.axes.transData) im.set_clip_path(rect) @image_comparison(baseline_images=['imshow'], remove_text=True) def test_imshow(): import numpy as np import matplotlib.pyplot as plt fig = plt.figure() arr = np.arange(100).reshape((10, 10)) ax = fig.add_subplot(111) ax.imshow(arr, interpolation="bilinear", extent=(1,2,1,2)) ax.set_xlim(0,3) ax.set_ylim(0,3) @image_comparison(baseline_images=['no_interpolation_origin'], remove_text=True) def test_no_interpolation_origin(): fig = plt.figure() ax = fig.add_subplot(211) ax.imshow(np.arange(100).reshape((2, 50)), origin="lower", interpolation='none') ax = fig.add_subplot(212) ax.imshow(np.arange(100).reshape((2, 50)), interpolation='none') @image_comparison(baseline_images=['image_shift'], remove_text=True, extensions=['pdf', 'svg']) def test_image_shift(): from matplotlib.colors import LogNorm imgData = [[1.0/(x) + 1.0/(y) for x in range(1,100)] for y in range(1,100)] tMin=734717.945208 tMax=734717.946366 fig = plt.figure() ax = fig.add_subplot(111) ax.imshow(imgData, norm=LogNorm(), interpolation='none', extent=(tMin, tMax, 1, 100)) ax.set_aspect('auto') @cleanup def test_image_edges(): f = plt.figure(figsize=[1, 1]) ax = f.add_axes([0, 0, 1, 1], frameon=False) data = np.tile(np.arange(12), 15).reshape(20, 9) im = ax.imshow(data, origin='upper', extent=[-10, 10, -10, 10], interpolation='none', cmap='gray' ) x = y = 2 ax.set_xlim([-x, x]) ax.set_ylim([-y, y]) ax.set_xticks([]) ax.set_yticks([]) buf = io.BytesIO() f.savefig(buf, facecolor=(0, 1, 0)) buf.seek(0) im = plt.imread(buf) r, g, b, a = sum(im[:, 0]) r, g, b, a = sum(im[:, -1]) assert g != 100, 'Expected a non-green edge - but sadly, it was.' @image_comparison(baseline_images=['image_composite_background'], remove_text=True) def test_image_composite_background(): fig = plt.figure() ax = fig.add_subplot(111) arr = np.arange(12).reshape(4, 3) ax.imshow(arr, extent=[0, 2, 15, 0]) ax.imshow(arr, extent=[4, 6, 15, 0]) ax.set_axis_bgcolor((1, 0, 0, 0.5)) ax.set_xlim([0, 12]) @image_comparison(baseline_images=['image_composite_alpha'], remove_text=True) def test_image_composite_alpha(): """ Tests that the alpha value is recognized and correctly applied in the process of compositing images together. """ fig = plt.figure() ax = fig.add_subplot(111) arr = np.zeros((11, 21, 4)) arr[:, :, 0] = 1 arr[:, :, 3] = np.concatenate((np.arange(0, 1.1, 0.1), np.arange(0, 1, 0.1)[::-1])) arr2 = np.zeros((21, 11, 4)) arr2[:, :, 0] = 1 arr2[:, :, 1] = 1 arr2[:, :, 3] = np.concatenate((np.arange(0, 1.1, 0.1), np.arange(0, 1, 0.1)[::-1]))[:, np.newaxis] ax.imshow(arr, extent=[1, 2, 5, 0], alpha=0.3) ax.imshow(arr, extent=[2, 3, 5, 0], alpha=0.6) ax.imshow(arr, extent=[3, 4, 5, 0]) ax.imshow(arr2, extent=[0, 5, 1, 2]) ax.imshow(arr2, extent=[0, 5, 2, 3], alpha=0.6) ax.imshow(arr2, extent=[0, 5, 3, 4], alpha=0.3) ax.set_axis_bgcolor((0, 0.5, 0, 1)) ax.set_xlim([0, 5]) ax.set_ylim([5, 0]) @image_comparison(baseline_images=['rasterize_10dpi'], extensions=['pdf','svg'], tol=5e-2, remove_text=True) def test_rasterize_dpi(): # This test should check rasterized rendering with high output resolution. # It plots a rasterized line and a normal image with implot. So it will catch # when images end up in the wrong place in case of non-standard dpi setting. # Instead of high-res rasterization i use low-res. Therefore the fact that the # resolution is non-standard is is easily checked by image_comparison. import numpy as np import matplotlib.pyplot as plt img = np.asarray([[1, 2], [3, 4]]) fig, axes = plt.subplots(1, 3, figsize = (3, 1)) axes[0].imshow(img) axes[1].plot([0,1],[0,1], linewidth=20., rasterized=True) axes[1].set(xlim = (0,1), ylim = (-1, 2)) axes[2].plot([0,1],[0,1], linewidth=20.) axes[2].set(xlim = (0,1), ylim = (-1, 2)) # Low-dpi PDF rasterization errors prevent proper image comparison tests. # Hide detailed structures like the axes spines. for ax in axes: ax.set_xticks([]) ax.set_yticks([]) for spine in ax.spines.values(): spine.set_visible(False) rcParams['savefig.dpi'] = 10 if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False)