异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

使用正确的图表理解数据(一):理解对数图

异步社区2018-12-27 10:56
7.1简介


在本章中,我们将更多注意力放在展现的数据所表达的含义上,以及如何通过图表把它有效地表达出来。我们将展示一些新的技术和图表,当知道想要传达给用户什么信息后,我们对这些图表的理解会更深刻。有这样的一个问题:“为什么要以这种方式展示数据?”这在数据探索阶段是最重要的一个问题。如果没能很好地理解数据就把它以某种形式展示出来,那么毫无疑问,读者也将难以正确地理解这些数据。


7.2理解对数图

很多情况下,在读日报及类似的文章时,人们常常发现媒体机构用图表歪曲了事实。一个常见的例子是用线性标度来创建所谓的恐慌图。图表中有一个在很长一段时间(若干年)内持续增长的值,其起始值要比最新的值小好几个量级。然而在正确的可视化时,这些值可以(并且通常应该)用线形图或者近似线性的图表表示,把它们要强调的一些恐慌因素忽略。


7.2.1 准备工作
使用对数标度时,连续值的比例是常量。这在读对数图表时是非常重要的。使用线性(算术)标度时,连续值之间的距离是常量。换句话说,对数图表按数量级顺序有一个常量的距离。这在接下来的图表中可以看到,生成图表的代码在后面也会解释。


根据一般经验,遇到以下情况应该使用对数标度。
¡当要展示的数据的值跨越好几个量级时。
¡当要展示的数据有朝向大值(一些数据点比其他数据大很多)的倾斜度时。
¡当要展示变化率(增长率),而不是值的变化时。


不要盲目地遵循这些规则,它们更像是指导,而不是规则,要始终依靠你自己对于手头的数据和项目,或者客户对你提出的需求作判断。根据数据范围的不同,我们应该使用不同的对数底。对数的标准底是10,但是如果数据范围比较小,以2为底数会好一些,因为其会在一个较小的数据范围下有更多的分辨率。


如果有适合在对数标度上显示的数据范围,我们会注意到,以前非常靠近而难以判断差异的值现在很好地区分开了。这让我们很容易读懂原来在线性标度下难以理解的数据。对于长时间范围的数据的增长率图表,我们想看的不是在时间点所测量的绝对值,而是其在时间上的增长。虽然我们仍可以得到绝对值信息,但是这些信息的优先级较低。再者,如果数据分布存在一个正偏态,例如工资,取值(工资)的对数能让数据更合乎模型,因为对数变换能提供一个更加正常的数据分布。


7.2.2 操作步骤
我们将用一段代码来证明上面所述的内容。这段代码用不同的标度(线性和对数)在两个不同的图表中显示了两个相同的数据集合(一个线性的,一个对数的)。我们将借助后面的代码实现下面的步骤。
(1)生成两个简单的数据集合:指数/对数y和线性z。
(2)创建一个包含4个子区的图形。
(3)创建两个包含数据集合y的子区:一个为对数标度,一个为线性标度。
(4)创建两个包含数据集合z的子区:一个为对数标度,一个为线性标度。


代码如下:
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(1, 10)
y = [10 ** el for el in x]
z = [2 * el for el in x]
fig = plt.figure(figsize=(10, 8))
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(x, y, color='blue')
ax1.set_yscale('log')
ax1.set_title(r'Logarithmic plot of $ {10}^{x} $ ')
ax1.set_ylabel(r'$ {y} = {10}^{x} $')
plt.grid(b=True, which='both', axis='both')
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(x, y, color='red')
ax2.set_yscale('linear')
ax2.set_title(r'Linear plot of $ {10}^{x} $ ')
ax2.set_ylabel(r'$ {y} = {10}^{x} $')
plt.grid(b=True, which='both', axis='both')
ax3 = fig.add_subplot(2, 2, 3)
ax3.plot(x, z, color='green')
ax3.set_yscale('log')
ax3.set_title(r'Logarithmic plot of $ {2}*{x} $ ')
ax3.set_ylabel(r'$ {y} = {2}*{x} $')
plt.grid(b=True, which='both', axis='both')
ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(x, z, color='magenta')
ax4.set_yscale('linear')
ax4.set_title(r'Linear plot of $ {2}*{x} $ ')
ax4.set_ylabel(r'$ {y} = {2}*{x} $')
plt.grid(b=True, which='both', axis='both')
plt.show()


代码将生成图7-1所示的图表。



7.2.3 工作原理
我们生成一些样本数据和两个相关的变量:y和z。变量y被表示为数据x的指数函数,变量z是x的简单线性函数。这展示了线性图表和指数图表的区别。


然后创建4个子区,上面一行子区是关于数据(x,y)的,下面一行子区是关于数据(x,z)的。


从左手边看,y轴列为对数标度;从右手边看,y轴列为线性标度。通过set_yscale('log')分别对每一个坐标轴进行设置。


我们为每一个子区设置标题和标签,标签描述了所绘制的函数。


通过plt.grid(b=True, which='both', axis='both'),我们为每个图的两个坐标轴和主次刻度打开网格显示。我们观察到,在线性图表中线性函数是直线,在对数图表中对数函数也是直线。


原文网址:       https://www.epubit.com/book/detail/21642
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。