今天我们来学习下数据可视化,其实在前面的章节中,我们也接触到了一些数据可视化的知识,在分析数据集的时候,有效的可视化图表,可以帮助我们更好的了解数据。
常用的可视化图表
我们常用的图表其实也有很多,比如说文本表格,条形图,饼图等等。下面我就来简单介绍10种常见的图表
散点图
散点图一般是两个变量的二维图表,很适合展示两个变量之间的关系。当然也有三维散点图,不过使用的并不是很多
折线图
折线图可以很好的呈现数据随着时间迁移的变化趋势
直方图
直方图把横坐标等分成一定数量的区间,然后再每个区间内用矩形条展示该区间内的数值,可以很好的查看数据的分布情况
条形图
条形图可以查看数据中不同类别之间的分布请求
盒式图
是由五个数值组成:最大值(max)、最小值(min)、中位数(median)和上下四分位数(Q3,Q1),可以帮助我们分析数据的差异性、离散程度和异常值等信息
饼图
饼图可以很好的呈现每类数据所占总数据的比例情况
热力图
热力图是把数据用矩阵表示的形式,不同数据颜色不同,可以通过颜色直观的判断某个位置上的数值情况
雷达图
可以很好的显示一对多的关系,比如王者荣耀中的对局信息,就是雷达图
地理图表
对于按照不同地理位置区分的数据,使用地理图表可以很直观的呈现数据信息
词云图
词云图是非常好的可视化图表,在分析评论等场景非常常见
视化图表分类
其实,我们也可以根据数据之间的关系,把可视化图表分成如下几类
- 联系
查看多个变量之间的关系,例如:散点图,雷达图
- 比较
比较数据间各类别的关系,例如:条形图
- 趋势
展示数据随时间的变化趋势,例如:折线图
- 构成
各部分占总体的百分比,例如:饼图
- 分布
关注变量的分布情况,例如:直方图
下面有两张图片,很好的概括了不同情况下,该如何选择合适的图表
图片
在以后的工作中,如果遇到可视化工作,又不太确定如何更好的呈现数据,可以来看看上面的图片,也许能找到灵感。
十大图表实例
下面我们就来逐一完成上面的十个图表,看看 Python 带给你的视觉体验。
我们会分别使用 Matplotlib、Seaborn 和 Pyecharts 来完成作图,需要提前下载好对应的库
pip install matplotlib pip install seaborn pip install pyecharts
我们会使用 seaborn 自带的数据集为例子,所以需要导入数据集
import matplotlib.pyplot as plt import seaborn as sns tips = sns.load_dataset("tips") print(tips.head()) >>> total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4
散点图
matplotlib 实现散点图
matplotlib.pyplot.scatter(x, y, c=None, marker=None)
几个重要的参数
x,y:数值坐标
c:点的颜色
marker:标记的符号,可以选择“x”,“>” 或 “o”
seaborn 实现散点图
sns.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None)
x,y:传入的数据间 data 的列的名字
hue:按照列名分组,不同组展示不同颜色
style:按照列名分组,不同分组使用不同的 marker
size:按照列名分组,不同分组符号大小不同
data:传入的数据集
plt.scatter(tips['total_bill'], tips['tip'], c='#bcbd22', marker='x') plt.show() sns.scatterplot(x='total_bill', y='tip', hue='time', style='time', size='time', data=tips) plt.show()
Matplotlib 绘制:
Seaborn 绘制:
两种作图整体分布式类似的,不过 Seaborn 作为 Matplotlib 的更高级 API 实现,可以更加方便的处理数据的分组展示等功能。
pycharts 实现散点图
pyecharts 是基于 echarts 的 Python 实现,同样拥有强大的功能,而且拥有完善的中文文档,这里就不再过多讲解 pyecharts 的用法了。
scatter = Scatter() scatter.add_xaxis(tips['total_bill']) scatter.add_yaxis("小费金额", tips['tip']) scatter.set_global_opts(xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), toolbox_opts=opts.ToolboxOpts(is_show=True) ) scatter.render_notebook() # 在 jupyter notebook 中展示 # scatter.render('scatter.html') # 生成 HTML 文件,可以在浏览器中打开查看
折线图
matplotlib 实现折线图
matplotlib.pyplot.plot(x, y)
x,y:分别是横纵坐标,x 需要是按照大小排序的数组
seaborn 实现折线图
seaborn.lineplot(x=None, y=None, data=None)
关键的参数与散点图十分类似,这里不再赘述
tips_copy = tips.copy() tips_copy.sort_values(by='total_bill', inplace=True) plt.plot(tips_copy['total_bill'], tips_copy['tip']) plt.show() sns.lineplot(x="total_bill", y="tip", data=tips, ) plt.show()
Matplotlib 绘制:
Seaborn 绘制:
可以看到,使用 seaborn 库,x 轴上的元素会自动被排序
pyecharts 实现折线图
from pyecharts.charts import Line line = Line() line.add_xaxis(tips_copy['total_bill']) line.add_yaxis("", tips_copy['tip']) line.render_notebook()
直方图
matplotlib 实现直方图
matplotlib.pyplot.hist(x, bins=None)
x:要输入的一维数组
bins:是直方图中区域的数量
seaborn 实现直方图
seaborn.distplot(a, kde=True)
a:观测数据
kde:是否画估计曲线
import numpy as np x = np.random.randn(100) plt.hist(x, 10) plt.show() sns.distplot(x, 10) plt.show()
Matplotlib 绘制: