数据分析入门系列教程-常用图表

简介: 今天我们来学习下数据可视化,其实在前面的章节中,我们也接触到了一些数据可视化的知识,在分析数据集的时候,有效的可视化图表,可以帮助我们更好的了解数据。

常用的可视化图表


我们常用的图表其实也有很多,比如说文本表格,条形图,饼图等等。下面我就来简单介绍10种常见的图表

散点图

散点图一般是两个变量的二维图表,很适合展示两个变量之间的关系。当然也有三维散点图,不过使用的并不是很多

折线图

折线图可以很好的呈现数据随着时间迁移的变化趋势

直方图

直方图把横坐标等分成一定数量的区间,然后再每个区间内用矩形条展示该区间内的数值,可以很好的查看数据的分布情况

条形图

条形图可以查看数据中不同类别之间的分布请求

盒式图

是由五个数值组成:最大值(max)、最小值(min)、中位数(median)和上下四分位数(Q3,Q1),可以帮助我们分析数据的差异性、离散程度和异常值等信息

image.png

饼图

饼图可以很好的呈现每类数据所占总数据的比例情况

热力图

热力图是把数据用矩阵表示的形式,不同数据颜色不同,可以通过颜色直观的判断某个位置上的数值情况

雷达图

可以很好的显示一对多的关系,比如王者荣耀中的对局信息,就是雷达图

地理图表

对于按照不同地理位置区分的数据,使用地理图表可以很直观的呈现数据信息

词云图

词云图是非常好的可视化图表,在分析评论等场景非常常见


视化图表分类


其实,我们也可以根据数据之间的关系,把可视化图表分成如下几类

  1. 联系

查看多个变量之间的关系,例如:散点图,雷达图

  1. 比较

比较数据间各类别的关系,例如:条形图

  1. 趋势

展示数据随时间的变化趋势,例如:折线图

  1. 构成

各部分占总体的百分比,例如:饼图

  1. 分布

关注变量的分布情况,例如:直方图

下面有两张图片,很好的概括了不同情况下,该如何选择合适的图表

image.png

image.png

在以后的工作中,如果遇到可视化工作,又不太确定如何更好的呈现数据,可以来看看上面的图片,也许能找到灵感。


十大图表实例


下面我们就来逐一完成上面的十个图表,看看 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 绘制:

image.png

Seaborn 绘制:

image.png

两种作图整体分布式类似的,不过 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 文件,可以在浏览器中打开查看


image.png

折线图

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 绘制:

image.png

Seaborn 绘制:

image.png

可以看到,使用 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()


image.png

直方图

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 绘制:

image.png

Seaborn 绘制:

image.png

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 绘制:

image.png

Seaborn 绘制:

image.png

可以看到,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()


image.png

盒式图

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 绘制:

image.png

Seaborn 绘制:

image.png

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()


image.png

饼图

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()


image.png

pyecharts 实现饼图

from pyecharts.charts import Pie
mylist = [list(z) for z in zip(labels, sizes)]
pie = Pie()
pie.add("", mylist)
pie.render_notebook()


image.png

热力图

对于热力图,一般使用 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()


image.png

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()


image.png

雷达图

Matplotlib 和 Seaborn 都没有直接提供雷达图的 API,我们需要手动实现一个

import numpy as np
import matplotlib.pyplot as plt
from 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 作画


image.png

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()


image.png

地理图表

对于需要展示地理分布的数据,使用地图分布图表是非常方便的,echarts 提供了好好的支持,因此我们也可以使用 pyecharts 的高级 API 来制作地理图表

from pyecharts.charts import Geo
provinces = ['广东', '北京', '上海', '江西', '湖南', '浙江', '江苏']
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()

只需要传入一个列表,列表里包含省份名称和对应省份的数值。这个数值就是具体的业务数据,比如可以是该省份的产值,高校数量,人口总数等等。


image.png

词云图

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()

同样是传入列表,包含需要展示的词语和该词语对应的频度,该频度也会决定词语的大小。


image.png

相信大家通过上面10个图表的学习,已经能够基本掌握 Python 可视化的知识了。你也应该发现,在数据分析的过程中,大多数情况下使用 Seaborn 是比较方便的,它可以很好的结合 DataFrame 数据类型,而在最后的数据展示时,使用 Pyecharts(echarts)则是很好的选择,它涵盖了非常强大的 API,可以对生成的图表再做后续的操作,当然 Matplotlib 是最为基础,也是最为强大的工具,在实际的工作中,需要好好衡量,选择最适合的工具来做可视化的工作。


总结


今天我们一起学习了常用的可视化图表以及如何制作相关图表。对于 Matplotlib、Seaborn 和 Pyecharts 工具包的使用一定要熟练的掌握,在数据分析的过程中会经常使用。同时还要知道,Seaborn 是基于 Matplotlib 的更加高级的可视化库,类似于 NumPy 和 Pandas 的关系。


同时我们还按照数据之间的关系,划分了不同类型的图表,希望能够在未来帮助你更好的选择图表。当然对于单分类和多分类数据,也可以使用组合图表来进行可视化处理。这三个工具包的官方文档都是非常好的学习工具,希望大家能够在后面的学习中好好利用,多加探索。

image.png


练习题


其实 Seaborn 自带了很多好玩的数据集,比如我们用到的 tips 和 flights 数据集,还有 car_crashes 数据集,是一个关于车祸的数据集,那么你能够使用该数据集,做一些探索吗,看看可以制作出哪些好玩的可视化图表?

相关文章
|
27天前
|
SQL 数据挖掘 Python
R中单细胞RNA-seq数据分析教程 (1)
R中单细胞RNA-seq数据分析教程 (1)
36 5
R中单细胞RNA-seq数据分析教程 (1)
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
某A保险公司的 数据图表和数据分析
某A保险公司的 数据图表和数据分析
64 0
某A保险公司的 数据图表和数据分析
|
2月前
|
数据可视化 数据挖掘 大数据
Python 数据分析入门:从零开始处理数据集
Python 数据分析入门:从零开始处理数据集
|
2月前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析:从入门到实践
使用Python进行数据分析:从入门到实践
57 2
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
【9月更文挑战第33天】本文旨在为初学者提供一个关于使用Python进行数据分析的全面概述。我们将从基本的安装和设置开始,逐步介绍数据处理、数据可视化以及机器学习的基本概念和应用。文章将通过实际代码示例来展示如何使用Python及其相关库来解决常见的数据分析问题。
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
深入浅出:用Python进行数据分析的入门指南
【10月更文挑战第21天】 在信息爆炸的时代,掌握数据分析技能就像拥有一把钥匙,能够解锁隐藏在庞大数据集背后的秘密。本文将引导你通过Python语言,学习如何从零开始进行数据分析。我们将一起探索数据的收集、处理、分析和可视化等步骤,并最终学会如何利用数据讲故事。无论你是编程新手还是希望提升数据分析能力的专业人士,这篇文章都将为你提供一条清晰的学习路径。
|
2月前
|
数据挖掘 索引 Python
Python数据分析篇--NumPy--入门
Python数据分析篇--NumPy--入门
38 0
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python中的简单数据分析:入门指南
【10月更文挑战第2天】Python中的简单数据分析:入门指南
36 0
|
4月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
88 2
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
209 4