From 8ff6d2d8e37515364b883b79d1a9da563b84c2c5 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 8 Sep 2015 18:02:42 +0200 Subject: [PATCH] changed adjustable parameter of axes to 'box-forced' this fixes the size of axes around an image for shared axes --- .../applications/plot_coins_segmentation.py | 9 ++- doc/examples/applications/plot_morphology.py | 2 + .../applications/plot_rank_filters.py | 55 ++++++------------ doc/examples/plot_edge_filter.py | 4 +- doc/examples/plot_equalize.py | 1 + doc/examples/plot_hog.py | 2 + doc/examples/plot_line_hough_transform.py | 58 ++++++++++--------- doc/examples/plot_local_otsu.py | 2 +- .../plot_random_walker_segmentation.py | 5 +- doc/examples/plot_tinting_grayscale_images.py | 8 ++- doc/examples/plot_watershed.py | 2 +- 11 files changed, 74 insertions(+), 74 deletions(-) diff --git a/doc/examples/applications/plot_coins_segmentation.py b/doc/examples/applications/plot_coins_segmentation.py index 78df6883..29cacac9 100644 --- a/doc/examples/applications/plot_coins_segmentation.py +++ b/doc/examples/applications/plot_coins_segmentation.py @@ -35,7 +35,9 @@ background with the coins: """ -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3), sharex=True, sharey=True) +fig = plt.figure(figsize=(6,3)) +ax1 = fig.add_subplot(1, 2, 1, adjustable='box-forced') +ax2 = fig.add_subplot(1, 2, 2, sharex = ax1, sharey = ax1, adjustable='box-forced') ax1.imshow(coins > 100, cmap=plt.cm.gray, interpolation='nearest') ax1.set_title('coins > 100') ax1.axis('off') @@ -162,8 +164,9 @@ segmentation = ndi.binary_fill_holes(segmentation - 1) labeled_coins, _ = ndi.label(segmentation) image_label_overlay = label2rgb(labeled_coins, image=coins) -# TODO: this example would benefit from sharing axes over multiple figures -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3), sharex=True, sharey=True) +fig = plt.figure(figsize=(6,3)) +ax1 = fig.add_subplot(1, 2, 1, adjustable='box-forced') +ax2 = fig.add_subplot(1, 2, 2, sharex = ax1, sharey = ax1, adjustable='box-forced') ax1.imshow(coins, cmap=plt.cm.gray, interpolation='nearest') ax1.contour(segmentation, [0.5], linewidths=1.2, colors='y') ax1.axis('off') diff --git a/doc/examples/applications/plot_morphology.py b/doc/examples/applications/plot_morphology.py index b2f9b323..33246793 100644 --- a/doc/examples/applications/plot_morphology.py +++ b/doc/examples/applications/plot_morphology.py @@ -46,9 +46,11 @@ def plot_comparison(original, filtered, filter_name): ax1.imshow(original, cmap=plt.cm.gray) ax1.set_title('original') ax1.axis('off') + ax1.set_adjustable('box-forced') ax2.imshow(filtered, cmap=plt.cm.gray) ax2.set_title(filter_name) ax2.axis('off') + ax2.set_adjustable('box-forced') """ Erosion diff --git a/doc/examples/applications/plot_rank_filters.py b/doc/examples/applications/plot_rank_filters.py index 41b89769..13620ebf 100644 --- a/doc/examples/applications/plot_rank_filters.py +++ b/doc/examples/applications/plot_rank_filters.py @@ -70,7 +70,7 @@ noisy_image = img_as_ubyte(data.camera()) noisy_image[noise > 0.99] = 255 noisy_image[noise < 0.01] = 0 -fig, ax = plt.subplots(2, 2, figsize=(10, 7), sharex=True, sharey=True) +fig, ax = plt.subplots(2, 2, figsize=(10, 7), sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() ax1.imshow(noisy_image, vmin=0, vmax=255, cmap=plt.cm.gray) @@ -109,7 +109,7 @@ image. from skimage.filters.rank import mean -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[10, 7], sharex=True, sharey=True) +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[10, 7], sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) loc_mean = mean(noisy_image, disk(10)) @@ -143,7 +143,7 @@ noisy_image = img_as_ubyte(data.camera()) bilat = mean_bilateral(noisy_image.astype(np.uint16), disk(20), s0=10, s1=10) -fig, ax = plt.subplots(2, 2, figsize=(10, 7), sharex='row', sharey='row') +fig, ax = plt.subplots(2, 2, figsize=(10, 7), sharex='row', sharey='row', subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() ax1.imshow(noisy_image, cmap=plt.cm.gray) @@ -196,9 +196,13 @@ hist = np.histogram(noisy_image, bins=np.arange(0, 256)) glob_hist = np.histogram(glob, bins=np.arange(0, 256)) loc_hist = np.histogram(loc, bins=np.arange(0, 256)) -# this way histograms also share the axes -fig, ax = plt.subplots(3, 2, figsize=(10, 10), sharex='col', sharey='col') -ax1, ax2, ax3, ax4, ax5, ax6 = ax.ravel() +fig = plt.figure() +ax1 = plt.subplot(3, 2, 1, adjustable='box-forced') +ax2 = plt.subplot(3, 2, 2) +ax3 = plt.subplot(3, 2, 3, adjustable='box-forced', sharex=ax1, sharey=ax1) +ax4 = plt.subplot(3, 2, 4) +ax5 = plt.subplot(3, 2, 5, adjustable='box-forced', sharex=ax1, sharey=ax1) +ax6 = plt.subplot(3, 2, 6) ax1.imshow(noisy_image, interpolation='nearest', cmap=plt.cm.gray) ax1.axis('off') @@ -237,7 +241,7 @@ noisy_image = img_as_ubyte(data.camera()) auto = autolevel(noisy_image.astype(np.uint16), disk(20)) -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[10, 7], sharex=True, sharey=True) +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[10, 7], sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1.imshow(noisy_image, cmap=plt.cm.gray) ax1.set_title('Original') @@ -272,13 +276,10 @@ loc_perc_autolevel1 = autolevel_percentile(image, selem=selem, p0=.01, p1=.99) loc_perc_autolevel2 = autolevel_percentile(image, selem=selem, p0=.05, p1=.95) loc_perc_autolevel3 = autolevel_percentile(image, selem=selem, p0=.1, p1=.9) -fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(7, 8), sharex=True, sharey=True) +fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(7, 8), sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax0, ax1, ax2 = axes plt.gray() -#ax0.imshow(np.hstack((image, loc_autolevel)), cmap=plt.cm.gray) -#ax0.set_title('Original / auto-level') - title_list = ['Original', 'auto_level', 'auto-level 0%', @@ -298,18 +299,6 @@ for i in range(0,len(image_list)): axes_list[i].set_title(title_list[i]) axes_list[i].axis('off') -''' -ax1.imshow( - np.hstack((loc_perc_autolevel0, loc_perc_autolevel1)), vmin=0, vmax=255) -ax1.set_title('Percentile auto-level 0%,1%') -ax2.imshow( - np.hstack((loc_perc_autolevel2, loc_perc_autolevel3)), vmin=0, vmax=255) -ax2.set_title('Percentile auto-level 5% and 10%') - -for ax in axes: - ax.axis('off') -''' - """ .. image:: PLOT2RST.current_figure @@ -326,7 +315,7 @@ noisy_image = img_as_ubyte(data.camera()) enh = enhance_contrast(noisy_image, disk(5)) -fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex='row', sharey='row') +fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex='row', sharey='row', subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() ax1.imshow(noisy_image, cmap=plt.cm.gray) @@ -358,7 +347,7 @@ noisy_image = img_as_ubyte(data.camera()) penh = enhance_contrast_percentile(noisy_image, disk(5), p0=.1, p1=.9) -fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex='row', sharey='row') +fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex='row', sharey='row', subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() ax1.imshow(noisy_image, cmap=plt.cm.gray) @@ -415,7 +404,7 @@ loc_otsu = p8 >= t_loc_otsu t_glob_otsu = threshold_otsu(p8) glob_otsu = p8 >= t_glob_otsu -fig, ax = plt.subplots(2, 2, sharex=True, sharey=True) +fig, ax = plt.subplots(2, 2, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() fig.colorbar(ax1.imshow(p8, cmap=plt.cm.gray), ax=ax1) @@ -451,7 +440,7 @@ m = (np.tile(x, (n, 1)) * np.linspace(0.1, 1, n) * 128 + 128).astype(np.uint8) radius = 10 t = rank.otsu(m, disk(radius)) -fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True) +fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1.imshow(m) ax1.set_title('Original') @@ -490,7 +479,7 @@ opening = minimum(maximum(noisy_image, disk(5)), disk(5)) grad = gradient(noisy_image, disk(5)) # display results -fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex=True, sharey=True) +fig, ax = plt.subplots(2, 2, figsize=[10, 7], sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() ax1.imshow(noisy_image, cmap=plt.cm.gray) @@ -540,7 +529,7 @@ import matplotlib.pyplot as plt image = data.camera() -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), sharex=True, sharey=True) +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) fig.colorbar(ax1.imshow(image, cmap=plt.cm.gray), ax=ax1) ax1.set_title('Image') @@ -702,13 +691,7 @@ Comparison of outcome of the three methods: """ -''' -fig, ax = plt.subplots() -ax.imshow(np.hstack((rc, rndi))) -ax.set_title('filters.rank.median vs. scipy.ndimage.percentile') -ax.axis('off') -''' -fig, (ax0, ax1) = plt.subplots(ncols=2, sharex=True, sharey=True) +fig, (ax0, ax1) = plt.subplots(ncols=2, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax0.set_title('filters.rank.median') ax0.imshow(rc) ax0.axis('off') diff --git a/doc/examples/plot_edge_filter.py b/doc/examples/plot_edge_filter.py index b3c26c07..7ad1a6eb 100644 --- a/doc/examples/plot_edge_filter.py +++ b/doc/examples/plot_edge_filter.py @@ -19,7 +19,7 @@ image = camera() edge_roberts = roberts(image) edge_sobel = sobel(image) -fig, (ax0, ax1) = plt.subplots(ncols=2, sharex=True, sharey=True) +fig, (ax0, ax1) = plt.subplots(ncols=2, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax0.imshow(edge_roberts, cmap=plt.cm.gray) ax0.set_title('Roberts Edge Detection') @@ -66,7 +66,7 @@ diff_scharr_prewitt = edge_scharr - edge_prewitt diff_scharr_sobel = edge_scharr - edge_sobel max_diff = np.max(np.maximum(diff_scharr_prewitt, diff_scharr_sobel)) -fig, ((ax0, ax1), (ax2, ax3)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True) +fig, ((ax0, ax1), (ax2, ax3)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax0.imshow(img, cmap=plt.cm.gray) ax0.set_title('Original image') diff --git a/doc/examples/plot_equalize.py b/doc/examples/plot_equalize.py index 82bd4eaf..2289e270 100644 --- a/doc/examples/plot_equalize.py +++ b/doc/examples/plot_equalize.py @@ -40,6 +40,7 @@ def plot_img_and_hist(img, axes, bins=256): # Display image ax_img.imshow(img, cmap=plt.cm.gray) ax_img.set_axis_off() + ax_img.set_adjustable('box-forced') # Display histogram ax_hist.hist(img.ravel(), bins=bins, histtype='step', color='black') diff --git a/doc/examples/plot_hog.py b/doc/examples/plot_hog.py index d181eea7..ab71bb36 100644 --- a/doc/examples/plot_hog.py +++ b/doc/examples/plot_hog.py @@ -95,6 +95,7 @@ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True) ax1.axis('off') ax1.imshow(image, cmap=plt.cm.gray) ax1.set_title('Input image') +ax1.set_adjustable('box-forced') # Rescale histogram for better display hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02)) @@ -102,4 +103,5 @@ hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02)) ax2.axis('off') ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray) ax2.set_title('Histogram of Oriented Gradients') +ax1.set_adjustable('box-forced') plt.show() diff --git a/doc/examples/plot_line_hough_transform.py b/doc/examples/plot_line_hough_transform.py index 9d508385..2a5e96d7 100644 --- a/doc/examples/plot_line_hough_transform.py +++ b/doc/examples/plot_line_hough_transform.py @@ -77,32 +77,33 @@ image[idx, idx] = 255 h, theta, d = hough_line(image) -fig, ax = plt.subplots(1, 3, figsize=(8, 4), sharex=True, sharey=True) -fig.delaxes(ax[1]) -ax[1] = fig.add_subplot(1, 3, 2) +fig = plt.figure(figsize=(8, 4)) +ax1 = plt.subplot(1, 3, 1, adjustable='box-forced') +ax2 = plt.subplot(1, 3, 2) +ax3 = plt.subplot(1, 3, 3, sharex=ax1, sharey=ax1, adjustable='box-forced') -ax[0].imshow(image, cmap=plt.cm.gray) -ax[0].set_title('Input image') -ax[0].set_axis_off() +ax1.imshow(image, cmap=plt.cm.gray) +ax1.set_title('Input image') +ax1.set_axis_off() -ax[1].imshow(np.log(1 + h), +ax2.imshow(np.log(1 + h), extent=[np.rad2deg(theta[-1]), np.rad2deg(theta[0]), d[-1], d[0]], cmap=plt.cm.gray, aspect=1/1.5) -ax[1].set_title('Hough transform') -ax[1].set_xlabel('Angles (degrees)') -ax[1].set_ylabel('Distance (pixels)') -ax[1].axis('image') +ax2.set_title('Hough transform') +ax2.set_xlabel('Angles (degrees)') +ax2.set_ylabel('Distance (pixels)') +ax2.axis('image') -ax[2].imshow(image, cmap=plt.cm.gray) +ax3.imshow(image, cmap=plt.cm.gray) rows, cols = image.shape for _, angle, dist in zip(*hough_line_peaks(h, theta, d)): y0 = (dist - 0 * np.cos(angle)) / np.sin(angle) y1 = (dist - cols * np.cos(angle)) / np.sin(angle) - ax[2].plot((0, cols), (y0, y1), '-r') -ax[2].axis((0, cols, rows, 0)) -ax[2].set_title('Detected lines') -ax[2].set_axis_off() + ax3.plot((0, cols), (y0, y1), '-r') +ax3.axis((0, cols, rows, 0)) +ax3.set_title('Detected lines') +ax3.set_axis_off() # Line finding, using the Probabilistic Hough Transform @@ -111,22 +112,25 @@ edges = canny(image, 2, 1, 25) lines = probabilistic_hough_line(edges, threshold=10, line_length=5, line_gap=3) -fig2, ax = plt.subplots(1, 3, figsize=(8, 3), sharex=True, sharey=True) +fig2 = plt.figure(figsize=(8, 3)) +ax1 = plt.subplot(1, 3, 1, adjustable='box-forced') +ax2 = plt.subplot(1, 3, 2, sharex=ax1, sharey=ax1, adjustable='box-forced') +ax3 = plt.subplot(1, 3, 3, sharex=ax1, sharey=ax1, adjustable='box-forced') -ax[0].imshow(image, cmap=plt.cm.gray) -ax[0].set_title('Input image') -ax[0].set_axis_off() +ax1.imshow(image, cmap=plt.cm.gray) +ax1.set_title('Input image') +ax1.set_axis_off() -ax[1].imshow(edges, cmap=plt.cm.gray) -ax[1].set_title('Canny edges') -ax[1].set_axis_off() +ax2.imshow(edges, cmap=plt.cm.gray) +ax2.set_title('Canny edges') +ax2.set_axis_off() -ax[2].imshow(edges * 0) +ax3.imshow(edges * 0) for line in lines: p0, p1 = line - ax[2].plot((p0[0], p1[0]), (p0[1], p1[1])) + ax3.plot((p0[0], p1[0]), (p0[1], p1[1])) -ax[2].set_title('Probabilistic Hough') -ax[2].set_axis_off() +ax3.set_title('Probabilistic Hough') +ax3.set_axis_off() plt.show() diff --git a/doc/examples/plot_local_otsu.py b/doc/examples/plot_local_otsu.py index 6c5dca17..d853c25a 100644 --- a/doc/examples/plot_local_otsu.py +++ b/doc/examples/plot_local_otsu.py @@ -37,7 +37,7 @@ threshold_global_otsu = threshold_otsu(img) global_otsu = img >= threshold_global_otsu -fig, ax = plt.subplots(2, 2, figsize=(8, 5), sharex=True, sharey=True) +fig, ax = plt.subplots(2, 2, figsize=(8, 5), sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax1, ax2, ax3, ax4 = ax.ravel() fig.colorbar(ax1.imshow(img, cmap=plt.cm.gray), diff --git a/doc/examples/plot_random_walker_segmentation.py b/doc/examples/plot_random_walker_segmentation.py index 0d8ed924..8413a5a6 100644 --- a/doc/examples/plot_random_walker_segmentation.py +++ b/doc/examples/plot_random_walker_segmentation.py @@ -38,13 +38,16 @@ markers[data > 1.3] = 2 labels = random_walker(data, markers, beta=10, mode='bf') # Plot results -fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(8, 3.2), sharex=True, sharey=True) +fig = plt.figure(figsize=(8, 3.2)) +ax1 = plt.subplot(1, 3, 1, adjustable='box-forced') ax1.imshow(data, cmap='gray', interpolation='nearest') ax1.axis('off') ax1.set_title('Noisy data') +ax2 = plt.subplot(1, 3, 2, sharex=ax1, sharey=ax1, adjustable='box-forced') ax2.imshow(markers, cmap='hot', interpolation='nearest') ax2.axis('off') ax2.set_title('Markers') +ax3 = plt.subplot(1, 3, 3, sharex=ax1, sharey=ax1, adjustable='box-forced') ax3.imshow(labels, cmap='gray', interpolation='nearest') ax3.axis('off') ax3.set_title('Segmentation') diff --git a/doc/examples/plot_tinting_grayscale_images.py b/doc/examples/plot_tinting_grayscale_images.py index e0c1cb32..2ba54396 100644 --- a/doc/examples/plot_tinting_grayscale_images.py +++ b/doc/examples/plot_tinting_grayscale_images.py @@ -28,12 +28,11 @@ image = color.gray2rgb(grayscale_image) red_multiplier = [1, 0, 0] yellow_multiplier = [1, 1, 0] -# sharing the axes makes the grid show beneath the image -# this could be solved by calling set_axis_off() where this -# behaviour is not wanted fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(8, 4), sharex=True, sharey=True) ax1.imshow(red_multiplier * image) ax2.imshow(yellow_multiplier * image) +ax1.set_adjustable('box-forced') +ax2.set_adjustable('box-forced') """ .. image:: PLOT2RST.current_figure @@ -114,6 +113,7 @@ for ax, hue in zip(axes.flat, hue_rotations): tinted_image = colorize(image, hue, saturation=0.3) ax.imshow(tinted_image, vmin=0, vmax=1) ax.set_axis_off() + ax.set_adjustable('box-forced') fig.tight_layout() """ @@ -148,6 +148,8 @@ masked_image[textured_regions, :] *= red_multiplier fig, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, figsize=(8, 4), sharex=True, sharey=True) ax1.imshow(sliced_image) ax2.imshow(masked_image) +ax1.set_adjustable('box-forced') +ax2.set_adjustable('box-forced') plt.show() diff --git a/doc/examples/plot_watershed.py b/doc/examples/plot_watershed.py index de2fa67e..664c4c77 100644 --- a/doc/examples/plot_watershed.py +++ b/doc/examples/plot_watershed.py @@ -48,7 +48,7 @@ local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((3, 3)), markers = ndi.label(local_maxi)[0] labels = watershed(-distance, markers, mask=image) -fig, axes = plt.subplots(ncols=3, figsize=(8, 2.7), sharex=True, sharey=True) +fig, axes = plt.subplots(ncols=3, figsize=(8, 2.7), sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'}) ax0, ax1, ax2 = axes ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')