在Python中探索用于可视化的Matplotlib

99 阅读6分钟

在Python中探索用于可视化的Matplotlib

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

Parts-Figure

资料来源

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

Parts-Figure 来源

上图中显示的每一个部分都是可变的。人们应该牢记上述功能,以增强和提供更多关于绘图的信息。让我们进入绘图的生成过程。

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的知识,天空是无限的。