Python入门实战:Python数据可视化基础

143 阅读8分钟

1.背景介绍

随着互联网、移动互联网、物联网等新型应用模式的发展,越来越多的人开始收集和处理海量数据,而这些数据的可视化成为一个重要的数据分析手段。在这个过程中,如何将数据转化成易于理解和分析的图表,成为数据科学家不可或缺的能力之一。但由于对图形技术、编程语言不熟悉,导致许多数据分析人员在此领域走得尘埃落地。 本文主要以最通用的数据可视化库——matplotlib和seaborn来进行教程,初步了解matplotlib的基本语法和功能,进而深入介绍seaborn的一些高级特性,并结合实例学习如何利用这些工具生成各种统计、绘图图表。

2.核心概念与联系

Matplotlib简介

Matplotlib是一个python 2D绘图库,它可以用来创建静态图形(static graphics)、信息图(infographics)、交互式图表(interactive plots),以及具有三维可视化效果的3D图形。Matplotlib能够轻松实现复杂的统计图表的制作,且支持不同的输出文件格式,包括PNG、PDF、SVG、EPS和PPTX。它的底层依赖关系较少,因此可以轻易地嵌入到其他项目中。

Matplotlib由两部分组成,其中figure表示整个图像,axes表示图像中的坐标轴,比如横轴x轴和纵轴y轴,其中pyplot模块提供了一种方便的接口,用于创建和管理Figure及Axes对象。每个Figure都有一个子图(Subplot)集合,其中的每一个Axes对象代表一个子图,可以同时包含不同类型的数据图例。例如,可以在同一个子图上绘制散点图(Scatter plot)、条形图(Bar chart)、折线图(Line plot)等。

Seaborn简介

Seaborn是一个基于matplotlib的Python数据可视化库,它以更简单、直观的方式呈现统计学数据。它通过高度自定义的默认值和友好的API接口使得可视化变得更加容易,而且内置了许多有用的工具函数,能极大地提升可视化效率。鉴于Matplotlib的普遍性和易用性,Seaborn受到了广泛欢迎,是进行数据可视化的一大利器。

Matplotlib与Seaborn的区别

API接口

Matplotlib面向对象的API接口,有较强的灵活性;Seaborn提供了直接调用函数的API接口,提供更简单的使用方式。

数据集结构

Matplotlib接受NumPy数组作为输入数据,Seaborn接受pandas DataFrame对象作为输入数据。

默认设置

Matplotlib的默认参数和图形风格比较传统,Seaborn提供更多自定义选项。

可视化效果

Matplotlib和Seaborn都提供不同种类的可视化效果,但是Seaborn在提供更丰富的视觉编码时有明显优势。

主题

Matplotlib提供了默认的黑白主题样式,Seaborn提供了更多的主题样式。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

3.1 描述统计信息

描述统计信息(Descriptive Statistics)指从数据中得到的信息,如均值、方差等,描述数据总体特征的统计学指标。该方法用于认识数据分布的形式、质量、中心位置、变化趋势以及异常值。

Matplotlib提供了很多描述统计的方法,如boxplot()、hist()、scatter()等。

3.2 探索性数据分析

探索性数据分析(Exploratory Data Analysis,EDA)旨在获取、清洗和整理数据,从而发现数据集中潜藏的模式、规律和关系,进而有效地进行数据分析。该方法首先关注数据集的特点,然后利用统计数据、图表和网络图等视觉化方法对数据进行快速、系统的概览。

Matplotlib提供了一些基本的可视化方法,如bar()、line()、pie()等。

3.3 分类数据

分类数据(Categorical Data)是指变量取值为有限个离散的类别或者状态的变量。与连续型数据相比,分类数据在分析中往往会产生歧义,因此需要经过特殊的处理才能得到有意义的结果。

Matplotlib提供了一些处理分类数据的可视化方法,如strip_background()、factorplot()、lvmap()等。

4.具体代码实例和详细解释说明

4.1 描述统计信息——箱线图

箱线图(Boxplot)是一种用于呈现一组数据的分位数、四分位间距及上下四分位数之间观测值的分布情况的统计图。箱线图帮助我们快速掌握数据的概况,包括最大值、最小值、第一四分位数、第三四分位数、中位数以及四分位极差。

1.准备数据

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123) # 设置随机种子
data = [np.random.normal(0, std, 100) for std in range(1, 4)] # 生成三个正态分布数据

2.绘制箱线图

plt.boxplot(data, labels=['1', '2', '3']) # 使用boxplot()函数绘制箱线图,并设置标签
plt.show() # 显示图表

3.调整刻度范围

plt.boxplot(data, labels=range(1, 4)) # 修改标签名称为数字编号
plt.ylim(-3, 6) # 设置y轴范围为(-3, 6)
plt.show() # 显示图表

4.添加平均值线

plt.boxplot(data, showmeans=True) # 添加meanline
plt.xticks([1, 2, 3], ['1', '2', '3'], rotation=45) # 设置x轴标签
plt.show() # 显示图表

4.2 描述统计信息——直方图

直方图(Histogram)是一种用频率来描绘定量数据的图形。一般情况下,频率分布图通常由柱状条组成,不同的颜色代表不同的区间。直方图是一种非常有力的工具,能够直观地看出各个数据点所处的位置。

1.准备数据

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123) # 设置随机种子
data = np.random.randn(1000) # 生成标准正态分布数据

2.绘制直方图

plt.hist(data, bins=30, density=True, alpha=0.5, color='g') # 创建直方图
plt.xlabel('Value') # x轴标签
plt.ylabel('Frequency') # y轴标签
plt.title('Histogram of Standard Normal Distribution') # 标题
plt.show() # 显示图表

3.修改颜色

bins = np.linspace(-5, 5, 20) # 设置bin边界
plt.hist(data, bins=bins, normed=False, alpha=0.5, histtype='stepfilled', facecolor='orange', edgecolor='blue') # 填充颜色,边框颜色
plt.xlabel('Value') # x轴标签
plt.ylabel('Frequency') # y轴标签
plt.title('Histogram of Standard Normal Distribution') # 标题
plt.show() # 显示图表

4.添加标注

def label_point(x, y, val):
    for i, point in enumerate(zip(x, y)):
        plt.text(point[0], point[1], str(val[i]))

x = np.array([-2., -1,  0.,  1.,  2]) # 设置标记点x坐标
y = np.zeros_like(x) + 0.3 # 设置标记点y坐标
label_point(x, y, x) # 添加标记点
plt.grid(axis='both') # 显示网格
plt.show() # 显示图表

4.3 探索性数据分析——散点图

散点图(Scatter Plot)是一种用数据点表示两个变量之间的相关关系的二维图。

1.准备数据

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123) # 设置随机种子
x = np.random.rand(100) * 4 - 2 # 在[-2, 2]区间内生成100个随机数
y = (x ** 2 + np.random.randn(100) * 0.5).clip(-2, 2) # 以x^2+随机数的噪声为目标函数计算对应的值

2.绘制散点图

plt.scatter(x, y, c='r', marker='+') # 设置红色圆点,大小为+号
plt.xlabel('Variable X') # x轴标签
plt.ylabel('Variable Y') # y轴标签
plt.title('Scatter Plot of Variable X and Y') # 标题
plt.show() # 显示图表

3.设置颜色图例

colors = ['red' if xi > yi else 'blue' for xi, yi in zip(x, y)] # 根据x,y判断颜色
markers = ['o' if abs(xi - yi) < 0.2 else '+' for xi, yi in zip(x, y)] # 根据x,y判断大小
plt.scatter(x, y, c=colors, marker=markers) # 设置颜色,大小
legend_dict = {'red': 'Positive Correlation', 'blue': 'Negative Correlation'} # 颜色说明字典
handles = []
for key, value in legend_dict.items():
    handles.append(plt.Line2D([], [], marker='o', linestyle='', markersize=5, color=key, label=value))
    handles.append(plt.Line2D([], [], marker='+', linestyle='', markersize=10, color=key, label='_nolegend_'))
plt.legend(handles=handles) # 设置图例
plt.xlabel('Variable X') # x轴标签
plt.ylabel('Variable Y') # y轴标签
plt.title('Scatter Plot of Variable X and Y with Color Legend') # 标题
plt.show() # 显示图表

4.4 分类数据——堆积柱状图

堆积柱状图(Stacked Bar Chart)是一种横向柱状图,不同颜色的柱子叠加在一起形成一种新的图形。

1.准备数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(123) # 设置随机种子
N = 3 # 设置类别数量
p1 = np.random.rand(N) # 生成第一个类别样本数量
p2 = np.random.rand(N) # 生成第二个类别样本数量
df = pd.DataFrame({'Class A': p1, 'Class B': p2}) # 将数据组织成表格
print(df) # 打印表格
Class A	Class B
0	0.822111	0.762071
1	0.728477	0.119775
2	0.344268	0.357702

2.绘制堆积柱状图

ax = df.plot(kind='bar', stacked=True, rot=0, figsize=(8, 5), colormap='tab20c') # 用堆积柱状图画图
ax.set_title('Stacked Bar Chart of Sample Numbers by Class', fontsize=14) # 标题
ax.set_xlabel('') # x轴标签
ax.set_ylabel('# of Samples', fontsize=12) # y轴标签
ax.set_xticklabels(['A'+str(i+1) for i in range(N)], rotation=0, fontsize=12) # 设置x轴标签
ax.legend(loc='upper left') # 图例位置
plt.show() # 显示图表

4.5 seaborn——更多高级图表

除了Matplotlib自带的图表外,Seaborn提供了更多高级图表。

1.分布拟合线图(Distribution Fitting Line Graph)

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set(style="ticks") # 设置seaborn样式
tips = sns.load_dataset("tips") # 获取tips数据集
sns.distplot(tips["total_bill"], rug=True, hist=False) # 分布拟合线图
plt.title("Total Bill Distribution") # 标题
plt.xlabel("Total Bill ($)") # x轴标签
plt.ylabel("") # y轴标签
plt.show() # 显示图表

2.热力图(Heatmap)

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set(style="white", rc={"axes.facecolor": (0, 0, 0, 0)}) # 设置seaborn样式,并隐藏坐标轴
flights = sns.load_dataset("flights") # 获取航班数据集
flights = flights.pivot("month", "year", "passengers") # 重塑数据
fig, ax = plt.subplots(figsize=(10, 6)) # 创建图表
cmap = sns.cubehelix_palette(start=0.5, light=1, as_cmap=True) # 设置颜色映射
heatmap = sns.heatmap(flights, cmap=cmap, linewidths=.5, annot=True, fmt="d") # 创建热力图
heatmap.set_title('Monthly Passenger Numbers', fontdict={'fontsize': 20}, pad=16); # 设置标题,字体大小,间距
plt.yticks(rotation=0) # 横坐标旋转
plt.show() # 显示图表