在Python中探索用于可视化的Matplotlib
Matplotlib是Python和数值扩展NumPy的最强大和最流行的绘图库之一。它能够在Python中创建静态、动画和交互式的可视化效果。阅读matplotlib的文档总是很理想的,但可用的信息量可能令人生畏。因此,下面的文章旨在获得对该库的基本了解。此外,我们还将了解该库的使用情况。

NumPy
Numpy是Python的科学计算库。它是一个用C语言编写的高度优化的库,以执行更快的矢量、索引和分布式操作。它允许在图像处理、三维可视化、交互式计算、天文过程、模拟建模等领域进行操作,仅举几例。
NumPy是在当今世界任何计算机化领域中出类拔萃的人必须知道的库。让我们来看看一些最常用的函数。
编码时间
让我们从创建一个numpy数组开始
import numpy as np
a=np.array([1,2,3,4,5])
np.array的输入应该是一个列表。为了在运行时指定数据类型,我们在np.array函数中手动添加参数dtype。
import numpy as np
a=np.array([1,2,3,4,5], dtype='int64')
我们可以创建数组结构。比如说。
import numpy as np
zerosArray = np.zeros((10,2))
onesArray = np.ones((5,6))
randomArray = np.empty((4,5))
上面的函数接收了数组的大小,以元组的形式作为输入。
在绘图过程中,创建等间距的列表是一个通常的问题。因此,我们使用linspace或range来实现同样的效果。
import numpy as np
spacedArray = np.linspace(0,5,10)
# equally spaced array with gap of 0.5
使用linspace要比range好。range在遇到浮点数的时候会出现问题,因为它的内存表示有限。
操作
import numpy as np
elementWiseProduct = np.array([1,2])*np.array([3,4])
matrixProduct = np.array([aa1,2]) @ np.array([3,4])
有许多辅助函数可用。
- 指数
- 正弦
- cos
- 特征值和特征向量
在绘图过程中,我们将经常使用上述函数。
matplotlib
上图中显示的每一个部分都是可变的。人们应该牢记上述功能,以增强和提供更多关于绘图的信息。让我们进入绘图的生成过程。
Matplotlib是一个巨大的库。我们将使用一个子库pyplot来处理我们所有的绘图情况。
关于图的解剖,我们将使用matplotlib提供的内置函数,用于添加解剖标签的目的。没有必要单独研究它们。在需要时,我们会使用它们,它们是不言而喻的。
使用案例
该库被用于许多领域,包括但不限于以下方面。
- 图像处理:修改图像和通过绘制直方图、密度图等来理解图像。
- 信号处理:进行噪声分析、深度估计、各种转换以获得更多的理解。
- 机器学习和数据科学:探索性数据分析和理解数据集。对数据集进行定性,识别异常值。
- 学术研究:科学界创建图谱,以便在会议文件和科学杂志上发表。专业的触觉和开发的便利性增强了使用该库的体验。
让我们从坐标几何学开始。我们将绘制圆、双曲线、抛物线和椭圆。将要介绍的概念是2-D图和3-D图
二维平面图
关键点。
-
np.meshgrid:假设我们想创建一个覆盖两轴上所有点的绘图面。Meshgrid通过接收两个数组作为输入来创建绘图区。
例子。
import numpy as np xline = np.linspace(-5, 5, 10) yline = np.linspace(-5, 5, 10) print(xline,yline) xlineGrid, ylineGrid = np.meshgrid(xline, yline) print(xlineGrid, ylineGrid)打印上面的输出。你会注意到,第二个数组由坐标对组成。这些坐标对适合用于绘图。
-
等高线图。当我们想绘制数据在两个轴上都有变化的图形时,等高线图很有用。我们可以通过给表面着色来表示数据的变化。等高线函数的输入是x变量、y变量和我们想要绘制的变量。
import numpy as np
import matplotlib.pyplot as plt
range = 50
# circle
def plot_circle():
xline = np.linspace(-2 * range, 2 * range, 100)
yline = np.linspace(-2 * range, 2 * range, 100)
xline, yline = np.meshgrid(xline, yline)
circle_eqn = xline**2 + yline**2 - range**2
plt.contour(xline, yline, circle_eqn, [0], cmap='gray')
plt.show()
# ellipse
def plot_ellipse():
xline = np.linspace(-range/4,range/4,100)
yline = np.linspace(-range/4,range/4,100)
xline, yline = np.meshgrid(xline,yline)
x_intercept = 4
y_intercept = 4
ellipse_eqn = (xline - x_intercept)**2/10 + (yline - y_intercept)**2/20 - 1
plt.contour(xline, yline, ellipse_eqn, [0], cmap='gray')
plt.show()
# co-sine wave
def plot_cos():
ax = plt.axes()
xline = np.linspace(-10, 10, 100)
yline = np.linspace(-10, 10, 100)
xline, yline = np.meshgrid(xline, yline)
x_intercept = 1
y_intercept = 1
trig_eqn = np.cos(xline)
plt.contour(xline, trig_eqn, yline, [0], cmap='gray')
plt.show()
plot_circle()
plot_ellipse()
plot_cos()
3-D绘图
我们使用 pyplot 中的 axes 函数,并将投影参数设置为 3d 来绘制三维图。
import numpy as np
import matplotlib.pyplot as plt
range = 50
# parabola
def plot_parabola():
ax = plt.axes(projection='3d')
xline = np.linspace(-range,range,100)
yline = np.linspace(-range,range,100)
x_intercept = 4
y_intercept = 4
parabola_eqn = 1 * (xline - x_intercept)**2 + 1
plt.plot(xline, parabola_eqn)
plt.show()
# hyperbola
def plot_hyperbola():
ax = plt.axes(projection='3d')
xline = np.linspace(-4*range,4*range,100)
yline = np.linspace(-4*range,4*range,100)
xline, yline = np.meshgrid(xline,yline)
x_intercept = 1
y_intercept = 1
hyperbola_eqn = ((yline - y_intercept)**2)/10 - ((xline - x_intercept)**2 )/4 - 1
plt.contour(xline,yline,hyperbola_eqn,[0], cmap = 'gray')
plt.show()
plot_hyperbola()
plot_parabola()
数据分析图表
通常情况下,在数据分析和可视化中,会使用一些图表。例如,柱状图、线形图、直方图、散点图、饼状图等等,matplotlib可以实现所有这些图表以及更多。让我们分别来实现每一种。
条形图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
numberOfPoints = 11
rangeX = np.linspace(0, 50, numberOfPoints)
data = np.random.rand(numberOfPoints-1) * 4.0
barWidth = 3.0
middleValue = (rangeX[0:-1] +
rangeX[1:]) * 0.5 - barWidth * 0.5
plt.bar(middleValue,
data,
facecolor='chocolate',
width=barWidth,
label='barChart')
plt.xticks(middleValue)
plt.xlabel('X')
plt.ylabel('Count')
plt.title('A Bar Chart')
plt.grid(True)
plt.legend()
plt.show()
线形图
plt.plot()函数接收参数(x,y),其中x代表x轴上的数据点,y代表y轴上的数据点。索引决定了绘图的顺序。
import matplotlib.pyplot as plt
year = [1920,1930,1940,1950,1960,1970,1980,1990,2000,2010]
population = [0.8,0.88,0.9,1.4,1.8,2.5,3.2,5.5,6.0,6.8]
plt.plot(year,population)
plt.title('Population versus Years')
plt.xlabel('Year')
plt.ylabel('Population')
plt.show()
柱状图
在直方图中,数据集的总范围被划分为相等的部分。这些相等的部分被称为仓,也被称为类区间。
数据集中的每一个观测值都被放置在其各自的仓中。属于某个仓的观察值的数量被定义为频率。一个数据点只能占据一个bin。在pyplot.hist函数中,bin被指定为一个参数。
import numpy as np
import matplotlib.pyplot as plt
# Let's generate random data
x=np.random.rand(10000)*10
y= 0.9 *x + np.random.rand(10000)*10 + 2
fig, axis = plt.subplots(1,2)
axis[0].hist(x, bins=10)
axis[1].hist(y, bins=10)
plt.show()
直方图的缺点是,在改变仓位时,直方图会完全改变。它在很大程度上依赖于bins参数。因此,最好是使用密度图。
散点图
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(100)
y = np.random.rand(100)
plt.scatter(x, y, alpha=0.5)
plt.show()
我们同时可以通过添加一个叫做s的参数来改变点的大小,这个参数代表点的面积。更新后的代码看起来像这样。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(100)
y = np.random.rand(100)
area = (30 * np.random.rand(100))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, alpha=0.5)
plt.show()
饼图
饼图是一种方便的可视化图表,大多数演示文稿中都有。 matplotlib允许嵌套图表,以及颜色和形状方面的定制。我们选择默认的圆形选项。
import matplotlib.pyplot as plt
labels = 'Web Dev', 'ML& AI', 'Networking', 'System Architect'
industryPercentage = [25, 50, 5, 10]
fig1, ax1 = plt.subplots()
ax1.pie(industryPercentage,
labels=labels)
ax1.axis('equal') # To obtain the chart as a circle
plt.show()
总结
在这篇文章中,我们已经介绍了matplolib的大部分功能。从这里开始,我们鼓励你尽可能地建立更多很酷的数据可视化项目。有了新获得的numpy和matplotlib的知识,天空是无限的。