如何用matlab做一个指数分布的colorbar

colorbar想改成指数分布的形式。

其实很简单,用以下的代码试一试一般就能实现。

set(gca,'ColorScale','log')

但好巧不巧的是,数据中有正也有负。

一旦在负数里面用了这个,数据分布就完全不对!

因此,我们要考虑如何在正数和负数都存在的情况下,做一个指数分布的colorbar!

经过博主百般搜索,最终敲定了一个方法,就是自己把数据先log一下。

那么问题来了,负数如何log呢?

如果把负数当成正数一样处理,那么正数又该如何log呢?

而且,靠近0的数据,是无穷大和无穷小,是无法处理的范围!

终于,在绞尽脑汁之后!

发现可以采用如下的方式:

1.查看和限定数据范围。我的数据是分布在[-1,1]之间,我想要查看的结果,只要数据在[-1,-1E-6]以及[1E-6,1]这个范围,从而避开了无限这个问题!

2.把负数和正数当做是一个范围,这个范围整体向正轴移动,也就是说,大家一起放大!这个放大系数根据你的数据特性来!

尽力了的示意图 

3.放大后,你的数据就都是正数了!就用传统的方法搞一搞,改一下ticks就ok了!

所以我分享的代码如下:

function [logdata] =neglog(data)
    fudge_zero = 1E-7;
    
    %正数,放大系数为1E14
    data(data>fudge_zero)=log10(data(data>fudge_zero)*1E14);

    %中间数值0的移动
    data(data<=fudge_zero & data>=-fudge_zero) = 7;

    %负数
    data(data<-fudge_zero)=sign(data(data<-fudge_zero)).*log10(abs(data(data<-fudge_zero)));

        
    logdata = data;
end

今天就到这!纯记录!

共勉!

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值