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