Matplotlib教程-Matplotlib (Python 绘图库)
相较于文本数据,人类的大脑对数据的视觉表示更加适应。当数据被可视化时,我们能更容易理解事物。通过图形来表示数据更好,我们可以更高效地分析数据并根据数据分析做出特定决策。在学习 matplotlib 之前,我们需要理解数据可视化及其重要性。
数据可视化
图形为探索数据提供了一个出色的方法,这对于呈现结果至关重要。数据可视化是一个新术语。它传达了一个概念,涉及的不仅仅是以图形形式(而不是文本形式)表示数据。
这在发现和了解数据集时非常有帮助,可以帮助识别模式、损坏的数据、异常值等。有了一点领域知识,数据可视化可以用来表达和展示图表和图形中的关键关系。统计学确实侧重于数据的定量描述和估计。它提供了一套重要的工具,用于获得对数据的定性理解。
有五种关键的图形用于数据可视化。
有五个阶段对组织做出决策至关重要:
- 可视化:我们分析原始数据,这意味着使复杂数据更易访问、更易理解,并且更可用。使用表格数据表示法,用户将查找特定测量值,而使用多种类型的图表来显示数据中一个或多个变量的模式或关系。
- 分析:数据分析被定义为清洗、检查、转换和建模数据以获取有用信息。无论我们是为业务还是日常生活做决定,都是通过过去的经验。选择特定决策会发生什么,这只不过是分析我们的过去。那可能会影响未来,所以为任何商业或组织做出更好的决策需要适当的分析。
- 文档洞察:文档洞察是一个过程,其中有用的数据或信息按标准格式组织在文档中。
- 转换数据集:使用标准数据使决策更有效。
为什么需要数据可视化?
数据可视化可以执行以下任务:
- 它识别需要改进和关注的领域。
- 它澄清了因素。
- 它有助于理解哪些产品放在哪里。
- 预测销售量。
数据可视化的好处
以下是数据可视化的一些好处,这有助于为组织或商业做出有效的决策:
1. 构建吸收信息的方法
数据可视化允许用户接收有关运营和业务状况的大量信息。它帮助决策者看到多维数据集之间的关系。它提供了通过使用地图、发热图和其他丰富的图形表示来分析数据的新方法。
视觉数据发现更有可能找到组织需要的信息,然后以比其他竞争公司更高的生产率结束。
2. 可视化业务中的关系和模式
数据可视化的关键优势在于它对于在当今高度竞争的商业环境中发现运营状况与业务绩效之间的相关性至关重要。
具有做出这类相关性的能力使得执行者能够识别问题的根本原因并迅速采取行动解决它。
假设一家食品公司正在查看他们的月度客户数据,数据以条形图呈现,显示该公司的得分在特定区域的前几个月下降了五点;数据表明这个区域的客户满意度存在问题。
3. 更快地对新兴趋势采取行动
数据可视化允许决策者更高效地把握客户行为和市场条件的变化,跨越多个数据集。
对客户情绪等数据的了解为公司揭示了一个新的商机,使公司能够领先于竞争对手行动。
4. 地理基础的可视化
由于许多网站提供网络服务,吸引访问者的兴趣,发生了地理空间可视化。这些类型的网站需要利用已经存在于客户详细信息中的位置特定信息来获得好处。
Matplotlib 是一个 Python 库,被定义为基于 Numpy 数组构建的多平台数据可视化库。它可以用于 python 脚本、shell、Web 应用程序和其他图形用户界面工具包。
John D. Hunter 最初在 2002 年构想了 matplotlib。它拥有一个活跃的开发社区,并且根据 BSD 风格的许可 分发。其第一个版本于 2003 年发布,最新的 版本 3.1.1 在 2019 年 7 月 1 日 发布。
Matplotlib 2.0.x 支持 Python 版本 2.7 到 3.6 直到 2007 年 6 月 23 日。Python3 支持从 Matplotlib 1.2 开始。Matplotlib 1.4 是最后一个支持 Python 2.6 的版本。
有各种工具包可用,用于增强 matplotlib 的功能。这些工具中的一些需要单独下载,其他的可以与 matplotlib 源代码一起移动,但具有外部依赖。
- Basemap:它是一个地图绘制工具包,包含多种地图投影、海岸线和政治边界。
- Cartopy:它是一个包含面向对象的地图投影定义、任意点、线、多边形和图像变换能力的映射库。
- Excel tools:Matplotlib 提供了与 Microsoft Excel 交换数据的工具。
- Mplot3d:用于 3D 绘图。
- Natgrid:它是 Natgrid 库的一个界面,用于不规则网格化的空间数据。
Matplotlib 架构
matplotlib 的架构中有三个不同的层次,分别是:
- 后端层
- 艺术家层
- 脚本层
后端层
后端层是图形的底层,包含绘图所需的各种功能的实现。从后端层中有三个重要的类 FigureCanvas(绘制图形的表面)、Renderer(负责在表面上绘制的类)和 Event(处理鼠标和键盘事件)。
艺术家层
艺术家层是架构的第二层。它负责各种绘图功能,如轴,它协调如何在图形画布上使用渲染器。
脚本层
脚本层是我们的代码大多数运行的最顶层。脚本层中的方法几乎自动处理其他层,并且我们只需要关心当前状态(图形和子图)。
Matplotlib 的一般概念
一个 Matplotlib 图形可以分为以下几个部分:
图形:整个图形可能包含一个或多个轴(图表)。我们可以将图形看作是一个承载图表的画布。
轴:一个图形可以包含多个轴。它由两个或三个(在 3D 的情况下)轴对象组成。每个轴由一个标题、一个 x 标签和一个 y 标签组成。
轴:轴是多条线样的对象,负责生成图形的限制。
艺术家:艺术家是我们在图形上看到的所有东西,如文本对象、Line2D 对象和集合对象。大多数艺术家都与轴绑定。
安装 Matplotlib
在开始使用 Matplotlib 或其绘图功能之前,首先需要安装。matplotlib 的安装取决于您的计算机上安装的发行版。这些安装方法如下:
使用 Anaconda Python 发行版
安装 Matplotlib 的最简单方法是下载 Anaconda Python 发行版。Anaconda 发行版中预安装了 Matplotlib,不需要进一步的安装步骤。
- 访问 Anaconda 的官方网站并点击下载按钮
- 根据您的 Python 解释器配置选择下载。
使用 Anaconda 提示符安装 Matplotlib
通过在 Anaconda 提示符中输入命令也可以安装 Matplotlib。要安装 matplotlib,请打开 Anaconda Prompt 并键入以下命令:
conda install matplotlib
使用 pip 安装 Matplotlib
Python 包管理器 pip 也可用于安装 matplotlib。打开命令提示符窗口,并键入以下命令:
pip install matplotlib
验证安装
要验证 matplotlib 是否正确安装,请在终端中键入包括调用 .__version__ 的以下命令。
import matplotlib
matplotlib.__version__
'3.1.1'
绘图图表的基本示例
这里是生成一个简单图形的基本示例;程序如下:
from matplotlib import pyplot as plt
#ploting our canvas
plt.plot([1,2,3],[4,5,1])
#display the graph
plt.show()
输出:
使用 Python matplotlib 绘制一个简单的图形只需要三行代码。我们可以添加标题、标签到我们用 Python matplotlib 库创建的图表中,使其更有意义。示例如下:
from matplotlib import pyplot as plt
x = [5, 2, 7]
y = [1, 10, 4]
plt.plot(x, y)
plt.title('Line graph')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
输出:
与之前的图表相比,这个图表更容易理解。
使用 Pyplot
matplotlib.pyplot 是一个集命令风格函数的集合,使得 matplotlib 像使用 MATLAB 一样。pyplot 函数用于对图形进行一些更改,如创建图形、在图形中创建绘图区域、在绘图区域中绘制一些线条、装饰绘图等。
使用它时,如果我们想快速绘图而不需要实例化任何图形或轴,那么它很有用。
在使用 matplotlib.pyplot 时,一些状态会跨函数调用保存,以便它跟踪当前图形和绘图区域等事物,这些绘图函数被定向到当前轴。
pyplot 模块提供了 plot() 函数,这是用于绘制图形的函数最常使用。让我们看一个简单的例子:
from matplotlib import pyplot as plt
plt.plot([1,2,3,4,5])
plt.ylabel("y axis")
plt.xlabel('x axis')
plt.show()
输出:
在上述程序中,它绘制了一个图形,x 轴的范围从 0-4,y 轴从 1-5。如果我们提供单个列表给 plot(),matplotlib 假定它是 y 值的序列,并自动生成 x 值。因为我们知道 python 索引从 0 开始,所以默认的 x 向量与 y 有相同的长度,但从 0 开始。因此,x 数据是 [0, 1, 2, 3, 4]。
我们可以传递任意数量的参数给 plot()。例如,要绘制 x 对 y 的图,我们可以这样做:
from matplotlib import pyplot as plt
plt.plot([1,2,3,4,5],[1,4,9,16,25])
plt.ylabel("y axis")
plt.xlabel('x axis')
plt.show()
输出:
格式化绘图样式
有一个可选的第三个参数,这是一个格式字符串,指示绘图的颜色和线条类型。默认格式字符串是 'b-',这是实心蓝色,正如你在上面绘制的图形中看到的。让我们考虑下面的例子,我们绘制图形时使用红色圆圈。
from matplotlib import pyplot as plt
plt.plot([1, 2, 3, 4,5], [1, 4, 9, 16,25], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()
输出:
示例格式字符串
'b' | 使用蓝色标记,默认形状。 |
---|---|
'ro' | 红色圆圈 |
'-g' | 绿色实线 |
'--' | 默认颜色的虚线 |
'^k:' | 黑色向上三角标记,由点线连接 |
matplotlib 支持以下颜色缩写:
字符 | 颜色 |
---|---|
'b' | 蓝色 |
'g' | 绿色 |
'r' | 红色 |
'c' | 青色 |
'm' | 品红 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
使用分类变量绘图
Matplotlib 允许我们直接将分类变量传递给许多绘图函数:考虑以下示例
from matplotlib import pyplot
names = ['Abhishek', 'Himanshu', 'Devansh']
marks= [87,50,98]
plt.figure(figsize=(9,3))
plt.subplot(131)
plt.bar(names, marks)
plt.subplot(132)
plt.scatter(names, marks)
plt.subplot(133)
plt.plot(names, marks)
plt.suptitle('Categorical Plotting')
plt.show()
输出:
在上述程序中,我们使用 subplot() 函数绘制了分类图形。让我们看看 subplot() 函数。
什么是 subplot()
Matplotlib subplot() 函数被定义为在一个图形中绘制两个或多个图表。我们可以使用这个方法将两个图表分开,这些图表绘制在相同的轴上。Matplotlib 支持所有种类的子图,包括 2x1 垂直、2x1 水平或 2x2 网格。
它接受三个参数:它们是 nrows, ncols, 和 index。它表示行数、列数和索引。
subplot() 函数可以以下面的方式被调用:
subplot(nrows,ncols,index,**kwargs)
subplot(pos,**kwargs)
subplot(ax)
参数:
- *args:
三个独立的整数或三位整数描述了子图的位置。如果三个整数分别是 nrows, ncols, 和 index,子图将占据网格中 nrows 行 和 ncol 列 的 index 位置。
参数 pos 是一个三位整数,其中第一个数字表示行数,第二个数字表示列数,第三个表示子图的索引。例如,subplot (1, 3, 2) 与 subplot (132) 相同。
注意: 传递的整数必须小于 10。
- **kwargs
subplot() 函数还接受返回的轴基类的关键字参数。
考虑以下示例:
创建不同类型的图表
1. 折线图
折线图是一种图表,显示信息作为一系列的线。图表通过 plot() 函数绘制。折线图很简单;让我们考虑以下示例:
from matplotlib import pyplot as plt
x = [4,8,9]
y = [10,12,15]
plt.plot(x,y)
plt.title("Line graph")
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
输出:
我们可以通过导入样式模块来定制图表。样式模块将内置到 matplotlib 安装中。它包含各种函数,使绘图更具吸引力。在下面的程序中,我们正在使用样式模块:
from matplotlib import pyplot as plt
from matplotlib import style
style.use('ggplot')
x = [16, 8, 10]
y = [8, 16, 6]
x2 = [8, 15, 11]
y2 = [6, 15, 7]
plt.plot(x, y, 'r', label='line one', linewidth=5)
plt.plot(x2, y2, 'm', label='line two', linewidth=5)
plt.title('Epic Info')
fig = plt.figure()
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.legend()
plt.grid(True, color='k')
plt.show()
输出:
在 Matplotlib 中,图形(plt.Figure 类的一个实例)可以被认为是一个单一的容器,包含所有代表轴、图形、文本和标签的对象。
示例-3
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x))
输出:
matplotlib 提供了 fill_between() 函数,用于根据用户定义的逻辑填充线条周围的区域。
示例-4
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x))
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2 * np.pi * x)
y2 = 1.2 * np.sin(4 * np.pi * x)
fig, ax = plt.subplots(1, sharex=True)
ax.plot(x, y1, x, y2, color='black')
ax.fill_between(x, y1, y2, where=y2 >= y1, facecolor='blue', interpolate=True)
ax.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', interpolate=True)
ax.set_title('fill between where')
输出:
2. 柱状图
柱状图是最常见的图表类型之一,用于显示与分类变量相关的数据。Matplotlib 提供了 bar() 来制作柱状图,它接受参数如:分类变量、它们的值和颜色。
from matplotlib import pyplot as plt
players = ['Virat','Rohit','Shikhar','Hardik']
runs = [51,87,45,67]
plt.bar(players,runs,color = 'green')
plt.title('Score Card')
plt.xlabel('Players')
plt.ylabel('Runs')
plt.show()
输出:
另一个函数 barh() 用于制作水平柱状图。它接受 xerr 或 yerr 作为参数(在垂直图的情况下)来表示我们数据的变异性,如下所示:
from matplotlib import pyplot as plt
players = ['Virat','Rohit','Shikhar','Hardik']
runs = [51,87,45,67]
plt.barh(players,runs, color = 'green')
plt.title('Score Card')
plt.xlabel('Players')
plt.ylabel('Runs')
plt.show()
输出:
让我们看看使用 style() 函数的另一个示例:
from matplotlib import pyplot as plt
from matplotlib import style
style.use('ggplot')
x = [5,8,10]
y = [12,16,6]
x2 = [6,9,11]
y2 = [7,15,7]
plt.bar(x, y, color = 'y', align='center')
plt.bar(x2, y2, color='c', align='center')
plt.title('Information')
plt.ylabel('Y axis')
plt.xlabel('X axis')
输出:
通过使用 bottom 参数并定义我们希望在其下面堆叠的柱状图及其值,可以类似地垂直堆叠柱状图。
from matplotlib import pyplot as plt
import numpy as np
countries = ['USA', 'India', 'China', 'Russia', 'Germany']
bronzes = np.array([38, 17, 26, 19, 15])
silvers = np.array([37, 23, 18, 18, 10])
golds = np.array([46, 27, 26, 19, 17])
ind = [x for x, _ in enumerate(countries)]
plt.bar(ind, golds, width=0.5, label='golds', color='gold', bottom=silvers+bronzes)
plt.bar(ind, silvers, width=0.5, label='silvers', color='silver', bottom=bronzes)
plt.bar(ind, bronzes, width=0.5, label='bronzes', color='#CD853F')
plt.xticks(ind, countries)
plt.ylabel("Medals")
plt.xlabel("Countries")
plt.legend(loc="upper right")
plt.title("2019 Olympics Top Scorers")
输出:
3. 饼图
饼图是一种圆形图表,被分割成几个切片或饼状分段。它通常用于表示百分比或比例数据,其中每个饼状分段代表一个特定类别。让我们看看下面的例子:
from matplotlib import pyplot as plt
# Pie chart, where the slices will be ordered and plotted counter-clockwise:
Players = 'Rohit', 'Virat', 'Shikhar', 'Yuvraj'
Runs = [45, 30, 15, 10]
explode = (0.1, 0, 0, 0) # it "explode" the 1st slice
fig1, ax1 = plt.subplots()
ax1.pie(Runs, explode=explode, labels=Players, autopct='%1.1f%%',
shadow=True, startangle=90)
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()
输出:
4. 直方图
首先,我们需要了解条形图和直方图之间的区别。直方图用于显示分布,而条形图则用于比较不同实体。直方图是一种条形图,用于显示一系列值的频率与一系列值范围的比较。
例如,我们取不同年龄组的人的数据,并根据箱体绘制直方图。现在,箱体代表被划分为一系列区间的值范围。箱体通常是大小相同的。
from matplotlib import pyplot as plt
from matplotlib import pyplot as plt
population_age = [21,53,60,49,25,27,30,42,40,1,2,102,95,8,15,105,70,65,55,70,75,60,52,44,43,42,45]
bins = [0,10,20,30,40,50,60,70,80,90,100]
plt.hist(population_age, bins, histtype='bar', rwidth=0.8)
plt.xlabel('age groups')
plt.ylabel('Number of people')
plt.title('Histogram')
plt.show()
输出:
让我们考虑另一个绘制直方图的例子:
from matplotlib import pyplot as plt
# Importing Numpy Library
import numpy as np
plt.style.use('fivethirtyeight')
mu = 50
sigma = 7
x = np.random.normal(mu, sigma, size=200)
fig, ax = plt.subplots()
ax.hist(x, 20)
ax.set_title('Historgram')
ax.set_xlabel('bin range')
ax.set_ylabel('frequency')
fig.tight_layout()
plt.show()
输出:
5. 散点图
散点图主要用于比较变量时,我们需要定义一个变量如何受到另一个变量的影响。数据显示为一系列点。每个点的值代表水平轴上的位置,而另一个变量的值代表垂直轴上的位置。
让我们考虑以下简单例子:
例子-1:
from matplotlib import pyplot as plt
from matplotlib import style
style.use('ggplot')
x = [5,7,10]
y = [18,10,6]
x2 = [6,9,11]
y2 = [7,14,17]
plt.scatter(x, y)
plt.scatter(x2, y2, color='g')
plt.title('Epic Info')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
输出:
例子-2
import matplotlib.pyplot as plt
x = [2, 2.5, 3, 3.5, 4.5, 4.7, 5.0]
y = [7.5, 8, 8.5, 9, 9.5, 10, 10.5]
x1 = [9, 8.5, 9, 9.5, 10, 10.5, 12]
y1 = [3, 3.5, 4.7, 4, 4.5, 5, 5.2]
plt.scatter(x, y, label='high income low saving', color='g')
plt.scatter(x1, y1, label='low income high savings', color='r')
plt.xlabel('saving*100')
plt.ylabel('income*1000')
plt.title('Scatter Plot')
plt.legend()
plt.show()
输出:
6. 3D图形绘制
Matplotlib最初只发展了二维绘图。它的1.0版本在二维显示的基础上开发了一些三维绘图工具,结果是一套方便的3D数据可视化工具。
通过导入mplot3d工具包,可以创建三维图形,该工具包随Matplotlib主安装包一起提供:
from mpl_toolkits import mplot3d
当在程序中导入此模块时,可以通过向任何常规轴创建例程传递关键字projection='3d'来创建三维轴:
让我们看一个简单的3D图
例子-1:
from mpltoolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')_
输出:
例子-2:
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
height = np.array([100,110,87,85,65,80,96,75,42,59,54,63,95,71,86])
weight = np.array([105,123,84,85,78,95,69,42,87,91,63,83,75,41,80])
scatter(height,weight)
fig = plt.figure()
ax = plt.axes(projection='3d')
# This is used to plot 3D scatter
ax.scatter3D(height,weight)
plt.title("3D Scatter Plot")
plt.xlabel("Height")
plt.ylabel("Weight")
plt.title("3D Scatter Plot")
plt.xlabel("Height")
plt.ylabel("Weight")
plt.show()
输出:
注释: 我们可以使用plot3D()来绘制简单的3D线图。
例子-3
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
theta1 = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta1)
y = r * np.cos(theta1)
ax.plot3D(x, y, z, label='parametric curve', color = 'red')
ax.legend()
plt.show()
输出:
Matplotlib的重要函数
函数 | 描述 |
---|---|
plot(x轴值, y轴值) | 用于绘制简单的线图,x轴值对应y轴值。show() 用于显示图形。 |
title("字符串") | 用于设置绘图的标题,由字符串指定。 |
xlabel("字符串") | 用于设置x轴的标签,由字符串指定。 |
ylabel("字符串") | 用于设置y轴的标签,由字符串指定。 |
figure() | 用于控制图形级别的属性。 |
subplots(行数,列数,索引) | 用于向最近的图形添加子图。 |
subtitle("字符串") | 为绘图添加一个公共标题,由字符串指定。 |
subplots(行数,列数,图形大小) | 提供了一种简单的方式来创建子图,在单次调用中返回图形和轴数的元组。 |
set_title("字符串") | 是一个轴级方法,用于设置子图的标题。 |
bar(类别变量, 值, 颜色) | 用于创建垂直条形图。 |
barh(类别变量, 值, 颜色) | 用于创建水平条形图。 |
legend(位置) | 用于制作图例。 |
xtricks(索引, 类别变量) | 用于设置或获取x轴的当前刻度位置标签。 |
pie(值, 类别变量) | 用于创建饼图。 |
hist(值, 箱数) | 用于创建直方图。 |
xlim(开始值, 结束值) | 用于设置x轴的值限制。 |
ylim(开始值, 结束值) | 用于设置y轴的值限制。 |
scatter(x轴值, y轴值) | 用于绘制散点图,x轴值对应y轴值。 |
axes() | 用于向最近的图形添加轴。 |
set_xlabel("字符串") | 是一个轴级方法,用于设置图表的x标签,由字符串指定。 |
set_ylabel("字符串") | 用于设置图表的y标签,由字符串指定。 |
scatter3D(x轴值, y轴值) | 用于绘制三维散点图,x轴值对应y轴值。 |
plot3D(x轴值, y轴值) | 用于绘制三维线图,x轴值对应y轴值。 |
在本教程中,我们学习了matplotlib(Python库),介绍了数据可视化的简要介绍以及数据可视化对于组织做出决策的重要性。我们绘制了不同类型的图形,以图形方式表示数据。