Python pyplot-设置Colormap LogNorm的选项

Python pyplot-设置Colormap LogNorm的选项,python,pandas,matplotlib,Python,Pandas,Matplotlib,我已经为此奋斗了好几个小时了。我正在编写一个用户友好的界面,让我和我的同事可以轻松地对测试数据进行后期处理/分析。因此,该函数是一个美化的plt.scatter()调用,但包含许多选项 我已经能够通过API找到函数之外的大多数可选调用(例如ax.set_xlim)。但是,我真的在为如何选择性地将z轴/颜色贴图放入对数范数而挣扎 我以前的版本只是有10亿个嵌套的if语句,如果调用了z_log,那么 if z_log: im = ax1.scatter(temp[x], temp[y1],

我已经为此奋斗了好几个小时了。我正在编写一个用户友好的界面,让我和我的同事可以轻松地对测试数据进行后期处理/分析。因此,该函数是一个美化的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做更多的研究,并声称成功

你能不能事先添加一个变量,
my_norm=matplotlib.colors.Normalize()
如果z_logg:my_norm=matplotlib.colors.LogNorm()
。然后
ax1.scatter(…,norm=mynorm)
?还要注意,如果
log
有效,您的值必须严格为正值。类似地,从
cmin=None
开始,在调用
scatter
之前可以选择将其设置为一个值。另外,请注意,
cmin
vmin
是非常不同的概念。顺便说一句,哦,天哪,这完全奏效了。。。这样的个人痛苦。。。非常感谢你!关于克莱姆。。。我查看了API,在set_clim函数中只找到了vmin参数。我想您的建议是查询数据范围的最小/最大值并预设vmin/vmax,以便我也可以将其包括在原始调用中?这当然提供了选择性地更改该范围的能力。我将深入了解cmin和vmin之间的区别。再次感谢