整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

数据可视化:使用对数刻度

数据可视化:使用对数刻度


么是对数刻度?

就是在作图之前,先对原始数值做对数计算,在画到坐标轴上。

简单回忆下中学学过的对数函数:log2(x), loge(x)和log10(x)



为什么要使用对数刻度?

回答这个问题之前,先看看,你有没有见过这样的图:

很多数据点,都集中在较小值那一端,看也看不清;而另一端较大数值,却数据点很少、显得很空旷。


原因就是这些数据的分布不均,不在一个数量级。或者说,如果把数值从小到大排序,会发现他们不是等距离的逐渐增加(比如1, 2, 3, ….;等差数列),而是成倍数的增长(比如1, 10, 100, 1000 …;等比数列)


这个时候,使用对数刻度的优点就呈现出来了。

1) 数量级相差太大的数值,也可以放在同一个尺度上呈现。

2) 视觉化上有优势:视觉上相差的距离,有数据意义,代表了相差了多少倍。


现在以[1, 3.16, 10, 31.6, 100]这几个数为例说明这两个优点。


[1, 3.16, 10, 31.6, 100]示例

对数刻度优点:

1) 数量级相差太大的数值,也可以放在同一个尺度上呈现。


比如,对数化之前,这几个数值呈现效果如下:

大部分都集中在左侧一段。



对数化之后(以10为底数,即log10(x)),就可以在图形上均匀分布了。

对数刻度优点:

2) 视觉化上有优势:视觉上相差的距离,有数据意义,代表了相差了多少倍。


在对数刻度的坐标轴上的任意两个点,距离相差多少,就代表这两个值相差多少。这样处理后的数字化呈现,便于理解。

比如下图的1)和2),都代表差了3.16倍;

而下图的3)相差了这个长度的任何两个点都代表相差3.16倍


注意对数刻度坐标轴的正确标注方法。一般有两种:

方法1)直接标真实值,

或者方法2)标记x,然后轴名称加上公式log10(x)。比如下图:


最好使用方法1)。否则数据点代表的真实值是多少,还需要花时间理解、计算。


参考:https://serialmentor.com/dataviz/coordinate-systems-axes.html


真实案例

现在再看一个真实案例:

2007年,各个国家人均GDP(x轴)和寿命(y轴)的关系。


数据点未经处理,直接作图为:

Python plotly作图

因为寿命相差比较平均,但是每个国家GDP则相差较大(最高最低差了两个数量级),可以考虑对数处理。

下图是log10(GPD)后的数据呈现:

处理后的x坐标轴,标记的是其真实值。刻度线分别代表了:300,400,500, …. 1000, 2000, 3000, 4000, 5000, … 10k, 20k, 30k, … 60k…

不出所料,400/300=1.33,500/400=1.25… 所以被标记的刻度线,距离变小,从稀疏逐渐变密集。


活学活用

对数刻度可以用在数据量呈倍数增长的情况下。

聪明的读者,一定想到了最近的疫情扩散情况,极其符合对数刻度作图。

这里借用了《金融时报》数据化专家John Burn-Murdoch的图表。对数化处理后,可以从每个国家的曲线是否还在上升,判断感染速率是否下降,也就是是否出现了疫情拐点。

转载:https://www.shangyexinzhi.com/article/1619223.html


作图工具:Python Plotly

T之家12月9日消息 微软对Chromium开源项目非常感兴趣,因为该项目对Edge和Chrome都有利。微软最新的功能请求之一就是希望通过部署Edge HTML风格的滚动特性从而让Chromium的滚动变得更加灵敏。

微软打算将Impulse样式(即EdgeHTML样式)滚动动画加入到Chromium中,微软已经将该滚动动画移植到了基于Chromium的Edge浏览器的Dev Canary通道中。默认情况下,Edge浏览器中启用了脉冲样式的滚动动画。对于Chrome,该功能可能会在未来几天内出现在试验版浏览器中。

微软表示,Impulse-style (也就是EdgeHTML-style)滚动动画将提供更灵敏的滚动体验,用户启用后鼠标滚轮的每个刻度都试图模仿基于物理的内容,内容会开始快速移动然后逐渐变慢。换句话说,由于开始时的快速加速,该模式会给人一种更灵敏的感觉。

此外微软还在推行另一项称之为“percent-based scrolling”(基于百分比的滚动)的滚动方案,该模式允许浏览器将鼠标滚轮或者键盘滚动解释为预期滚动条的百分比。微软目前正努力将经典版Edge浏览器的优秀特性移植到Chromium平台上,包括这项基于百分比的滚动方式。

:最近在学习CSS3,看到了一个小案例,通过自己的学习,动手实现了它,现在把它分享出来。

钟表效果

实现过程

1.首先我们需要在页面中写出一个静态的钟表效果。首先我们需要一个表盘div wrap 对其进行简单的样式设置,用border-radius属性将其设置成圆形。


<div id="wrap"></div>
 #wrap{width:200px; height:200px; border:2px solid #000; margin:100px auto;border-radius:50%; position:relative;}

2.接下来我们用ul和li来写表盘中的刻度,对其进行简单的样式设置。其中需要注意的是,我们用 -webkit-transform-origin:center 100px;来设置我们的旋转基点。然后利用 -webkit-transform: rotate(0);让我们的li旋转相应的角度形成相应的刻度。

 <ul id="list">
 <li></li> <!--刻度-->
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 <li></li>
 </ul> #wrap ul{margin:0; padding:0; height:200px; position:relative; list-style:none;} #wrap ul li{width:2px; height:6px; background:#000; position:absolute; left:99px; top: 0;-webkit-transform-origin:center 100px;} #wrap ul li:nth-of-type(1){-webkit-transform: rotate(0);} #wrap ul li:nth-of-type(2){-webkit-transform: rotate(6deg);} #wrap ul li:nth-of-type(3){-webkit-transform: rotate(12deg);} 
 #wrap ul li:nth-of-type(4){-webkit-transform: rotate(18deg);} #wrap ul li:nth-of-type(5){-webkit-transform: rotate(24deg);} #wrap ul li:nth-of-type(6){-webkit-transform: rotate(30deg);} #wrap ul li:nth-of-type(7){-webkit-transform: rotate(36deg);} #wrap ul li:nth-of-type(8){-webkit-transform: rotate(42deg);} #wrap ul li:nth-of-type(5n+1){ height:12px;}

3.其中我们设计到了css3的选择器nth-of-type() ,它规定其属于其父元素的第几个li元素。

当然,我们不可能将表盘的刻度都统统去设置li的样式去完成。我们后面需要用js去渲染它。

在渲染之前,我们需要去写上我们的秒针、分针、时针。分别是div hour、min、sec,并且我们对其进行样式的设置。为了美化一下,我们再写一个div icon,圆点。并对其进行简单样式设置。

 <div id="hour"></div>
 <div id="min"></div>
 <div id="sec"></div>
 <div class="icon"></div>
 #hour{width:6px; height:45px; background:#000; position:absolute; left:97px; top:55px;-webkit-transform-origin:bottom ;}
 #min{width:4px; height:65px; background:#999; position:absolute; left:98px; top:35px;-webkit-transform-origin:bottom ;}
 #sec{width:2px; height:80px; background:red; position:absolute; left:99px; top:20px;-webkit-transform-origin:bottom ;}
 .icon{width:20px; height:20px; background:#000; border-radius:50%; position:absolute; left:90px; top: 90px;}

4.接下来我们来写一下让钟表动起来的JavaScript,首先用js去获取各个div。

 var oList=document.getElementById("list");//获取到刻度
 var oCss=document.getElementById("css"); var oHour=document.getElementById("hour");//获取时针
 var oMin=document.getElementById("min");//获取分针
 var oSec=document.getElementById("sec");//获取秒针
 var oLi=""; var sCss="";

5.接下来去渲染表盘的刻度。

 for (var i=0;i<60;i++) { //一个表盘总共是60个刻度
 sCss+="#wrap ul li:nth-of-type("+(i+1)+"){-webkit-transform: rotate("+i*6+"deg);}";
 oLi+="<li></li>";
 };
 oList.innerHTML=oLi;
 oCss.innerHTML+=sCss;//表盘刻度渲染完成

6.接下来我们去写一个钟表表针根据时间变动的函数,先利用new Date()获取时间,然后通过去改变表针的样式去让表针根据时间去转动,秒针一秒相当于旋转6度,分钟一秒相当转动6度,时针转动1秒相当于转动30度。

function toTime(){ var oDate=new Date();//获取当前时间
 var iSec=oDate.getSeconds();//获取当前秒
 var iMin=oDate.getMinutes()+iSec/60;//获取当前分
 var iHour=oDate.getHours()+iMin/60;//获取当前时
 oSec.style.WebkitTransform="rotate("+iSec*6+"deg)";//秒针转动角度1秒6度 (表盘一圈360度一圈60秒所以一秒6度)
 oMin.style.WebkitTransform="rotate("+iMin*6+"deg)";//分钟转动角度1分6度 (表盘一圈360度一圈60分所以一分6度)
 oHour.style.WebkitTransform="rotate("+iHour*30+"deg)";//时针转动角度一小时30度(表盘一圈360度一圈12小时所以一小时30度)
 };

7.最后我们来开一个定时器,让函数隔一秒执行一次。

 toTime();
 setInterval(toTime,1000);

至此一个钟表效果就写完了,下面是全部源代码

效果源码