数据分析入门系列教程-常用图表
作者:周萝卜
来源:萝卜大杂烩
今天我们来学习下数据可视化,其实在前面的章节中,我们也接触到了一些数据可视化的知识,在分析数据集的时候,有效的可视化图表,可以帮助我们更好的了解数据。
常用的可视化图表
我们常用的图表其实也有很多,比如说文本表格,条形图,饼图等等。下面我就来简单介绍10种常见的图表
散点图
散点图一般是两个变量的二维图表,很适合展示两个变量之间的关系。当然也有三维散点图,不过使用的并不是很多
折线图
折线图可以很好的呈现数据随着时间迁移的变化趋势
直方图
直方图把横坐标等分成一定数量的区间,然后再每个区间内用矩形条展示该区间内的数值,可以很好的查看数据的分布情况
条形图
条形图可以查看数据中不同类别之间的分布请求
盒式图
是由五个数值组成:最大值(max)、最小值(min)、中位数(median)和上下四分位数(Q3,Q1),可以帮助我们分析数据的差异性、离散程度和异常值等信息
饼图
饼图可以很好的呈现每类数据所占总数据的比例情况
热力图
热力图是把数据用矩阵表示的形式,不同数据颜色不同,可以通过颜色直观的判断某个位置上的数值情况
雷达图
可以很好的显示一对多的关系,比如王者荣耀中的对局信息,就是雷达图
地理图表
对于按照不同地理位置区分的数据,使用地理图表可以很直观的呈现数据信息
词云图
词云图是非常好的可视化图表,在分析评论等场景非常常见
视化图表分类
其实,我们也可以根据数据之间的关系,把可视化图表分成如下几类
联系
查看多个变量之间的关系,例如:散点图,雷达图
比较
比较数据间各类别的关系,例如:条形图
趋势
展示数据随时间的变化趋势,例如:折线图
构成
各部分占总体的百分比,例如:饼图
分布
关注变量的分布情况,例如:直方图
下面有两张图片,很好的概括了不同情况下,该如何选择合适的图表
在以后的工作中,如果遇到可视化工作,又不太确定如何更好的呈现数据,可以来看看上面的图片,也许能找到灵感。
十大图表实例
下面我们就来逐一完成上面的十个图表,看看 Python 带给你的视觉体验。
我们会分别使用 Matplotlib、Seaborn 和 Pyecharts 来完成作图,需要提前下载好对应的库
pip install matplotlib
pip install seaborn
pip install pyecharts
我们会使用 seaborn 自带的数据集为例子,所以需要导入数据集
import matplotlib.pyplot as pltimport seaborn as snstips = sns.load_dataset('tips')print(tips.head())>>> total_bill tip sex smoker day time size0 16.99 1.01 Female No Sun Dinner 21 10.34 1.66 Male No Sun Dinner 32 21.01 3.50 Male No Sun Dinner 33 23.68 3.31 Male No Sun Dinner 24 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 Lineline = 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 绘制:
Seaborn 绘制:
Pyecharts(echarts) 并没有专门的直方图方法。
条形图
matplotlib 实现条形图
matplotlib.pyplot.bar(x, height, width=0.8)
x:x 轴的坐标值
height:y 轴的坐标值
width:条形的宽度
seaborn 实现条形图
seaborn.barplot(x=None, y=None, hue=None, data=None)
x,y,hue:分别是两个坐标轴的名称和图例名称
data:传入的数据
new_tips = tips.groupby('day').mean()plt.bar(new_tips.index.values.tolist(), new_tips['total_bill'].values.tolist(), width=0.5)plt.show()sns.barplot(x='day', y='total_bill', hue='sex', data=tips)plt.show()
Matplotlib 绘制:
Seaborn 绘制:
可以看到,Seaborn 可以进行方便的分组绘制。
pyecharts 实现条形图
from pyecharts.charts import Barbar = Bar()
bar.add_xaxis(new_tips.index.values.tolist())
bar.add_yaxis('', new_tips['total_bill'].values.tolist())
bar.render_notebook()
盒式图
matplotlib 实现盒式图(箱形图)
matplotlib.pyplot.boxplot(x, notch=None, label=None)
x:需要传入的数据
notch:为是否展示带有缺口的箱形
label:可以设置标签
seaborn 实现盒式图
seaborn.boxplot(x=None, y=None, hue=None, data=None)
plt.boxplot(tips['total_bill'], notch=True)plt.show()sns.boxplot(x=tips['day'], y='total_bill', data=tips)plt.show()
Matplotlib 绘制:
Seaborn 绘制:
Pyecharts 对于盒式图支持的并不友好,不推荐使用,这里只给出官网例子
from pyecharts.charts import Boxplot
v1 = [
[850, 740, 900, 1070, 930, 850, 950, 980, 980, 880]
+ [1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
[960, 940, 960, 940, 880, 800, 850, 880, 900]
+ [840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
]
box = Boxplot()
box.add_xaxis(['expr1'])
box.add_yaxis('', box.prepare_data(v1))
box.render_notebook()
饼图
matplotlib 实现饼图
matplotlib.pyplot.pie(x, explode=None, labels=None)
x:需要用到的数据
explode:扇形偏移量
labels:扇形的标签
seaborn 并未提供饼图的高级 API
sizes = [17, 32, 44, 10]
labels = ['cat', 'dog', 'fox', 'tiger']
explode = (0, 0.1, 0, 0)
plt.pie(sizes, labels=labels, explode=explode)
plt.show()
pyecharts 实现饼图
from pyecharts.charts import Piemylist = [list(z) for z in zip(labels, sizes)]pie = Pie()pie.add('', mylist)pie.render_notebook()
热力图
对于热力图,一般使用 Seaborn 提供的更加高级的 API 来实现
seaborn.heatmap(data)
data:DataFrame 类型数据即可
flights = sns.load_dataset('flights')flights_new = flights.pivot(index='month', columns='year', values='passengers')sns.heatmap(flights_new)plt.show()
pyecharts 实现热力图
x = flights_new.columns.values.tolist()
y = flights_new.index.values.tolist()
value = flights_new.values.tolist()L = []
i = j = 0
for inner_list in value:
for v in inner_list:
L.append([i, j, v])
j += 1
i += 1
j = 0
from pyecharts.charts import HeatMap
from pyecharts import options as opts
heatmap = HeatMap()
heatmap.add_xaxis(x)
heatmap.add_yaxis('', y, L)
heatmap.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=650, min_=90)
)
heatmap.render_notebook()
雷达图
Matplotlib 和 Seaborn 都没有直接提供雷达图的 API,我们需要手动实现一个
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontProperties # 数据准备labels=np.array([u' 推进 ','KDA',u' 生存 ',u' 团战 ',u' 发育 ',u' 输出 '])stats=[83, 61, 95, 67, 76, 88]# 画图数据准备,角度、状态值angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)stats=np.concatenate((stats,[stats[0]]))angles=np.concatenate((angles,[angles[0]]))# 用 Matplotlib 画蜘蛛图fig = plt.figure()ax = fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2)ax.fill(angles, stats, alpha=0.25)# 设置中文字体font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf', size=14) ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)plt.show()
plt.figure 相当于是创建一个画板,add_subplot 就是将画板划分,然后再通过 plot 和 fill 作画
pyecharts 实现雷达图
from pyecharts.charts import Radar
ability = [[83, 61, 95, 67, 76, 88]]
radar = Radar()
radar.add_schema(
schema=[
opts.RadarIndicatorItem(name='推进', max_=100),
opts.RadarIndicatorItem(name='KDA', max_=100),
opts.RadarIndicatorItem(name='生存', max_=100),
opts.RadarIndicatorItem(name='团战', max_=100),
opts.RadarIndicatorItem(name='发育', max_=100),
opts.RadarIndicatorItem(name='输出', max_=100),
]
)
radar.add('', ability)
radar.render_notebook()
地理图表
对于需要展示地理分布的数据,使用地图分布图表是非常方便的,echarts 提供了好好的支持,因此我们也可以使用 pyecharts 的高级 API 来制作地理图表
from pyecharts.charts import Geoprovinces = ['广东', '北京', '上海', '江西', '湖南', '浙江', '江苏']values = [120, 96, 72, 97, 54, 138, 97]geo = Geo()geo.add_schema(maptype='china')geo.add('', [list(z) for z in zip(provinces, values)])geo.render_notebook()
只需要传入一个列表,列表里包含省份名称和对应省份的数值。这个数值就是具体的业务数据,比如可以是该省份的产值,高校数量,人口总数等等。
词云图
from pyecharts.charts import WordCloud
words = [
('开心', 1000),
('伤心', 4002),
('吃饭', 5008),
('上课', 3000),
('工作', 5980),
('学习', 2357),
('算法', 5300),
('Python', 3478),
('入门', 2300),
('同学', 4000),
('出发', 5378),
('java', 6700),
('Linux', 1000),
('教学', 2198),
('公司', 4570),
('政府', 1000),
('同事', 4350),
('朋友', 3444),
('家人', 1000),
('亲人', 4300),
('城市', 2000),
]
wordcloud = WordCloud()
wordcloud.add('', words)
wordcloud.render_notebook()
同样是传入列表,包含需要展示的词语和该词语对应的频度,该频度也会决定词语的大小。
相信大家通过上面10个图表的学习,已经能够基本掌握 Python 可视化的知识了。你也应该发现,在数据分析的过程中,大多数情况下使用 Seaborn 是比较方便的,它可以很好的结合 DataFrame 数据类型,而在最后的数据展示时,使用 Pyecharts(echarts)则是很好的选择,它涵盖了非常强大的 API,可以对生成的图表再做后续的操作,当然 Matplotlib 是最为基础,也是最为强大的工具,在实际的工作中,需要好好衡量,选择最适合的工具来做可视化的工作。
总结
今天我们一起学习了常用的可视化图表以及如何制作相关图表。对于 Matplotlib、Seaborn 和 Pyecharts 工具包的使用一定要熟练的掌握,在数据分析的过程中会经常使用。同时还要知道,Seaborn 是基于 Matplotlib 的更加高级的可视化库,类似于 NumPy 和 Pandas 的关系。
同时我们还按照数据之间的关系,划分了不同类型的图表,希望能够在未来帮助你更好的选择图表。当然对于单分类和多分类数据,也可以使用组合图表来进行可视化处理。这三个工具包的官方文档都是非常好的学习工具,希望大家能够在后面的学习中好好利用,多加探索。
练习题
其实 Seaborn 自带了很多好玩的数据集,比如我们用到的 tips 和 flights 数据集,还有 car_crashes 数据集,是一个关于车祸的数据集,那么你能够使用该数据集,做一些探索吗,看看可以制作出哪些好玩的可视化图表?