在函数中使用颜色条

时间:2017-10-25 00:48:14

标签: python matplotlib colorbar

对于我的研究报告,我编写了一个自定义模块,其中包含2个为我的报告制作图像的功能:

process_mods.py

def make_image(image, filename, color_map, title):
    '''
    Take as arguments an array, the filename to save as, a color map, and
    a title for the image.
    Produces a publication-quality image of the array, rescaled to Galactic
    coordinates.
    '''
    l_max = 25
    b_max = 15
    xlabel = r'Galactic longitude $\ell$ (deg)'
    ylabel = r'Galactic latitude $b$ (deg)'
    plt.imshow(image, origin='lower',
          extent=[l_max, -l_max, -b_max, b_max],
          cmap = color_map)
    plt.title(title, fontsize = 'small')
    plt.xlabel(xlabel, fontsize = 'small')
    plt.ylabel(ylabel, fontsize = 'small')
    plt.savefig(filename + '.png',
                transparent=False,
                bbox_inches='tight',
                overwrite = True)

def make_image_colorbar(image, filename, color_map, title):
    '''
    Take as arguments an array, the filename to save as, a color map, and
    a title for the image.
    Produces a publication-quality image of the array, rescaled to Galactic
    coordinates, including color bar.
    '''
    l_max = 25
    b_max = 15
    xlabel = r'Galactic longitude $\ell$ (deg)'
    ylabel = r'Galactic latitude $b$ (deg)'
    ax = plt.subplot(111)
    fig =ax.imshow(image, origin='lower',
          extent=[l_max, -l_max, -b_max, b_max],
          cmap = color_map)
    plt.colorbar(fig, fraction = 0.028)
    plt.title(title, fontsize = 'small')
    plt.xlabel(xlabel, fontsize = 'small')
    plt.ylabel(ylabel, fontsize = 'small')
    plt.savefig(filename + '.png',
                transparent=False,
                bbox_inches='tight',
                overwrite = True)

make_image函数按预期工作,make_image_colorbar的想法只是在图像中包含一个颜色条。 当我在两个连续的数组上调用make_image_colorbar函数时,第一个看起来很好,但第二个有两个颜色条,一个是自己的,另一个是第一个图像。这是我用来测试模块的代码:

import process_mods as pm

arr1 = pm.create_random_array(0, 100, 10, 12, 5)
arr2 = pm.create_random_array(0, 100, 10, 12, 10)

pm.make_image(arr1, 'arr1', 'spectral', 'Array1')
pm.make_image_colorbar(arr2, 'arr2', 'spectral', 'Array2')

enter image description here enter image description here

此测试使用

def create_random_array(low, high, height, width, seed):
    '''
    Create a random array of floats from lower_limit to upper_limit
    in a height x width matrix
    '''
    np.random.seed(seed)
    random_array = high * np.random.rand(height, width) + low
    return random_array

这是来自process_mods的另一个函数,但我不认为这就是问题所在。

任何人都可以看到我如何阻止该功能在arr1上打印arr2的彩条?

1 个答案:

答案 0 :(得分:0)

我认为混淆来自于没有意识到你正在绘制的图形/轴。我发现使用matplotlib的面向对象的界面可以让你更清楚地使用哪些轴。

我对您的代码所做的更改是在主脚本中创建数字,并在调用process_mode.py中定义的函数时将它们作为参数传递。通过这种方式,您可以确定绘图的位置。此外,您可以将ax参数传递给plt.colorbar(),以指定它适用的轴:

plt.colorbar(im, ax=ax) 
make_image_colorbar中的

process_mods.py将成为:

def make_image_colorbar(image, fig, ax, filename, color_map, title):

    l_max = 25
    b_max = 15
    xlabel = r'Galactic longitude $\ell$ (deg)'
    ylabel = r'Galactic latitude $b$ (deg)'

    im = ax.imshow(image, origin='lower',
          extent=[l_max, -l_max, -b_max, b_max],
          cmap = color_map)
    fig.colorbar(im, fraction = 0.028, ax = ax)

    ax.set_title(title, fontsize = 'small')
    ax.set_xlabel(xlabel, fontsize = 'small')
    ax.set_ylabel(ylabel, fontsize = 'small')
    fig.savefig(filename + '.png',
                transparent=False,
                bbox_inches='tight',
                overwrite = True)

注意:我删除了文档字符串只是为了让这个答案更容易阅读

可能(可能应该保持一致)对make_image

做同样的事情

您的主要功能将如下所示。

import process_mods as pm

arr1 = pm.create_random_array(0, 100, 10, 12, 5)
arr2 = pm.create_random_array(0, 100, 10, 12, 10)

fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()

pm.make_image_colorbar(arr1, fig1, ax1, 'arr1', 'spectral', 'Array1')
pm.make_image_colorbar(arr2, fig2, ax2, 'arr2', 'spectral', 'Array2')

plt.show()

给出了:

enter image description here enter image description here