Python 如何在matplotlib中平滑二维颜色贴图

Python 如何在matplotlib中平滑二维颜色贴图,python,dictionary,matplotlib,2d,pixels,Python,Dictionary,Matplotlib,2d,Pixels,我的问题是,是否有任何方法可以使用matplotlib平滑2D颜色贴图?我的代码: def map(): # setup parameters j = 0 N = 719 N2 = 35 x = np.linspace(190, 800, N) y = np.linspace(10, 360, N2) # (1,2,3), 1 - start Temp, 2- end temp + 10K, 3 - how many steps to reach

我的问题是,是否有任何方法可以使用matplotlib平滑2D颜色贴图?我的代码:

def map():
    # setup parameters
    j = 0
    N = 719
    N2 = 35
    x = np.linspace(190, 800, N) 
    y = np.linspace(10, 360, N2) # (1,2,3), 1 - start Temp, 2- end temp + 10K, 3 - how many steps to reach it
    z = []
    A = np.zeros([35,719]) # [1 2], 1 - number of spectras, 2 - delta wavelength
    # run
    for i in range(10,360,10):
            Z = []
            file_no = (str(0) + str(i))[-3:]
            data = np.genfromtxt('C:\\Users\\micha_000\\Desktop\\Measure\\' + '160317_LaPONd_g500_%s_radio.txt'%file_no,skip_header = 12)
            for line in data:
                Z.append(line[1]-6000)
            A[j,:] = Z
            j = j+1
    X, Y = np.meshgrid(x,y)
    fig, ax = plt.subplots()
    cs = ax.contourf(X, Y, A, cmap=cm.viridis)
    norm = colors.Normalize(vmin = 0, vmax = 1)
    plt.xlabel('wavelength [nm]')
    plt.ylabel('temperature [K]')
    plt.title('LaPONd_g500')
    cbar = fig.colorbar(cs, norm = norm)
    plt.savefig('C:\\Users\\micha_000\\Desktop\\Measure\\LaPONd_g500_radio_map.png')
    plt.show()
    plt.close()
下面是我收到的一个例子:


有没有办法通过平滑像素过渡使其看起来更好?

将png作为数组打开,并使用均值过滤器将其模糊。搜索卷积过滤器以了解更多信息。我刚刚使用了一个25像素的平方平均滤波器,但是你可以使用高斯分布使它看起来更平滑

import numpy as np
from scipy import ndimage, signal, misc

img = ndimage.imread('C:/.../Zrj50.png')

#I used msPaint to get coords... there's probably a better way
x0, y0, x1, y1 = 87,215,764,1270 #chart area (pixel coords)

#you could use a gaussian filter to get a rounder blur pattern
kernel = np.ones((5,5),)/25 #mean value convolution

#convolve roi with averaging filter
#red
img[x0:x1, y0:y1, 0] = signal.convolve2d(img[x0:x1, y0:y1, 0], kernel, mode='same', boundary='symm')
#green
img[x0:x1, y0:y1, 1] = signal.convolve2d(img[x0:x1, y0:y1, 1], kernel, mode='same', boundary='symm')
#blue
img[x0:x1, y0:y1, 2] = signal.convolve2d(img[x0:x1, y0:y1, 2], kernel, mode='same', boundary='symm')

#do it again for ledgend area
#...

misc.imsave('C:/.../Zrj50_blurred.png', img)
使用高斯值很容易:

#red
img[x0:x1, y0:y1, 0] = ndimage.gaussian_filter(img[x0:x1, y0:y1, 0], 4, mode='nearest')

问题不在于调色板(在matplotlib中都是平滑的),而在于您使用的是
contourf()
,它生成有限的计数集,每个计数集都有一种颜色,因此不平滑。默认值大约为10个countours

一个快速解决方案:,通过指定标高来增加等高线标高的数量(您还可以给出要包括哪些标高的数组):


更好的是,由于您的数据似乎已经在网格上(例如,每个像素的X、Y、Z值),您应该使用
pcolormesh(X、Y、a)
而不是等高线来绘制它。这将使用完全连续的值而不是步骤进行绘制

我知道,
imshow
有一个隐式的
interpolate
参数,你能做到吗:
plt.show(interpolate='nearest')
?@Maq92如果你将来打算对图像做更多的工作,我强烈建议你阅读卷积滤波器。它们是几乎所有图像处理的方式。这会平滑数据,而不是绘图。所以我不认为这是对这个问题的回答。我从来没有接触过数据,所以我所能做的就是用一个图像过滤程序模糊图像。我看不出你的评论对整个社区有什么好处。答案已经被接受了,所以这显然在某种程度上对OP有所帮助。我认为在评论中给出否决的理由是常识,我就是这么做的。当然,这对社区没有帮助,但不给出理由就投反对票是毫无用处的。@importantanceofbeingernest,我很欣赏,但我的论点是,这只是解决OP问题的一种替代的、完全有效的方法。这可能不是你想要做的,但这种情况并不一定需要改变数据分析的方式,只需要改变图像打印的方式。
cs = ax.contourf(X, Y, A, cmap=cm.viridis, levels=100)