简体   繁体   中英

Artifact in matplotlib.pyplot.imshow

I'm trying to make a colorplot of a function with matplotlob.pyplot.imshow. However, depending on the size of the plot, I get a vertical line as an artifact.

The code to generate the plot is:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec
from matplotlib import cm

def double_vortex(X,Y):
    return np.angle((X + 25)+1j*Y) - np.angle((X - 25)+1j*Y)

X = np.arange(-50,50)
Y = np.arange(-50,50)

X, Y = np.meshgrid(X, Y)
phi0_vortex = double_vortex(X,Y)
 
fig = plt.figure(figsize=(16,8)) 
gs = gridspec.GridSpec(1, 3, width_ratios=[2.5, 1.5,1]) 
for i in range(3):
    ax = plt.subplot(gs[i])
    ax.imshow(phi0_vortex % (2*np.pi), cmap=cm.hsv, vmin=0, vmax=2*np.pi)

The resulting plot is this:在此处输入图像描述

You can see that the two smaller plots exhibit a vertical line as an artefact. Is this a bug in matplotlib or somehow actually to be expected?

This is a consequence of matplotlib's downsampling algorithm, which happens in data space, and in your case a pair of pixels that has [359, 1] in them, get averaged to 180, and you get the cyan line. This is https://github.com/matplotlib/matplotlib/issues/18735 for which we are working on a solution to allow RGB-space downsampling (as well).

What can you do about this until that is improved in Matplotlib? Don't downsample in Matplotlib is the simple answer - make a big png, and then resample in post-processing software like imagemagick.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM