使用Matplotlib和Seaborn创建视觉效果

2023年09月08日 由 camellia 发表 381 0

数据可视化在数据工作中至关重要,因为它可以帮助人们了解我们的数据会发生什么。很难直接以原始形式摄取数据信息,但可视化会激发人们的兴趣和参与度。这就是为什么学习数据可视化对于在数据领域取得成功很重要的原因。


Matplotlib是Python最受欢迎的数据可视化库之一,因为它非常通用,你可以从头开始可视化几乎所有内容。 你可以使用此软件包控制可视化的许多方面。


另一方面,Seaborn是一个构建在Matplotlib之上的Python数据可视化包。 它提供了更简单的高级代码,包内有各种内置主题。 如果你想要一个快速的数据可视化和漂亮的外观,这个包是很棒的。


在本文中,我们将探索这两个包,并学习如何使用这些包可视化数据。


使用 Matplotlib 进行可视化

 

如上所述,Matplotlib是一个通用的Python包,我们可以在其中控制可视化的各个方面。该软件包基于 Matlab 编程语言,但我们在 Python 中应用了它。

pip install matplotlib

Matplotlib 库通常已经在你的环境中可用,尤其是在你使用 Anaconda 的情况下。如果没有,你可以使用以下代码安装它们。

import matplotlib.pyplot as plt
让我们从 Matplotlib 的基本绘图开始。首先,创建示例数据。
import numpy as np

x = np.linspace(0,5,21)
y = x**2
有了这些数据,我们将使用 Matplotlib 包创建一个线图。
plt.plot(x, y, 'b')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Sample Plot')

1.1

在上面的代码中,我们将数据传递到 matplotlib 函数(x 和 y)中,以创建带有蓝线的简单线图。此外,我们使用上面的代码控制轴标签和标题。

让我们尝试使用子图函数创建一个多 matplotlib 图。

plt.subplot(1,2,1)
plt.plot(x, y, 'b--')
plt.title('Subplot 1')
plt.subplot(1,2,2)
plt.plot(x, y, 'r')
plt.title('Subplot 2')

1.2

在上面的代码中,我们并排创建了两个图。 子图功能控制出图位置;例如plt.subplot(1,2,1)意味着我们将在一行(第一个参数)和两列(第二个参数)中有两个图。 第三个参数是控制我们现在引用的图。 所以plt.subplot(1,2,1)表示单行双列图的第一个图。


这是Matplotlib函数的基础,但是如果我们想要更多地控制Matplotlib可视化,我们需要使用面向对象方法(OOM)。 使用OOM,我们将直接从图形对象生成可视化,并从指定对象调用任何属性。


下面这个是一个Matplotlib OOM的可视化示例。

#create figure instance (Canvas)
fig = plt.figure()

#add the axes to the canvas
ax = fig.add_axes([0.1, 0.1, 0.7, 0.7]) #left, bottom, width, height (range from 0 to 1)

#add the plot to the axes within the canvas
ax.plot(x, y, 'b')
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_title('Plot with OOM')

1.3

结果与我们创建的图类似,但代码更复杂。 起初,它似乎适得其反,但使用OOM允许我们通过可视化控制几乎所有的事情。 例如,在上面的图中,我们可以控制坐标轴在画布中的位置。


为了了解使用OOM与使用普通绘图函数的区别,让我们将两个绘图的轴彼此重叠。

#create figure instance (Canvas)
fig = plt.figure()

#add two axes to the canvas
ax1 = fig.add_axes([0.1, 0.1, 0.7, 0.7])
ax2 = fig.add_axes([0.2, 0.35, 0.2, 0.4])

#add the plot to the respective axes within the canvas
ax1.plot(x, y, 'b')
ax1.set_xlabel('X label Ax 1')
ax1.set_ylabel('Y label Ax 1')
ax1.set_title('Plot with OOM Ax 1')

ax2.plot(x, y, 'r--')
ax2.set_xlabel('X label Ax 2')
ax2.set_ylabel('Y label Ax 2')
ax2.set_title('Plot with OOM Ax 2')
1.4

在上面的代码中,我们用plt.figure函数指定了一个canvas对象,并从figure对象生成了所有这些图。 我们可以在一个画布中产生尽可能多的轴,并在其中放置可视化图。

也可以使用子图功能自动创建图形和轴对象。
fig, ax = plt.subplots(nrows = 1, ncols =2)

ax[0].plot(x, y, 'b--')
ax[0].set_xlabel('X label')
ax[0].set_ylabel('Y label')
ax[0].set_title('Plot with OOM subplot 1')
1.5

使用子图函数,我们创建图形和轴对象列表。在上面的函数中,我们指定了图的数量和一行与两列图的位置。

对于轴对象,它是我们可以访问的绘图的所有轴的列表。在上面的代码中,我们访问列表中的第一个对象来创建绘图。结果是两个图,一个用线图填充,另一个只填充轴。

由于子图生成轴对象列表,因此你可以像下面的代码一样迭代它们。
fig, axes = plt.subplots(nrows = 1, ncols =2)

for ax in axes:

ax.plot(x, y, 'b--')
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_title('Plot with OOM')

plt.tight_layout()
1.6
你可以使用代码来生成所需的绘图。此外,我们使用tight_layout函数,因为存在图片重叠的可能性。

接下来我们将尝试一些可用于控制 Matplotlib 图的基本参数。首先,让我们尝试更改画布和像素大小。
fig = plt.figure(figsize = (8,4), dpi =100)
1.7
通过将label参数赋给图并使用legend函数,我们可以将标签显示为图例。

最后,我们可以使用下面的代码来保存我们的图。
fig.savefig('visualization.jpg')
在上面所示的线图之外还有许多特殊的图。 我们可以使用这些函数访问这些图。 让我们尝试几个可能有助于工作的图。

散点图

我们可以使用以下代码创建散点图来可视化特征关系,而不是线图。
plt.scatter(x,y)
1.8
直方图

直方图可视化了箱中表示的数据分布。
plt.hist(y, bins = 5)
1.9
箱线图

箱线图是一种可视化技术,表示数据分布为四分位数。
plt.boxplot(x)
箱线图
饼状图

饼状图是一个圆形图,表示分类图的数字比例,例如,数据中分类值的频率。
freq = [2,4,1,3]
fruit = ['Apple', 'Banana', 'Grape', 'Pear']
plt.pie(freq, labels = fruit)
饼状图

Seaborn的可视化
 

Seaborn是一个建立在Matplotlib之上的用于统计可视化的Python包。Seaborn之所以脱颖而出,是因为它简化了具有出色风格的可视化创建。该软件包也适用于Matplotlib,因为许多Seaborn API都与Matplotlib绑定。

让我们试试Seaborn软件包。如果尚未安装包,可以使用以下代码执行此操作。
pip install seaborn
Seaborn有一个内置的API来获取可用于测试包的示例数据集。我们将使用此数据集与Seaborn一起创建各种可视化。
import seaborn as sns

tips = sns.load_dataset('tips')
tips.head()
2.1
使用上面的数据,我们将探索Seaborn图,包括分布图,分类图,关系图和矩阵图。

分布图

我们使用Seaborn尝试的第一个图是分布图,以可视化数值特征分布。我们可以使用以下代码来做到这一点。
sns.displot(data = tips, x = 'tip')
分布图
默认情况下,displot函数将生成直方图。 如果我们想要平滑图,我们可以使用KDE参数。
sns.displot(data = tips, x = 'tip', kind = 'kde')
2.2
还可以使用 hue 参数根据数据帧中的分类值分割分布图。
sns.displot(data = tips, x = 'tip', kind = 'kde', hue = 'smoker')
2.3
我们甚至可以使用 row 或 col 参数进一步拆分图。使用此参数,我们生成多个用分类值组合划分的图。
sns.displot(data = tips, x = 'tip', kind = 'kde', hue = 'smoker', row = 'time', col = 'sex')
3
显示数据分布的另一种方法是使用箱线图。Seabron 可以使用以下代码轻松促进可视化。
sns.boxplot(data = tips, x = 'time', y = 'tip')
4
使用小提琴图,我们可以显示将箱线图与 KDE 相结合的数据分布。
5
最后,我们可以通过组合小提琴图和群图来显示图的数据点。
sns.violinplot(data = tips, x = 'time', y = 'tip')
sns.swarmplot(data = tips, x = 'time', y = 'tip', palette = 'Set1')
6
分类图

分类图是各种 Seaborn API,适用于生成具有分类数据的可视化效果。让我们探索一些可用的情节。

首先,我们将尝试创建一个计数图。
sns.countplot(data = tips, x = 'time')
分类图
计数图将显示一个带有分类值频率的条形图。如果我们想在图中显示计数数字,我们需要将 Matplotlib 函数组合到 Seaborn API 中。
p = sns.countplot(data = tips, x = 'time')
p.bar_label(p.containers[0])
分2
我们可以使用 hue 参数进一步扩展图,并使用以下代码显示频率值。
p = sns.countplot(data = tips, x = 'time', hue = 'sex')
for container in p.containers:
ax.bar_label(container)
hue
接下来,我们将尝试开发一个条形图。条形图是显示带有误差线的数据聚合的分类图。
sns.barplot(data = tips, x = 'time', y = 'tip')
0
条形图使用分类和数值特征的组合来提供聚合统计量。默认情况下,条形图使用置信区间为95%误差条的平均聚合函数。

如果我们想更改聚合函数,我们可以将函数传递给 estimator 参数。
import numpy as np
sns.barplot(data = tips, x = 'time', y = 'tip', estimator = np.median)
est
关系图

关系图是一种显示特征之间关系的可视化技术。它主要用于识别数据集中存在的任何类型的模式。

首先,我们将使用散点图来显示某些数值特征之间的关系。
sns.scatterplot(data = tips, x = 'tip', y = 'total_bill')
关系图1
我们可以使用联合图将散点图与分布图组合在一起。
sns.jointplot(data = tips, x = 'tip', y = 'total_bill')
关2
最后,我们可以使用配对图自动绘制数据帧中特征之间的成对关系。
sns.pairplot(data = tips)
关3
矩阵图

矩阵图用于将数据可视化为颜色编码矩阵。它用于查看特征之间的关系或帮助识别数据中的聚类。

例如,我们有一个来自数据集的相关数据矩阵。
tips.corr()
矩阵图
如果我们用颜色编码的图来表示它们,我们可以更好地理解上面的数据集。这就是为什么我们会使用热图图片。
sns.heatmap(tips.corr(), annot = True)
矩阵图2
矩阵图还可以生成分层聚类图,该图推断数据集中的值并根据现有的相似性对它们进行聚类
sns.clustermap(tips.pivot_table(values = 'tip', index = 'size', columns = 'day').fillna(0))
矩阵图3

总结
 
数据可视化是数据世界的重要组成部分,因为它可以帮助受众快速了解我们的数据会发生什么。
文章来源:https://www.kdnuggets.com/creating-visuals-with-matplotlib-and-seaborn
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消