掌握Matplotlib:数据可视化的综合指南

Matplotlib Comprehensive Guide to Data Visualization

第一部分:理解图表是更好表达的关键!

通过Ideogram.ai生成的图像

你好,数据爱好者👋 我们知道通过可视化来理解数据更好。它不仅帮助我们获得洞察力,还使我们能够更容易地向客户或他人解释我们的洞察力。因此,我们可以说学习制作更好的可视化对于任何数据爱好者都是必不可少的!

Matplotlib是Python的一种基本数据可视化库,全称为“数学绘图库”。就像画家在画布上绘制杰作一样,Matplotlib使数据科学家和分析师能够使用数据创建不同的有洞察力的图表。这里是未来的一瞥。

目录

  1. 基本绘图 ∘ 1.1 创建简单的线图 ∘ 1.2 标签、颜色和样式的自定义选项 ∘ 1.3 将Matplotlib图表保存为图像文件
  2. 绘图类型 ∘ 2.1 条形图 ∘ 2.2 直方图 ∘ 2.3 散点图 ∘ 2.4 饼图 ∘ 2.5 盒形图 ∘ 2.6 热力图和图像显示 ∘ 2.7 堆叠图

· 结论 ∘ 公告 #100daysMLDL

— 让我们进入可视化世界吧!—

1. 基本绘图

首先,我们需要import matplotlib.pyplot来访问绘图函数。

1.1 创建简单的线图

顾名思义,数据点通过直线连接,对于显示在范围内连续变化的数据非常有用,可以轻松识别出模式和趋势。使用plt.plot(x,y)创建简单的线图,使用plt.show()显示图表。

import matplotlib.pyplot as plt# 让我们以表示每月网站流量(以千为单位)的数据为例months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']traffic = [150, 200, 180, 220, 250, 210]# 创建线图plt.plot(months, traffic)plt.show()
简单线图
  • 但正如我们所见,它没有任何标签或标题。

1.2 标签、颜色和样式的自定义选项。

通过自定义图表,我们可以更清晰地传达信息。Matplotlib提供了许多自定义选项,允许您控制颜色、线条样式、标记等。

  • 添加标签和标题:使用plt.xlabel()plt.ylabel()plt.title()
import matplotlib.pyplot as plt# 以表示每月网站流量(以千为单位)的样本数据为例months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']traffic = [150, 200, 180, 220, 250, 210]# 创建线图plt.plot(months, traffic)# 添加标签和标题plt.xlabel('月份')plt.ylabel('每月流量(以千为单位)')plt.title('每月网站流量')plt.show()
带有标签和标题的简单线图

注意:记住plt.show()应该始终位于绘图设置的末尾。如果你在plt.show()之后使用标签命令,它们将不会显示!

  • 更改颜色和线条样式:使用参数marker标记点,linestyle更改线条样式,并使用plt.grid(True)在绘图中添加网格。
# 使用自定义外观创建折线图plt.plot(months, traffic, marker='o', linestyle='--', color='g')# 添加标签和标题plt.xlabel('月份')plt.ylabel('月度流量(千)')plt.title('月度网站流量')# 在图中添加网格plt.grid(True)# 显示图plt.show()
自定义折线图
  • 更改绘图样式:Matplotlib中有各种样式可用,要检查可用样式,请使用命令plt.style.available。使用plt.style.use('desired_style')更改整个图的样式。要使用漫画风格的绘图,可以使用plt.xkcd(),这将给出一个很酷的绘图。这些将更改整个笔记本的绘图样式,如果你想改回默认样式,请使用plt.style.use('default')注意:确保在plt.show()之前使用这些样式命令。

  • 更改图形大小:我们经常需要调整绘图大小,对吧?为了做到这一点,我们需要使用plt.figure(figsize=(x_size,y_size)),确保在.plot命令之前使用此命令。
  • 使用标签:如果要在同一图中绘制多条线,你可以使用两次plot命令绘制所需的变量。但问题是如何正确区分它们,为此,我们有一个名为label的参数,还需要使用plt.legend()
# 两个产品每月收入的样本数据(以千美元为单位)months = ['1月', '2月', '3月', '4月', '5月', '6月']product_a_revenue = [45, 55, 60, 70, 80, 75]product_b_revenue = [35, 40, 50, 55, 70, 68]# 使用蓝色线和圆形标记创建Product A的折线图plt.plot(months, product_a_revenue, marker='o', linestyle='-', color='blue', label='产品 A')# 使用红色虚线和方形标记创建Product B的折线图plt.plot(months, product_b_revenue, marker='s', linestyle='--', color='red', label='产品 B')# 添加标签和标题plt.xlabel('月份')plt.ylabel('月度收入(以1000美元为单位)')plt.title('月度收入比较')# 显示图例以区分产品 A 和产品 Bplt.legend()# 显示图plt.show()
带有适当标签的多条线图

1.3 将Matplotlib绘图保存为图像文件

Matplotlib使你能够将绘图保存为图像文件。

  • 在Jupyter Notebook中:在Jupyter Notebook中工作时,如果你希望将绘图保存为图像文件,你必须使用plt.savefig('path/to/directory/plot_name.png')。你可以指定完整的文件路径,还可以指定所需的文件名和格式(例如:.jpg、.png、.pdf)
  • 在Google Colab中:在Google Colab中工作时,如果你希望将绘图保存为图像文件,你必须先挂载驱动器,然后使用plt.savefig()
from google.colab import drive# 挂载谷歌云盘drive.mount('/content/drive')# 在Colab中将绘图保存为图像文件# 在我的云盘之后,您可以更改位置为所需的文件夹。plt.savefig('/content/drive/My Drive/'+'my_plot.png')

2. 绘图类型

我们在前一部分中已经看到了基本的折线图,但是Matplotlib还提供了许多其他类型的图表,例如条形图、直方图、散点图、饼图、箱线图、热力图、显示图像等。现在,让我们了解何时以及在哪些情况下使用它们。

2.1 条形图

条形图用矩形条表示分类数据,其中每个条的长度或高度表示一个值。您可以使用命令plt.bar(x,y)生成垂直条形图,使用plt.barh(x,y)生成水平条形图。

一些使用案例:1. 比较不同产品的销售业绩。2. 显示按国家划分的人口分布。

例如:在单个图中绘制多个条形图

# 费用分类categories = ['住房', '交通', '食品', '娱乐', '水电煤']# Alice、Bob和Carol的每月开支alice_expenses = [1200, 300, 400, 200, 150]bob_expenses = [1100, 320, 380, 180, 140]carol_expenses = [1300, 280, 420, 220, 160]# 创建x轴位置的数组x = np.arange(len(categories))# 条形的宽度,我们需要它,因为我们打算绘制多个条plt.bar_width = 0.2# 为Alice的开销创建条,从x数组中减去条形宽度,# 这样它将被放置在左边plt.bar(x - bar_width, alice_expenses, width=bar_width, label='Alice', color='skyblue')# 为Bob的开销创建条plt.bar(x, bob_expenses, width=bar_width, label='Bob', color='lightcoral')# 为Carol的开销创建条,将条形宽度添加到x数组中,# 这样它将被放置在右边plt.bar(x + bar_width, carol_expenses, width=bar_width, label='Carol', color='lightgreen')# 添加标签、标题和图例plt.xlabel('费用分类')plt.ylabel('每月开销(美元)')plt.title('每月开销对比')# 在x轴位置显示类别名称plt.xticks(x, categories)plt.legend()# 显示图形plt.show()

  • 因此,为了得到这些条,对于第一个条,我们用条宽减去了x标签,对于最后一个条,我们用条宽加上了标签。我们将width参数设置为所有条的条宽相等。

2.2 直方图

直方图用于可视化连续或数值数据的分布,它们帮助我们识别数据中的模式。在直方图中,数据被分组到“bin”中,每个条的高度表示该bin中数据点的频率或计数。它以给定数据的下限和上限为基础,并将其划分为给定的bin数量。

您可以使用命令plt.hist(x)生成直方图。与条形图不同,这里不需要‘y’,因为它只表示一个连续数据的频率。默认的bin数量为10,可以进行更改。您还可以使用所需的bin范围覆盖默认的bin范围。您还可以为条形图添加edgecolor

除了直方图之外,在同一图中如果您想添加任何线条,例如均值或中位数,您可以通过计算该值并将其传递给plt.axvline(calculated_mean, label=desired_label)来实现。这可以与任何其他图表一起使用。

一些使用案例:1. 分析人口的年龄分布。2. 检查教室中考试成绩的分布。

# 样本考试分数数据
exam_scores = [68, 72, 75, 80, 82, 84, 86, 90, 92, 95, 98, 100]
# 自定义分箱范围
bin_ranges = [60, 70, 80, 90, 100]
# 使用自定义分箱范围创建直方图
plt.hist(exam_scores, bins=bin_ranges, color='lightblue', edgecolor='black', alpha=0.7)
# 添加标签和标题
plt.xlabel('考试分数')
plt.ylabel('频率')
plt.title('自定义分箱的考试分数直方图')
# 计算并添加中位数线
median_score = np.median(exam_scores)
plt.axvline(median_score, color='red', linestyle='dashed', linewidth=2, label=f'中位数分数:{median_score}')
# 添加图例
plt.legend()
# 显示图形
plt.show()
带有自定义分箱范围和中位数线的直方图

2.3 散点图

散点图将单个数据点以点的形式显示在二维平面上。它们用于探索两个数值变量之间的关系或相关性。在散点图中,每个轴代表一个变量,点代表数据点。

您可以使用plt.scatter(x, y)生成散点图。可以使用参数s更改点的大小,使用参数c更改颜色,使用参数marker更改标记形状。而alpha参数控制颜色的强度。对于大小,甚至可以为每个点发送一个不同的大小列表。

几个用例:1. 研究学习时间和考试分数之间的关系。2. 分析温度和冰淇淋销量之间的相关性。

# 让我们为商店取样数据
# 商店大小表示每个商店的100平方英尺
stores = ['商店A', '商店B', '商店C', '商店D', '商店E']
customers = [120, 90, 150, 80, 200]
revenue = [20000, 18000, 25000, 17000, 30000]
store_size = [10, 5, 15, 8, 20]  # 在散点图中,我们将商店大小进行缩放,以获得点的大小
point_sizes = [size * 100 for size in store_size]
# 创建带有不同点大小的散点图
# 这里的alpha控制颜色的强度
plt.scatter(customers, revenue, s=point_sizes, c='skyblue', alpha=0.7, edgecolors='b')
# 添加标签,标题和图例
plt.xlabel('顾客数量')
plt.ylabel('收入(美元)')
plt.title('顾客、收入和商店大小之间的关系')
# 显示图形
plt.show()
带有商店大小缩放为点大小的散点图

2.4 饼图

饼图将一个整体的部分表示为圆形饼的切片。它们适用于以百分比的形式显示单个分类变量的组成。但是当有超过六个类别时,它们会变得杂乱无章,此时可能更适合使用水平条形图。

使用命令plt.pie(x, labels=your_category_names, colors=desired_colors_list),如果有一个所需的颜色列表,可以提供它,并且还可以使用参数wedgeprops={'edgecolor':your_color}来更改饼图的边框颜色。

我们还可以使用explode参数来突出显示特定的切片,通过传递一个元组,其中每个元素是它要爆炸的量。而autopct参数使您可以选择在图中显示多少位小数。

少数用例:1. 展示预算按费用类别的分布。2. 显示各个智能手机品牌的市场份额。

例如:在演示过程中突出显示特定部分以进行更好的叙述。

# 产品类别categories = ['电子产品', '服装', '家居装饰', '图书', '玩具']# 每个类别的销售数据sales = [3500, 2800, 2000, 1500, 1200]# 突出显示特定部分(例如,'服装'),# 第二个值(0.1)是“服装”部分的突出显示量。explode = (0, 0.1, 0, 0, 0)  # 创建带有突出显示和阴影的饼图plt.pie(sales, labels=categories, explode=explode, shadow=True, autopct='%1.1f%%')plt.title('按产品类别销售')# 显示绘图plt.show()
使用突出显示突出显示服装部分的饼图

2.5 箱线图(Box Plot)

箱线图看起来很复杂,对吧?简而言之,它们通过显示四分位数、异常值和潜在偏斜来总结数值数据的分布。它们提供了关于数据的传播、集中趋势和变异性的见解。箱线图特别适用于识别异常值和比较分布。

您可以使用plt.boxplot(data)绘制箱线图。您可以使用boxpropsflierprops自定义箱线和异常值的外观,使用vert=False使箱线图水平,使用patch_artist=True填充箱子的颜色。

少数用例:1. 分析公司内薪资的分布。2. 评估不同街区房价的变异性。

# 生成带有异常值的随机数据np.random.seed(42)data = np.concatenate([np.random.normal(0, 1, 100), np.random.normal(6, 1, 10)])# 创建带有异常值的箱线图plt.figure(figsize=(8, 6))  # 设置图形大小plt.boxplot(data, vert=False, patch_artist=True,             boxprops={'facecolor': 'lightblue'},             flierprops={'marker': 'o', 'markerfacecolor': 'red',                         'markeredgecolor': 'red'})# 添加标签和标题plt.xlabel('数值')plt.title('带有异常值的箱线图')# 显示绘图plt.grid(True)  # 添加网格以提高可读性plt.show()
带有自定义样式的异常值的箱线图

2.6 热图和显示图像

plt.imshow()是一个用于显示2D图像数据、可视化2D数组或以各种格式显示图像的Matplotlib函数。

  • 使用imshow绘制热图:热图是用于显示相关矩阵的可视化,它将使我们了解每个变量与其他变量的相关性。在这里,我们将创建一个热图来可视化相关矩阵,并使用颜色图来在视觉上显示这种关系。将相关矩阵传递给imshow以可视化热图。
# 创建一个示例相关矩阵correlation_matrix = np.array([[1.0, 0.8, 0.3, -0.2],                               [0.8, 1.0, 0.5, 0.1],                               [0.3, 0.5, 1.0, -0.4],                               [-0.2, 0.1, -0.4, 1.0]])# 为相关矩阵创建热图plt.imshow(correlation_matrix, cmap='coolwarm', vmin=-1, vmax=1, aspect='auto', origin='upper')# 使用以下命令添加颜色条cbar = plt.colorbar()cbar.set_label('相关性', rotation=270, labelpad=20)# 添加标签和标题plt.title('相关矩阵热图')plt.xticks(range(len(correlation_matrix)), ['变量1', '变量2', '变量3', '变量4'])plt.yticks(range(len(correlation_matrix)), ['变量1', '变量2', '变量3', '变量4'])plt.show()
使用matplotlib imshow方法生成热图
  • 使用imshow显示图像:Matplotlib的matplotlib.image模块中的imread方法经常用于读取和加载各种格式的图像,包括JPEG、PNG、BMP、TIFF等,然后可以使用imshow显示图像。如果已经有图像数据数组,则可以直接使用imshow显示。
import matplotlib.image as mpimg# 加载并显示图像img = mpimg.imread('sample_image.jpg')# 显示图像plt.imshow(img)  # 关闭坐标轴标签和刻度plt.axis('off')# 添加标题plt.title('示例图像')  # 显示绘图plt.show()  

2.7 堆叠图

假设您想要可视化三个产品类别(电子产品、服装和家用电器)在四个季度(Q1到Q4)中对总销售额的贡献。然后,您可以将每个类别的销售额表示为绘图中的层,并且该绘图有助于我们了解它们随时间的贡献和趋势。这正是堆叠图所做的。

堆叠图,也称为堆叠区域图,是一种数据可视化类型,它将多个数据集显示为相互叠加的层,每个层表示数据的不同类别或组成部分。堆叠图特别适用于可视化各个组件在连续时间段或分类域内对整体的贡献。使用plt.stackplot(x,y1,y2),可以有多个堆叠层!

# 堆叠图的样本数据quarters = ['Q1', 'Q2', 'Q3', 'Q4']electronics = [10000, 12000, 11000, 10500]clothing = [5000, 6000, 7500, 8000]home_appliances = [7000, 7500, 8200, 9000]# 创建堆叠图plt.figure(figsize=(10, 6))  # 设置图形大小plt.stackplot(quarters, electronics, clothing, home_appliances, labels=['电子产品', '服装', '家用电器'],              colors=['蓝色', '绿色', '红色'], alpha=0.7)# 添加标签、图例和标题plt.xlabel('季度')plt.ylabel('销售额(美元)')plt.title('产品类别销售额随季度变化')plt.legend(loc='左上角')# 显示绘图plt.grid(True)plt.show()
堆叠图比较四个季度中的不同类别

参考资料:1. 来自Codebasics频道的Matplotlib教程

结论

在这个Matplotlib指南中,我们介绍了如何制作基本图形、自定义图形,并讨论了重要图形的特点。请记住我提到的注意事项。

精通Matplotlib对于更好的数据可视化至关重要,并且它不仅仅局限于我们讨论的内容!Matplotlib的高级技术将在本指南的第2部分中讨论。订阅以不错过任何激动人心的数据科学文章!

如果您还在寻找一本关于Pandas的全面指南,可以查看下面详细的文章。还可以查看我的个人资料了解Numpy指南。

Pandas揭秘:数据爱好者的综合手册

第1部分:探索有效数据分析的基本函数

python.plainenglish.io

公告 #100daysMLDL

第4天/100 — 重温Matplotlib。

这是一个挑战的存储库链接。我邀请大家一起参加这个令人激动的旅程!无论您是数据爱好者还是对机器学习世界感到好奇,这里都有适合每个人的内容。让我们一起学习、成长并相互激励。谢谢您的阅读,愉快学习,祝您有美好的一天 🙂