Matplotlib

Matplotlib

Yiuhang Chan

Matplotlib

Matplotlib 是一个广泛用于 Python 中的绘图库,它可以帮助我们创建各种图表和图形,适用于数据可视化。

安装 Matplotlib

为了安装 Matplotlib,我们首先确保 Python 和 pip(Python 的包安装器)已经安装在系统上。接着可以通过下面的命令来安装或更新 Matplotlib:

1
2
3
4
5
# 首先,更新 pip 到最新版本
python -m pip install --upgrade pip

# 然后,使用 pip 安装 Matplotlib
python -m pip install matplotlib

注意,如果使用的是 Linux 或 macOS 系统,可能需要使用 python3pip3 命令替代 pythonpip

导入 Matplotlib

安装完成后,我们可以通过以下方式导入 Matplotlib:

1
import matplotlib

实际上,更常见的做法是导入 matplotlib.pyplot,这是一个提供了类似 MATLAB 接口的绘图模块:

1
import matplotlib.pyplot as plt

Matplotlib Pyplot 常用函数

Pyplot 模块提供了很多用于创建和操作图形的函数。以下是一些常用的 Pyplot 函数:

  • plot():这是最常用的函数之一,用于绘制点和线。例如,plt.plot(x, y) 会绘制 x 对 y 的图。

  • scatter():这个函数专门用于创建散点图。例如,plt.scatter(x, y) 会创建 x 和 y 数据点的散点图。

  • bar():这个函数用来创建条形图。例如,plt.bar(x, height) 会在 x 的位置创建条形图,其中 height 是条形的高度。

  • hist():此函数用于绘制直方图,是数据分布可视化的重要工具。例如,plt.hist(data) 会绘制 data 的直方图。

  • pie():这个函数用于绘制饼图,常用于显示部分整体的比例关系。例如,plt.pie(sizes) 会根据 sizes 的比例绘制一个饼图。

  • imshow():这个函数常用于显示图像,特别是在处理图像数据的时候。例如,plt.imshow(image) 会显示一个图像数组。

  • subplots():此函数用于创建一个包含多个子图的图形。例如,fig, ax = plt.subplots() 创建一个新的图形和一个子图。

简单示例

下面是一个简单的 Matplotlib Pyplot 使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import matplotlib.pyplot as plt

# 准备数据
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]

# 创建图表
plt.figure(figsize=(8, 6))

# 绘制线图
plt.plot(x, y, label='Line')

# 绘制散点图
plt.scatter(x, y, color='red', label='Scatter')

# 添加标题和标签
plt.title('Sample Plot')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')

# 显示图例
plt.legend()

# 展示图形
plt.show()

高级功能

  • 图形风格:Matplotlib 允许选择多种预设的风格,例如 plt.style.use('ggplot')

  • 保存图形:可以使用 plt.savefig('filename.png') 将图形保存到文件中。

  • 交互式模式:Matplotlib 还可以创建交互式图形,使用 plt.ion() 开启交互模式。

完整制作示例

制作图表是数据分析中一项重要的工作,它有助于从视觉上展现和理解数据。提供的步骤是图表制作的基本流程,包括了从导入库到设置xy轴数据,以及绘制和显示图形。现在我们就来细化这个流程,并添加一些细节和扩展,使其更为完整和专业。

步骤1:导入必要的库

1
2
3
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

这一步导入了创建图表所需的主要 Python 库:matplotlib 用于绘图,numpy 用于处理数值数据,pandas 用于读取和处理数据文件。

步骤2:设置xy轴数据

方法1:使用 Numpy 创建数据

1
2
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])

这个方法是手动创建数据,适合理解绘图的基础概念或当有一些固定的数据点时使用。

方法2:从数据文件导入

1
2
3
4
5
6
7
8
9
# 从 CSV 文件中读取数据
open_df = pd.read_csv('./财务差旅人员费用分析.csv')
xpoints = open_df['姓名']
ypoints = open_df['金额']

# 另一个例子
df = pd.read_csv('./年龄段借款情况.csv')
xpoints = df['年龄']
ypoints = df['已还清']

在实际应用中,数据通常来源于数据集,因此使用 Pandas 读取和处理数据是非常常见的。

步骤3:绘制图形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 绘制基础的线图
plt.plot(xpoints, ypoints)

# 设置图表的标题和轴标签
plt.title('Loan Status by Age')
plt.xlabel('Age')
plt.ylabel('Loans Paid Off')

# 显示图例
plt.legend(['Loans Paid Off'])

# 在图表中添加网格
plt.grid(True)

# 设置轴的范围
plt.xlim(0, 100)
plt.ylim(0, 120)

# 展示图形
plt.show()

这一步创建了图形,并对其进行了一些基础的格式设置,包括添加标题、轴标签、图例和网格,这使图表更易于理解和分析。

扩展和细节

  • 样式定制:可以通过添加颜色、线型和标记样式来定制图形的外观,如 plt.plot(xpoints, ypoints, 'o:r'),表示圆圈标记、虚线和红色。

  • 多系列绘制:可以在同一个图中绘制多个数据系列,以对比不同数据集,如通过多次调用 plt.plot()

  • 子图:使用 plt.subplots() 创建一个包含多个子图的图形布局。

  • 保存图形:使用 plt.savefig('filename.png') 将图形保存到文件中。

  • 其他图形类型:除了线图,还可以使用 plt.bar(), plt.scatter(), plt.hist() 等函数来创建条形图、散点图和直方图等。

通过以上步骤,我们可以创建一个简单但完整的图表。在实践中,可能需要根据数据的具体情况和分析目的进行更多的定制和调整。使用 Matplotlib,可以灵活地制作出满足不同需求的图表。

图表的属性能够帮助我们创建更为精细和吸引人的视觉效果,这对于数据的呈现和解释非常重要。以下是有关如何使用 Matplotlib 的一些详细和专业的笔记,涵盖了图表窗口的创建和自定义,以及如何使用标记来突出数据点。

图表属性

画布

1
2
3
4
5
6
import matplotlib.pyplot as plt

# 创建一个新的图形窗口并设置尺寸
plt.figure(figsize=(8, 6), dpi=150, facecolor='white', edgecolor='black', tight_layout=True, num='Window 1')
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.show()

画布属性说明:

  • figsize: 设置图形窗口的尺寸,单位为英寸。更大的尺寸可以让图表更清晰地显示更多的细节。
  • dpi: 分辨率(每英寸点数),默认通常为 100 或 80。增加此值可以获得更高清的图形。
  • facecoloredgecolor: 分别用于设置图形窗口的背景色和边框颜色。
  • tight_layout: 当设置为 True 时,它会自动调整子图参数,以便子图填满图形窗口的整个画布区域。
  • num: 当你需要创建多个图形窗口时,使用此参数给图形命名或编号。

Marker

plt.plot() 中使用 marker 参数可以突出显示每个数据点,提高图表的可读性,特别是在绘制散点图或者需要标示数据点的场景中。

1
2
3
4
5
6
xpoints = [1, 2, 3, 4]
ypoints = [1, 4, 9, 16]

# 绘制带有自定义标记的线图
plt.plot(xpoints, ypoints, marker='o', ms=20, mfc='r', mec='b')
plt.show()

Marker 相关属性说明:

  • marker: 定义数据点的标记类型,如 'o' 表示圆圈。
  • ms (markersize): 标记的大小。
  • mfc (markerfacecolor): 标记内部的颜色。
  • mec (markeredgecolor): 标记边框的颜色。

扩展属性

  • 线条样式: 通过 linestyle 或简写 ls 参数定义线条的样式,如 '--' 表示虚线。

    1
    plt.plot(xpoints, ypoints, linestyle='--')
  • 线条宽度: 使用 linewidth 或简写 lw 参数定义线条的宽度。

    1
    plt.plot(xpoints, ypoints, linewidth=2)
  • 颜色: 通过 color 参数指定线条的颜色。

    1
    plt.plot(xpoints, ypoints, color='green')
  • 文本和注释: 使用 plt.text() 在图表中添加文本,使用 plt.annotate() 在图表中添加注释。

    1
    2
    plt.text(1, 15, 'Sample Text', fontsize=12)
    plt.annotate('Important Point', xy=(2, 4), xytext=(3, 5), arrowprops=dict(arrowstyle='->'))
  • 坐标轴范围: 使用 plt.xlim()plt.ylim() 设置坐标轴的范围。

    1
    2
    plt.xlim(0, 5)
    plt.ylim(0, 20)
  • 坐标轴标签: 使用 plt.xlabel()plt.ylabel() 给坐标轴添加标签。

    1
    2
    plt.xlabel('X Axis Label')
    plt.ylabel('Y Axis Label')
  • 图表标题: 使用 plt.title() 添加图表的标题。

    1
    plt.title('Chart Title')

在 Matplotlib 中,线条样式和宽度是定义图表外观的关键属性,它们可以帮助我们区分图中的不同数据系列或者强调某些数据点。下面详细说明了如何设置线条样式和宽度。

线条样式

linestyle 或简写 ls 参数用来定义线条的样式。这个参数可以接受多种不同的值,以改变线条的显示方式。

linestyle 的可用样式:

  • '-''solid': 实线
  • '--''dashed': 虚线
  • '-.''dashdot': 点划线
  • ':''dotted': 点线
  • '''None': 无线条

示例代码:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

xpoints = [0, 1, 2, 3]
ypoints = [0, 3, 6, 9]

# 使用点线样式
plt.plot(xpoints, ypoints, linestyle=':')
plt.show()

线条宽度

linewidth 或简写 lw 参数用来定义线条的宽度,可以是任何浮点数。线宽越大,线条越粗。

示例代码:

1
2
3
# 使用线宽为10的实线
plt.plot(xpoints, ypoints, linestyle='-', linewidth=10)
plt.show()

请注意,linewidth 的值不应该是字符串,因此 lw='10' 需要改为 lw=10

颜色

除了线条样式和宽度,我们还可以通过 color 参数来定义线条的颜色。颜色可以是 CSS 颜色的名称(如 'blue''green' 等),也可以是十六进制颜色代码(如 '#008000')或 RGB 元组(如 (0, 0.5, 0))。

示例代码:

1
2
3
# 使用绿色线条
plt.plot(xpoints, ypoints, color='green')
plt.show()

扩展属性

  • 坐标轴刻度: 使用 plt.xticks()plt.yticks() 设置坐标轴的刻度。

    1
    2
    plt.xticks([0, 1, 2, 3, 4])
    plt.yticks([0, 5, 10, 15, 20])
  • 网格线: 使用 plt.grid() 添加网格线,提高图表的可读性。

    1
    plt.grid(True)
  • 保存图表: 使用 plt.savefig() 保存图表到文件,支持多种格式,如 PNG、JPEG、SVG、PDF 等。

    1
    plt.savefig('my_plot.png')

在 Matplotlib 中,色彩、多线条绘制、图表的标签和标题都是用来增强图表表达能力的重要元素。以下是对你所提供内容的整理和扩展。

颜色(Color)

color 参数用于定义线条的颜色。可以使用多种方法来指定颜色,例如使用预定义的颜色码(如 'r' 表示红色)或者 CSS 颜色名称。

示例代码:

1
2
plt.plot(xpoints, ypoints, color='red') # 或者使用 'r'
plt.show()

多线条(Multiple Lines)

在同一个图表中绘制多条线可以帮助我们比较不同数据集之间的关系。

示例代码:

1
2
3
4
plt.plot(xpoints, ypoints1, marker='o', linestyle=':', linewidth=1, label='Paid Off')
plt.plot(xpoints, ypoints2, marker='o', linestyle=':', linewidth=1, label='Overdue')
plt.legend()
plt.show()

这里,每条 plot 命令绘制了一组数据点,label 参数用于定义每条线的图例名称。

标签和标题(Labels and Title)

使用 xlabel(), ylabel(), 和 title() 方法来设置 x 轴、y 轴标签和图表的标题。

标题与标签的定位:

可以指定标题和标签在轴上的位置,以提高图表的美观度或强调某部分内容。

1
2
3
4
5
plt.title("Title", loc='left')
plt.xlabel("X Label", loc='center')
plt.ylabel("Y Label", loc='bottom')
plt.plot(x, y)
plt.show()

loc 参数用于设置对齐方式。

标签设置(Setting Line Labels)

为了区分图中的多条线,我们可以给每条线添加标签,然后用 legend() 方法显示图例。

1
2
3
4
plt.plot(xpoints, ypoints1, label='Paid Off')
plt.plot(xpoints, ypoints2, label='Overdue')
plt.legend()
plt.show()

扩展和细节:

  • 字体大小和样式:可以通过 fontsizefontweight 参数来调整标签和标题的字体大小和粗细。

    1
    plt.title("Title", loc='left', fontsize=14, fontweight='bold')
  • 图例位置和样式legend() 方法接受 loc 参数来指定图例的位置,例如 'upper right''lower left' 等。还可以设置边框和背景。

    1
    plt.legend(loc='upper right', frameon=False)  # frameon=False 去除图例边框
  • 设置网格grid() 函数可用于添加网格线,提高图表的可读性。

    1
    plt.grid(color='gray', linestyle='--', linewidth=0.5)
  • 坐标轴刻度格式:可以使用 xticks()yticks() 方法来定制轴刻度的显示方式。

    1
    plt.xticks(rotation=45)  # X轴刻度标签旋转45度
  • 坐标轴范围:使用 xlim()ylim() 设置轴的范围,更精确地控制图表中显示的数据范围。

    1
    2
    plt.xlim(0, 10)
    plt.ylim(0, 20)
  • 保存图表:使用 savefig() 方法,可以将图表保存到文件中,如 PNG、PDF、SVG等格式。

    1
    plt.savefig('my_chart.png', dpi=300, bbox_inches='tight')

多图布局

创建多图

在Python的matplotlib库中,subplot()subplots()方法是绘制多图布局中非常重要的工具。这些方法允许我们在一个画布(canvas)上创建多个子图(subplots)。下面,我将对你提供的笔记进行整理和修正,确保其内容既准确又专业。

subplot()

subplot()方法用于在画布上创建单个子图。其使用方式如下:

  • subplot(nrows, ncols, index, **kwargs): 将画布分为nrows行和ncols列,index确定子图的位置。
  • subplot(pos, **kwargs): pos参数可以是三位数字,分别表示行数、列数和索引位置。
  • subplot(**kwargs): 直接通过关键字参数来指定布局和位置。
  • subplot(ax): 允许在已存在的轴对象ax上创建子图。

在使用subplot()时,整个绘图区域被分成nrows行和ncols列,然后从左到右、从上到下对每个子区域进行编号(1到N)。左上的子区域编号为1,右下的区域编号为N。可以通过index参数指定子图的具体位置。

创建多图示例

示例1: 1x2布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt

# 设置画布大小和分辨率
plt.figure(figsize=(10, 8), dpi=120)

# 第一个子图:借款笔数占比
plt.subplot(1, 2, 1)
x = df['年龄']
y = df['借款笔数占比']
plt.plot(x, y)
plt.title("借款笔数占比")

# 第二个子图:已还清占比
plt.subplot(1, 2, 2)
x = df['年龄']
y = df['已还清占比']
plt.plot(x, y)
plt.title("已还清占比")

plt.suptitle("借款情况分析")
plt.show()

示例2: 2x2布局

在2x2的布局中,我们可以创建4个子图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import matplotlib.pyplot as plt

# 设置画布大小和分辨率
plt.figure(figsize=(10, 8), dpi=120)

# 第一个子图:年龄段已还清人数
plt.subplot(2, 2, 1)
x = df['年龄']
y = df['已还清']
plt.plot(x, y, marker='v', color='green', ls='-.')
plt.title("年龄段已还清人数")

# 第二个子图:年龄段历史借款次数
plt.subplot(2, 2, 2)
x = df['年龄']
y = df['历史成功借款次数']
plt.plot(x, y, marker='v', color='purple', ls='-')
plt.title("年龄段历史借款次数")

# 第三个子图:年龄段正常还款
plt.subplot(2, 2, 3)
x = df['年龄']
y = df['正常还款中']
plt.plot(x, y, marker='x', color='brown', ls=':')
plt.title("年龄段正常还款")

# 第四个子图:年龄段借款金额
plt.subplot(2, 2, 4)
x = df['年龄']
y = df['借款金额']
plt.plot(x, y, marker='X', color='orange', ls='-')
plt.title("年龄段借款金额")

plt.suptitle("年龄段借款情况")
plt.show()

在上述示例中,plt.figure()用于设置整个画布的大小和分辨率,而plt.subplot()用于创建并定位子图。我们可以通过调整markercolorls(线型)参数来美化图表。

接下来,我们将讨论如何在Matplotlib中共享x轴以及调整多图之间的间距,这对于创建清晰、易于理解的视觉表示特别重要。

共享X轴

在某些情况下,我们可能需要在同一图表中显示两组数据,这些数据共享x轴但有不同的y轴。这可以通过使用ax.twinx()方法来实现,它允许我们为同一个x轴创建一个新的y轴。

单图示例

在单个图表中展示两组数据,共享x轴:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import matplotlib.pyplot as plt

# 创建第一个轴对象
ax1 = plt.subplot()
ax2 = ax1.twinx() # 创建共享x轴的第二个轴对象

x = df['年龄']
y1 = df['已还清']

# 在第一个轴上绘制数据
ax1.plot(x, y1, marker='v', color='green', ls='-.')
ax1.set_ylabel('已还清', color='green')

y2 = df['历史成功借款次数']

# 在第二个轴上绘制数据
ax2.plot(x, y2, marker='v', color='purple', ls='-')
ax2.set_ylabel('历史成功借款次数', color='purple')

# 设置共享x轴的标签
ax1.set_xlabel('年龄')

plt.show()

多图示例

在一个画布上绘制两个图表,每个图表中都展示两组数据,共享x轴:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import matplotlib.pyplot as plt

# 第一个图表
ax1 = plt.subplot(1, 2, 1)
ax2 = ax1.twinx()

x = df['年龄']
y1 = df['已还清']

ax1.plot(x, y1, marker='v', color='green', ls='-.')
ax1.set_ylabel('已还清', color='green')

y2 = df['历史成功借款次数']

ax2.plot(x, y2, marker='v', color='purple', ls='-')
ax2.set_ylabel('历史成功借款次数', color='purple')

ax1.set_xlabel('年龄')

# 第二个图表
ax1 = plt.subplot(1, 2, 2)
ax2 = ax1.twinx()

y1 = df['借款金额']

ax1.plot(x, y1, marker='v', color='green', ls='-.')
ax1.set_ylabel('借款金额', color='green')

y2 = df['逾期中']

ax2.plot(x, y2, marker='v', color='purple', ls='-')
ax2.set_ylabel('逾期中', color='purple')

ax1.set_xlabel('年龄')

plt.show()

注意:在第二个图表中,y轴的标签需要根据实际数据进行相应的修改。

调整多图之间的间距

当在一个画布上绘制多个子图时,可能需要调整它们之间的间距以避免标签和图表元素的相互重叠。这可以通过plt.subplots_adjust()方法实现:

1
2
3
4
5
# 调整子图之间的水平间距
plt.subplots_adjust(wspace=0.5)

# 调整子图之间的垂直间距
plt.subplots_adjust(hspace=0.5)

wspacehspace参数控制子图之间的宽度和高度的间距,值为比例(相对于子图宽度和高度的比例)。

柱状图是数据可视化中常用的图表类型,适用于展示不同类别间的比较。在Matplotlib中,使用plt.bar()plt.barh()可以分别绘制垂直和水平的柱状图。以下是如何在Matplotlib中创建和自定义柱状图的详细说明。

基础柱状图

创建一个基础柱状图,用于展示不同年龄段的已还清金额:

1
2
3
4
5
6
7
import matplotlib.pyplot as plt

plt.figure(figsize=(8, 10), dpi=120)
x = df['年龄']
y = df['已还清']
plt.bar(x, y)
plt.show()

自定义属性

可以通过传递不同的参数来自定义柱状图的外观。

  • 修改颜色:通过color参数设置柱子的颜色。

    1
    plt.bar(x, y, color='green')
  • 修改柱宽:使用width参数调整柱的宽度。

    1
    plt.bar(x, y, width=0.5)
  • 水平柱状图plt.barh()用于绘制水平柱状图。

    1
    plt.barh(x, y)

堆叠柱状图

堆叠柱状图适用于展示不同组数据在相同类别中的分布情况。

1
2
3
4
5
6
7
8
x = df['年龄']
y1 = df['已还清']
y2 = df['正常还款中']

plt.bar(x, y1)
plt.bar(x, y2, bottom=y1)
plt.legend(['已还清', '正常还款中'])
plt.show()

显示数值

在柱状图的柱子上显示数值,可以更直观地展示数据的具体数值。

  • 单独柱子显示数值

    1
    plt.bar_label(plt.bar(x, y1), labels=x, label_type='edge')
  • 堆叠柱状图显示数值

    1
    2
    3
    4
    5
    6
    bar1 = plt.bar(x, y1)
    plt.bar_label(bar1, labels=y1, label_type='edge')
    bar2 = plt.bar(x, y2, bottom=y1)
    plt.bar_label(bar2, labels=y2, label_type='edge')
    plt.legend(['已还清', '正常还款中'])
    plt.show()

这里,label_type='center'将标签放在柱子的中心位置,而label_type='edge'则将标签放在柱子的边缘位置。这些自定义选项使得柱状图不仅能够提供数据的视觉比较,还能提供精确的数值信息,使得数据的解读更加直观明了。

  • 标题: Matplotlib
  • 作者: Yiuhang Chan
  • 创建于 : 2018-12-06 16:39:37
  • 更新于 : 2024-03-19 19:05:01
  • 链接: https://www.yiuhangblog.com/2018/12/06/20181206Matplotlib/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论