数据可视化涉及用视觉表示来探索分析数据。 它与数据挖掘紧密相关,数据挖掘使用代码来探索数据的联系。 数据集可以是只有一行代码的一小段数字,或是以GB为单位的大量数据。
一个优秀的数据图表远不止是一个好看,更重要的时让人看到他不曾注意到的数据的联系。
借助Python的高效性,你可以很快速的看到一个基于数百万个的数据的数据集,当然也不只限于数字。
人们使用Python进行遗传学,气候研究,政治和经济分析等领域的数据密集型工作。
数据科学家用Python编写了一系列令人印象深刻的可视化和分析工具,您也可以使用其中的许多工具。
最受欢迎的工具之一是一个数学绘图库,matplotlib
。
我们将使用matplotlib
制作简单的图,例如折线图和散点图。之后,我们将基于随机游走的概念创建一个更有趣的数据集-从一系列随机决策中生成的可视化效果。
我们还将使用名为Pygal
的程序包,该程序包专注于创建在数字设备上可以正常使用的可视化。
您可以在用户与可视化交互时使用Pygal
来强调和调整元素的大小,并且可以轻松地调整整个的大小以适合小型智能手表或大型显示器。
我们将使用Pygal
探索以各种方式掷骰子时会发生的情况。
安装 matplotlib
pip install matplotlib
对于python开发者而言,安装第三方库已不是什么难事。笔者不在此处赘述。
要查看可以使用matplotlib
进行可视化的种类,请访问http://matplotlib.org/上的示例库。单击图库中的可视化文件时,您可以看到用于生成图的代码。
绘制简单的线图
我们使用matplotlib
绘制一个简单的折线图,然后对其进行自定义以创建我们数据的更直观的可视化。我们将使用平方数序列1,4,9,16,25作为图形的数据。
只需向matplotlib
提供如下所示的数字,剩下的就由matplotlib
完成:
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
代码运行结果:
我们需要导入pyplot
模块,为了在代码中重复输入pyplot
,我们使用别名plt
。
pyplot
包含许多函数帮助生成图表。
在第3行,我们创建一个列表来保存1~5的平方,然后将其传递给plot()
函数。
使用show()
打开matplotlib
的查看器并显示该图。
若您使用python
自带的IDLE
运行该代码,结果及界面如下图所示。查看器允许您缩放和导航图,如果单击磁盘图标,则可以保存所需的任何图图像。
若您使用Pycharm
运行该代码,结果及界面如下图所示。
后续将只展示Pycharm的运行结果图。
更改标签类型和图形粗细
观察上一段代码的运行结果,显示的数字在增加,但标签类型太小,线条太细。
matplotlib
允许您调整可视化的每个功能。
我们将使用一些可用的自定义项来提高该图的可读性,如下所示:
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares, linewidth=5)
# 设置图表标题和轴标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置标签大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
代码运行结果:
第4行,线宽参数linewidth
控制plot()
生成的线的粗细。 第7行的title()
函数设置图表的标题。
在整个代码中反复出现的fontsize
参数控制图表上文本的大小。
使用xlabel()
和ylabel()
函数可以为每个轴设置标题,而函数tick_params()
可以为刻度线设置样式。该行显示的参数(axes = 'both')
会影响x轴和y轴上的刻度线,并将刻度线标签的字体大小设置为14(labelsize = 14)
。
如您在上图中看到的那样,该图更容易阅读:标签类型较大,折线图较粗。
校正图
注意到了吗?在图形末尾,4.0的平方显示为25!让我们改正它。
当给plot()
一个数字列表时,它假定第一个数据点对应于x坐标值0,但我们的第一个点对
应于x值1。
我们可以同时给plot()
x的值和y的值。
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
# 设置图表标题和轴标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置标签大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
代码运行结果:
我们新增了x轴的值,并将input_values
和squares
同时作为参数传给plot()
。
在使用plot()
时,您可以指定许多参数,并使用许多函数来自定义绘图。在本章中,我们将使用更多有趣的数据集来继续探索这些定制功能。
使用散点图绘制和个性化单个点
有时,能够根据某些特征绘制或设置单个点很有用。例如,您可能以一种颜色绘制较小的值,而以另一种颜色绘制较大的值。您还可以绘制带有一组样式选项的大型数据集,然后通过使用不同的选项重新绘制各个点来强调各个点。
要绘制单个点,需使用scatter()
函数。将关注点的单个点(x,y)
值传递给scatter()
,它将绘制这些值:
import matplotlib.pyplot as plt
plt.scatter(2, 4)
plt.show()
绘制了坐标为(2,4)的点。
代码运行结果:
让我们对输出进行设置样式使其更有趣。
我们将添加一个标题,标记轴,并确保所有文本都足够大以供阅读:
import matplotlib.pyplot as plt
plt.scatter(2, 4, s=200)
# Set chart title and label axes.
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# Set size of tick labels.
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
代码运行结果:
在第3行,我们调用scatter()
并使用参数s
来设置点的大小。
用scatter()绘制一系列点
要绘制一系列点,我们可以传递x和y值列表。
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]
plt.scatter(x_values, y_values, s=200)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
代码运行结果:
x_values
列表包含要平方的数字,y_values
包含每个数字的平方。
将这些列表传递到scatter()
时,matplotlib
在绘制每个点时会从每个列表中读取一个值。
要绘制的点是(1,1)
,(2,4)
,(3,9)
,(4,16)
和(5,25)
。
当然,我们可以显示1~1000的平方:
import matplotlib.pyplot as plt
x_values = [i for i in range(1, 1001)]
y_values = [x ** 2 for x in x_values]
plt.scatter(x_values, y_values, s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置轴的范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
代码运行结果:
因为这是一个较大数据集,所以我们使用较小的点大小,并使用第14行的axis()
函数指定每个轴的范围。
axis()
函数需要一个列表作为参数,这个列表需要四个值:x轴的最小值和最大值和y轴的最小值和最大值。
删除数据点轮廓
matplotlib
使您可以在散点图中分别为点着色。
带黑色轮廓的默认蓝色圆点非常适合点不多的图。
但是在绘制许多点时,黑色轮廓会融合在一起。要删除点周围的轮廓,需在调用scatter()
时传递参数edgecolor ='none'
plt.scatter(x_values, y_values, edgecolors='None', s=40)
自定义颜色
要更改点的颜色,请将参数c
赋值要使用的颜色并传递给scatter()
如下所示:
import matplotlib.pyplot as plt
x_values = [i for i in range(1, 1001)]
y_values = [x ** 2 for x in x_values]
plt.scatter(x_values, y_values, c='red', edgecolors='None', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置轴的范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
在第5行添加参数c
并赋值为red
,再次运行程序,就会得到下面的图形。
可以通过以下方式指定颜色:
- 颜色名:如
'red’
,blue
,cyan
,green
,yellow
,magenta
,white
,black
。这八种颜色支持缩写(除了黑色是k, 其他都是首字母) - RGB或RGBA:[0,1] 范围内的三元(RGB) 或 四元(RGBA) 元组, 如:
(0,0,0.8)
- 十六进制字符串:如
#0F0F0F
(RBG) 或#1F2F3F4F
(RGBA) - 浮点字符串:[0,1]范围内的所有数字的字符串,
'0'
为黑色,'1'
为白色,'0.5'
为灰色,从0到1逐渐由黑到白。
使用色彩图
色图是从开始颜色到结束颜色的一系列渐变颜色。
彩色图用于可视化中以强调数据中的图案。
例如,您可以将低值设置为浅色,将高值设置为深色。
pyplot
模块包括一组内置的颜色图。
要使用这些颜色图之一,您需要指定pyplot
应如何为数据集中的每个点分配颜色。
以下是根据每个点的y值为其分配颜色的方法:
import matplotlib.pyplot as plt
x_values = [i for i in range(1, 1001)]
y_values = [x ** 2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='None', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置轴的范围
plt.axis([0, 1100, 0, 1100000])
plt.show()
我们将y_values
列表传递给c
,然后通过cmap
参数告诉pyplot
使用哪个颜色图。
此代码将y值较低的点涂成浅蓝色,将y值较大的点涂成深蓝色。
你可以在http://matplotlib.org/上的pyplot
中查看所有可用的颜色图。转到Examples
,向下滚动到颜色示例,然后单击colormaps_reference
。
自动保存图
如果要让程序将图自动保存到文件中,可以将plt.show()
替换为plt.savefig()
:
import matplotlib.pyplot as plt
x_values = [i for i in range(1, 1001)]
y_values = [x ** 2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='None', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置轴的范围
plt.axis([0, 1100, 0, 1100000])
plt.savefig('squares_plot.png', bbox_inches='tight')
第一个参数是图像的文件名,它将与代码保存在同一目录中。
第二个参数修剪图中多余的空白。如果要在绘图周围留有多余的空格,则可以忽略此参数。