pyplot选项用于设置Colormap LogNorm

2024-05-05 16:50:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为此奋斗了好几个小时了。我正在编写一个用户友好的界面,让我和我的同事可以轻松地对测试数据进行后期处理/分析。因此,该函数是一个美化的plt.scatter()调用,但包含许多选项

我已经能够通过API找到函数之外的大多数可选调用(例如ax.set_xlim)。但是,我真的在为如何选择性地将z轴/颜色贴图放入对数范数而挣扎

我以前的版本只是有10亿个嵌套的if语句,如果调用z_log,那么

if z_log:
    im = ax1.scatter(temp[x], temp[y1], c=temp[z1], norm=matplotlib.colors.LogNorm(), vmin=z_range[0], vmax=z_range[1], cmap="jet")

但是,我正在尝试清理这个问题,并避免使用大量嵌套的if语句(还有,我添加的所有内容,函数调用的数量加倍,啊)。我已经能够从主函数调用中删除大部分colormap内容

    if z:
        cbar = fig.colorbar(im, ax=ax1, label=z)
        im.set_cmap('jet')
        if z_range:
            im.set_clim(z_range[0], z_range[1])

但我不能让LogNorm工作。我正在努力

        if z_log:
            im.set_norm(matplotlib.colors.LogNorm())

这给了我一个很长的回溯。。有一次提到被零除。通常情况下,我会说这是绘制日志的问题,但是1)我过滤数据以排除任何负面信息,2)如果我将原始语句添加到函数调用...scatter(... norm=matplotlib.colors.LogNorm()...),那么它工作得很好

我尝试在LogNorm调用中为vmin/vmax添加可选参数,但没有任何效果

有什么建议吗

更新: 预先定义规范化方法似乎是可行的,但现在我仍停留在设置z刻度范围上。基于这些注释,我成功地添加了一个标志,以启用/禁用颜色条的对数打印

建议我不要使用clim,而是在原始scatter()调用中使用vlim来设置范围。我认为做一个类似的方法,“预先填充”值,然后总是包含它会起作用。代码如下

    # Find colormap min/max range. 
    my_vmin, my_vmax = 0.0, 0.0
    if z:
        my_vmin = temp[z].min
        my_vmin = temp[z].max
        if z_range:
            my_vmin = z_range[0]
            my_vmax = z_range[1]

    if isinstance(y1, list):
        for i in range(len(y1)):
            if z: c = temp[z]
            else: c = colors[i]
            im = ax1.scatter(temp[x], temp[y1[i]], label=y1[i], c=c, norm=my_norm, vmin=my_vmin, vmax=my_vmax)

现在,如果我真的要求根据数据给标记上色,这会非常有效。但是,如果我尝试使用常量,它会抱怨

如果我从函数调用中删除vmin/vmax并依赖set_clim()。。。它看起来确实符合我的期望(即,我希望标记颜色和颜色栏都能根据我的输入进行缩放)。。。我可能会对clim和vlim做更多的研究,并宣称成功


Tags: normif颜色myrangetempcolors函数调用