学习数据可视化案例. 包括:
- matplotlib
- Pygal
- json
- datetime
- csv处理
- API
- requests
数据可视化: 通过可视化表示来探索数据, 它与数据挖掘紧密相关, 数据挖掘指的是使用代码来探索数据集的规律和关联. 漂亮的呈现数据关乎的并非仅仅是漂亮的图片. 以引人注目的简洁方式呈现数据, 然观看者能够明白其中含义, 发现数据集中原本未意识到的规律和意义. 数据可视化最流行的工具之一就是matplotlib, 它是一个数学绘图库, 用它来制作简单的图表, 如折线图和散点图. 然后, 基于随机漫步概念, 根据一系列决策生成图表.
使用Pygal包, 它专注于生成适合在数字设备上显示的图表. 通过Pygal, 可在用户与图表交互时突出元素及调整其大小, 还可轻松调整整个图表尺寸, 使其适合在微型智能手表或巨型显示器上显示. 我们使用Pygal以各种方式探索掷色子的结果.
绘制简单折线图, 再对其进行定制, 以实现信息更丰富的数据可视化. 使用平方数序列1/4/9/16/25来绘制图表.
见mpl_squares.py
- 导入
matplotlib.pyplot
为plt
plt.plot()
根据数据绘制有意义的图形plt.show()
打开 matplotlib 查看器, 并显示绘制的图形.
上图: 标签文字太小, 线条太细. 通过一些定制来改善图形可读性.
见mpl_squares.py
发现没有正确地绘制数据: 4的平方时25. 下面修复该问题.
当向plot()提供数字时, 它假设第一个数据点对应的x坐标值为0, 但我们的应该为1. 这种情况, 可以给plot()
提供输入值和输出值.
见mpl_squares.py
有时候, 需要绘制散点图并设置各个数据点的样式.
要绘制单个点, 可使用函数scatter()
, 并向它传递一对x和y坐标, 它将在指定位置绘制一个点.
见scatter_squares.py
要绘制一系列的点, 可向 scatter()
传递两个分别包含x和y的列表.
见scatter_squares.py
绘制1000个点的代码, 让Python自动循环计算.
见scatter_squares.py
matplotlib 允许你给散点图的个个点指定颜色. 默认为:蓝色点和黑色轮廓. 绘制很多点时, 黑色轮廓会粘连在一起.
要删除数据点的轮廓, 可以在调用 scatter()
时传递实参edgecolor='none'
2.0 之后的版本, edgecolor默认为'none'
修改数据点颜色, 可以向scatter()
传递参数c, 并将其设置为要使用的颜色名称.
还可以使用RGB颜色自定义颜色. 要指定自定义颜色, 向参数c传递一个元组, 包含3个0-1的小数值, 分别表示红色, 绿色, 蓝色分量.
值越接近0, 指定颜色越深, 值越接近1, 指定颜色越浅.
*颜色映射(colormap)*是一系列颜色, 从起始颜色渐变到结束颜色. 在可视化中, 颜色映射用于突出数据的规律.
见scatter_squares.py
要了解
pyplot
中的所有颜色映射, 访问官网, 单击Examples, 向下滚动到Color Examples, 再单击colormaps_reference.
要让程序自动将图表保存到文件中, 可将对plt.show()
的调用替换为对plt.savafig()
的调用.
使用Python来生成随机漫步数据, 再使用matplotlib 将数据呈现出来. 随机漫步: 这样行走的路径, 每次行走完全是随机的, 没有明确的方向, 结果是由一系列随机决策决定的. 在自然界/物理学/生物学/化学/经济领域, 随机漫步都有实际用途. 如: 漂浮在水滴上的花粉因不断受水分子的挤压而在水面上移动. 水滴中的分子运动是随机的, 因此 花粉在水面上的运动路径犹如随机漫步.
为做出随机决策, 将所有可能的选择都存储在一个列表中, 并在每次做决策时都使用choice()
来决定使用哪种选择.
将随机漫步包含的默认点数设置为5000.
见random_walk.py
见random_walk.py
建立一个循环, 该循环不断运行, 直到漫步包含所需数量的点. 方法决策:
- 向左还是向右? 走多远?
- 向上还是向下? 走多远?
使用choice([-1, 1])指定方向, 使用
choice([0, 1, 2, 3, 4])`指定走多远. (通过包含0, 不仅能沿2个轴移动, 还能够沿一个轴移动)
如果x_step
和y_step
都为0, 意味着原地踏步, 拒绝这样的情况, 接着执行下一次循环.
为获取漫步中下一个点的x值, 将x_step
与x_values
中的最后一个值相加. 并把计算的值附加到列表的末尾.
见rw_visual.py
- 创建RandomWalk实例
- 调用fill_walk()
- 将x y 值传递给
scatter()
, 并选择合适的点的尺寸.
见rw_visual.py
本节将定制图表, 以突出每次漫步的重要特征, 并让分散注意力的元素不那么明显. 为此, 确定要突出的元素, 如漫步的起点/终点/经过的路径. 接下来要确定使其不那么显眼的元素, 如刻度标记和标签. 最终的结果是简单的可视化表示, 清楚地指出每次漫步经过的路径.
使用颜色映射来指出漫步中个点的先后顺序.
见rw_visual.py
在绘制随机漫步图后重新绘制起点和终点. 让起点和终点变得更大, 并显示为不同的颜色.
见rw_visual.py
见rw_visual.py
增加点数, 以提供更多数据.
见rw_visual.py
让绘图窗口更适合屏幕大小.
见rw_visual.py
figure()
用于指定图表的宽度/高度/分辨率/背景色. 给形参figsize一个元组, 指出绘图窗口尺寸, 单位为英寸.
Python假定屏幕分辨率为100像素/英寸. 可使用形参dpi向figure()
传递分辨率.
本节中, 使用Python可视化包 Pygal 来生成可所犯的矢量图形文件. 对于需要在尺寸不同的屏幕上展示的图表很有用, 因为它们将自动缩放, 以适合观看者的屏幕. 如果打算以在线方式使用图表, 考虑使用 Pygal 来生成, 这样它们在任何设备上显示都很美观.
掷色子, 2个, 某些点数可能性将比其他点数打. 为确定哪些点数出现的可能性最大, 将生成一个表示掷色子结果的数据集, 并根据结果绘制图形. 在数学领域, 使用掷色子来解释各种数据分析, 在赌场和游戏中也有实际应用.
见die.py
见die_visual.py
为分析掷6面骰子的结果, 计算每个点数的出现次数
见die_visual.py
见die_visual.py
见die_visual.py
创建一个6面和10面的骰子. 掷50000次.
见different_dice.py
使用matplotlib 可视化模拟掷骰子; 使用Pygal 可视化模拟随机漫步.
- 如何生成数据集
- 如何对其可视化
- 如何使用matplotlib创建简单图表
- 如何使用散点图探索随机漫步过程
- 如何使用Pygal创建直方图
- 如何使用直方图展示掷骰子结果
尝试对网上的各类图表进行code
从网上下载数据, 并对数据可视化. 格式: csv和json. 使用Python模块csv来处理CSV格式的天气数据, 找出2个区域的最高和最低温度. 然后使用matplotlib根据下载的数据创建图表, 展示2个不同区域的气温变化. 在本章后面, 使用模块json来访问以JSON格式存储人口数据, 并使用Pygal绘制一幅按国别划分的人口地图.
2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195
CSV程序可以轻松地提取并处理其中的值, 有助于加快数据分析过程.
见high_lows.py
调用csv.reader()
, 将前面存储的文件对象作为实参传递给它, 从而创建一个与该文件相关联的阅读器(reader)对象.
调用next()
并将阅读器对象传递给它时, 返回文件中的下一行. 因为只调用了next()
一次, 因此得到的是第一行, 其中包含文件头.
reader处理文件中以都好分隔的第一行数据, 并将每项数据都作为一个元素存储在列表中.
见high_lows.py
从中可知道, 日期和最高气温分别存储在第0列和第1列. 为研究这些数据, 将处理csv中的每行数据, 并提取索引为0和1的值.
首先读取每天的最高气温
见high_lows.py
创建空列表, 再遍历文件中余下的各行. 阅读器从其停留的地方继续往下读取csv文件, 每次都自动返回当前所处位置的下一行. 每次执行该循环时, 都将索引(第1列)的数据附加到highs末尾. 下面使用int()将这些字符串转换为数字.
见high_lows.py
下面来对这些数据进行可视化.
为可视化这些气温数据, 首先使用 matplotlib 创建一个显示每日最高气温的简单图形
见high_lows.py
将字符串*'2014-7-1'*转换为一个表示相应日期的对象. 使用datetime.strptime()
In[2]: from datetime import datetime
In[3]: first_date = datetime.strptime('2014-7-1', '%Y-%m-%d')
In[4]: print(first_date)
2014-07-01 00:00:00
模块datetime中设置日期和时间格式的实参:
- %A: 星期, 如 Monday
- %B: 月份, 如 January
- %m: 月份, (01-12)
- %d: 日期,(01-31)
- %Y: 四位年份, 如2015
- %y: 两位年份, 如15
- %H: 24进制小时(00-23)
- %I: 12进制小时(01-12)
- %p: am或pm
- %M: 分钟数(00-59)
- %S: 秒数(00-61)
见high_lows.py
见high_lows.py
再添加最低气温的数据.
见high_lows.py
见high_lows.py
实参alpha指定颜色的透明度. alpha值为0表示完全透明, 1(默认设置)表示完全不透明.
向fill_between()
传递一个x值系列: 列表dates, 还传递2个y值系列: highs和lows. 实参facecolor
指定填充区域的颜色.
但有些气象站会偶尔出现故障, 未能收集部分或全部其应该收集的数据. 缺失数据可能会引发异常. 比如没有某一天的最高气温, 字符串为空. 为解决该问题, 在从CSV文件中读取值时执行错误检查代码, 对分析数据集时可能出现的异常进行处理.
见high_lows.py
尝试提取日期/最高/最低气温. 只要缺失其中一项数据, Python就会引发ValueError异常. 如果没有发生错误, 将运行else代码块, 并将数据附加到相应列表末尾. 在有些情况下, 需要使用continue来跳过一些数据, 或者使用remove()或del将已提取的数据删除.
生成一些图表, 对你好奇的任何地方的其他天气数据进行研究.
在本节中, 下载JSON格式的人口数据, 使用json模块来处理. Pygal提供了一个地图创建工具, 可以使用它来对人口数据可视化.
Open Knowledge Foundation提供了大量可以免费使用的数据集
见world_population.py
见world_population.py