在 Python 中使用 Matplotlib 进行数据可视化

320 阅读10分钟

         Matplotlib是一个广泛使用的Python库,用于创建静态、动画和交互式数据可视化。它建立在NumPy之上,能够轻松处理大型数据集,以创建各种类型的图表,如折线图、柱状图、散点图等。这些可视化通过图表清晰地展示数据,帮助我们更好地理解数据。在本文中,我们将了解如何在Matplotlib中创建不同类型的图表并对其进行自定义。

安装用于数据可视化的Matplotlib

        要安装 Matplotlib,我们使用 pip 命令。

pip install matplotlib

        如果我们在 Jupyter Notebook 中工作,可以通过运行以下命令在笔记本单元格内直接安装 Matplotlib:

!pip install matplotlib

使用Matplotlib的Pyplot进行数据可视化

        Matplotlib提供了一个名为pyplot的模块,该模块提供了类似于MATLAB,用于创建绘图和图表。它通过提供一系列处理常见绘图任务的函数,简化了生成各种类型可视化的过程。

1. 折线图

        折线图是基本图表类型之一,可以使用plot()函数创建。它用于在不同坐标轴上表示两个数据X和Y之间的关系。

matplotlib.pyplot.plot(x, y, color=None, linestyle='-', marker=None, linewidth=None, markersize=None)

import matplotlib.pyplot as plt

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

plt.plot(x, y)

plt.title("Line Chart")

plt.ylabel('Y-Axis')

plt.xlabel('X-Axis')
plt.show()

​编辑

2. 条形图

        条形图是一种图表,它用矩形条来表示数据类别,矩形条的长度和高度与它们所代表的值成比例。条形图可以水平绘制,也可以垂直绘制。它描述了不同类别之间的比较,可以使用bar()方法创建。 

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, linewidth=None)

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['day']
y = data['total_bill']

plt.bar(x, y)

plt.title("Bar chart")

plt.ylabel('Total Bill')

plt.xlabel('Day')

plt.show()

​编辑

3. 直方图

        直方图用于以分组的形式展示数据。它是一种柱状图,其中X轴表示区间范围,而Y轴表示频率信息。hist()函数用于查找并创建x的直方图。 

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, color=None, edgecolor=None, alpha=None)

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['total_bill']

plt.hist(x)

plt.title("Histogram")

plt.ylabel('Frequency')

plt.xlabel('Total Bill')

plt.show()

​编辑

4. 散点图

        散点图用于观察变量之间的关系。matplotlib库中的scatter()方法用于绘制散点图。 

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, linewidths=None, edgecolors=None, alpha=None)

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['day']
y = data['total_bill']

plt.scatter(x, y)

plt.title("Scatter Plot")

plt.ylabel('Total Bill')

plt.xlabel('Day')

plt.show()

​编辑

5. 饼图

        饼图是一种圆形图表,仅用于展示一组数据。饼图扇形区域的面积代表数据各部分的百分比。饼图的扇形被称为楔形。它可以使用pie()方法创建。  

matplotlib.pyplot.pie(data, explode=None, labels=None, colors=None, autopct=None, shadow=False)

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

cars = ['AUDI', 'BMW', 'FORD',
        'TESLA', 'JAGUAR',]
data = [23, 10, 35, 15, 12]

plt.pie(data, labels=cars)

plt.title(" Pie Chart")

plt.show()

​编辑

6. 箱线图

        箱线图也称为须状图,它是一种基于五个数值汇总(最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值)来展示数据分布的标准方式。它还可以显示异常值。 

matplotlib.pyplot.boxplot(x, notch=False, vert=True, patch_artist=False, showmeans=False, showcaps=True, showbox=True)

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(10)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

plt.boxplot(data, vert=True, patch_artist=True, 
            boxprops=dict(facecolor='skyblue'),
            medianprops=dict(color='red'))

plt.xlabel('Data Set')
plt.ylabel('Values')
plt.title('Box Plot')
plt.show()

​编辑

        该盒子表示四分位距(IQR),盒子内部的线条表示中位数,延伸至从第一四分位数和第三四分位数起1.5倍四分位距范围内的最小值和最大值。任何超出此范围的点都被视为异常值,并以单个点的形式绘制。  

 7. 热力图

        热力图以矩阵形式呈现数据,其中每个单独的值都用颜色表示。它们有助于在二维平面上可视化多个特征的量级,并识别模式、相关性和聚集情况。

matplotlib.pyplot.imshow(X, cmap=None, interpolation=None, aspect=None)

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
data = np.random.rand(10, 10)

plt.imshow(data, cmap='viridis', interpolation='nearest')

plt.colorbar()

plt.xlabel('X-axis Label')
plt.ylabel('Y-axis Label')
plt.title('Heatmap')

plt.show()

​编辑

        侧边的颜色条提供了一个用于解读颜色的刻度,颜色越深表示数值越低,颜色越浅表示数值越高。这种图表用于数据分析、生物信息学和金融等领域,以可视化矩阵中数据的相关性和分布情况。  

如何自定义Matplotlib可视化效果?

        Matplotlib 提供了多种方式来定制和美化我们的图表。我们可以更改颜色、添加标签、调整样式等等。通过将这些定制技巧应用于基本图表,我们可以使我们的可视化效果更清晰、信息更丰富。

1. 定制折线图

        我们可以使用以下属性自定义折线图:

  •         颜色:更改线条颜色
  •         线宽:调整线条宽度
  •         标记:更改绘制点的样式
  •         标记大小:更改标记的大小
  •         线条样式:定义线条样式,如实线、虚线等
import matplotlib.pyplot as plt

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

plt.plot(x, y, color='green', linewidth=3, marker='o', 
         markersize=15, linestyle='--')

plt.title("Customizing Line Chart")

plt.ylabel('Y-Axis')

plt.xlabel('X-Axis')

plt.show()

 ​编辑

2. 定制柱状图

        通过以下定制方式,可以使柱状图更具信息性和视觉吸引力:

  • 颜色:柱子的填充颜色
  • 边缘颜色:柱子边缘的颜色
  • 线宽:边缘的粗细
  • 宽度:每个柱子的宽度 
import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['day']
y = data['total_bill']

plt.bar(x, y, color='green', edgecolor='blue', 
        linewidth=2)

plt.title("Customizing Bar Chart")

plt.ylabel('Total Bill')

plt.xlabel('Day')

plt.show()

 ​编辑

        条形图之间的线条对应于每个X轴类别在Y轴上的值。 

3. 自定义直方图绘制

        为了使直方图绘制更有效,我们可以进行各种自定义设置:

  • 箱数(Bins):将数据划分成的组(箱)数
  • 颜色(Color):条形图填充颜色
  • 边缘颜色(Edgecolor):条形图边缘颜色
  • 线条样式(Linestyle):边缘的样式,如实线、虚线等
  • 透明度(Alpha):透明度级别(0 = 透明,1 = 不透明)
import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['total_bill']

plt.hist(x, bins=25, color='green', edgecolor='blue',
         linestyle='--', alpha=0.5)

plt.title(" Customizing Histogram Plot")

plt.ylabel('Frequency')

plt.xlabel('Total Bill')

plt.show()

 ​编辑

 4. 定制散点图

        散点图可以通过以下方式进行增强:

  • S:标记大小(单个值或数组)
  • C:标记的颜色或颜色序列
  • Marker:标记样式,如圆形、菱形等
  • Linewidths:标记边框的宽度
  • Edgecolor:标记边框的颜色
  • Alpha:混合值,介于0(透明)和1(不透明)之间
import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

x = data['day']
y = data['total_bill']

plt.scatter(x, y, c=data['size'], s=data['total_bill'],
            marker='D', alpha=0.5)

plt.title("Customizing Scatter Plott")

plt.ylabel('Total Bill')

plt.xlabel('Day')

plt.show()

 ​编辑

5. 定制饼图

        为了使我们的饼图更有效且具有视觉吸引力,我们考虑进行以下定制:

  • 分离:移动图表中的扇形块
  • 自动百分比标注:用数值标记扇形块
  • 颜色:扇形块的颜色
  • 阴影:用于创建阴影效果  
import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('/content/tip.csv')

cars = ['AUDI', 'BMW', 'FORD',
        'TESLA', 'JAGUAR',]
data = [23, 13, 35, 15, 12]

explode = [0.1, 0.5, 0, 0, 0]

colors = ( "orange", "cyan", "yellow",
          "grey", "green",)

plt.pie(data, labels=cars, explode=explode, autopct='%1.2f%%',
        colors=colors, shadow=True)

plt.show()

 ​编辑

Matplotlib的核心组件:Figure)和Axes

        在继续之前,让我们先了解一下与Matplotlib一起使用时非常重要的两个类。

1. 图形(Figure)类

        图形类就像是整个画布或窗口,所有绘图都在其中绘制。可以将其视为一个整体页面或框架,其中可以包含一个或多个绘图。我们可以使用 figure() 函数创建一个图形。它控制整个绘图区域的大小、背景颜色和其他属性。  

matplotlib.figure.Figure(figsize=None, dpi=None, facecolor=None, edgecolor=None, linewidth=0.0, ...)

import matplotlib.pyplot as plt
from matplotlib.figure import Figure

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

fig = plt.figure(figsize =(7, 5), facecolor='g',
                 edgecolor='b', linewidth=7)

ax = fig.add_axes([1, 1, 1, 1])

ax.plot(x, y)

plt.title("Linear graph", fontsize=25, color="yellow")

plt.ylabel('Y-Axis')
plt.xlabel('X-Axis')

plt.ylim(0, 80) 

plt.xticks(x, labels=["one", "two", "three", "four"])

plt.legend(["GFG"])

plt.show()

​编辑

2. 坐标轴类

        坐标轴类代表实际的绘图区域,数据将在此区域绘制。在图形中创建绘图或子图时,它是最基本且最灵活的。单个图形可以包含多个坐标轴,但每个坐标轴对象仅属于一个图形。我们可以使用axes()函数创建一个坐标轴对象。 

axes([left, bottom, width, height])

        与pyplot类似,Axes类提供了用于自定义绘图的方法,其中包括:

  • ax.set_title():为绘图添加标题 ax.set_xlabel()、
  • ax.set_ylabel():为X轴和Y轴添加标签
  • ax.set_xlim()、ax.set_ylim():设置坐标轴的范围
  • ax.set_xticklabels()、ax.set_yticklabels():自定义刻度标签
  • ax.legend():添加一个图例来描述绘图元素
import matplotlib.pyplot as plt
from matplotlib.figure import Figure

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

fig = plt.figure(figsize = (5, 4))
ax = fig.add_axes([1, 1, 1, 1])

ax1 = ax.plot(x, y)
ax2 = ax.plot(y, x)

ax.set_title("Linear Graph")

ax.set_xlabel("X-Axis")
ax.set_ylabel("Y-Axis")

ax.legend(labels = ('line 1', 'line 2'))

plt.show()

 ​编辑

子图可视化的高级技巧

        我们已经学习了如何向图表添加基本元素以展示更多信息。一种方法是像上面示例中那样,反复调用 plot 函数,并传入不同的数值集。现在,让我们看看如何使用一些Matplotlib函数在一个图形中绘制多个图表,以及如何创建子图。

使用 add_axes()、add_axes() 方法

        我们在Matplotlib中手动向图形添加坐标轴。它接受一个包含四个值 [left, bottom, width, height]的列表,用于指定坐标轴的位置和大小。  

import matplotlib.pyplot as plt
from matplotlib.figure import Figure

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

fig = plt.figure(figsize =(5, 4))

ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])

ax2 = fig.add_axes([1, 0.1, 0.8, 0.8])

ax1.plot(x, y)
ax2.plot(y, x)

plt.show()

​编辑

使用 subplot() 方法

将一个绘图添加到当前图形中指定的网格位置。它接受三个参数:行数、列数和绘图索引。

import matplotlib.pyplot as plt

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

plt.figure()

plt.subplot(121)
plt.plot(x, y)

plt.subplot(122)
plt.plot(y, x)

 ​编辑

使用subplot2grid()

subplot2grid() 会在网格内的指定位置创建轴对象,并且有助于将轴对象跨越多行或多列。 

import matplotlib.pyplot as plt

x = [10, 20, 30, 40]
y = [20, 25, 35, 55]

axes1 = plt.subplot2grid (
(7, 1), (0, 0), rowspan = 2, colspan = 1)

axes2 = plt.subplot2grid (
(7, 1), (2, 0), rowspan = 2, colspan = 1)

axes1.plot(x, y)
axes2.plot(y, x)

​编辑

使用savefig()保存图表

        当我们使用Matplotlib创建图表时,有时我们希望将它们保存为图像文件,以便日后在报告、PPT中使用,或者与他人分享。Matplotlib提供了savefig()方法,用于将当前图表保存到计算机上的文件中。我们只需更改文件扩展名,就可以将图表保存为不同的格式,如.png、.jpg、.pdf、.svg等。  

import matplotlib.pyplot as plt

year = ['2010', '2002', '2004', '2006', '2008']
production = [25, 15, 35, 30, 10]

plt.bar(year, production)

plt.savefig("output.jpg")

plt.savefig("output1", facecolor='y', bbox_inches="tight",
            pad_inches=0.3, transparent=True)

​编辑