Matplotlib是Python最强大的可视化库,可以绘制各种二维、三维图表,对图表元素的可定制化程度很高,什么坐标轴、刻度尺、标签、图标、颜色、背景、标记类型等等都可以自由设置,可以说基本没有你用matplotlib绘制不了的图表,如果有,那是你对matplotlib还不够熟悉。

matplotlib的12个基础用法:

1、绘制基本图表

Matplotlib可以绘制折线图、散点图、柱状图、饼图等各种图表,使用plot方法来实现,也可以用scatter、bar、pie等方法绘制各种类型图表。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图
plt.plot(years, population / 10**9)
plt.show()

2、设置中文显示

如果你想在Matplotlib图表上显示中文,比如标题、图例,则需要设置字体,否则会显示乱码。

要注意windows和mac字体会有不同,,windows可以设置SimHei黑体,mac可以设置Arial Unicode MS,其他的按照字体库来自定义。

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体(以Arial为例)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']#
plt.rcParams['axes.unicode_minus'] = False 

3、添加图表标题、轴标题

Matplotlib可以轻松添加图表标题、X轴标题、Y轴标题,分别通过plt.title()plt.xlabel(), 和 plt.ylabel() 函数来实现。

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体(以Arial为例)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']#
plt.rcParams['axes.unicode_minus'] = False

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图
plt.plot(years, population / 10**9)

# 设置图表标题、X轴标题、Y轴标题
plt.title('世界人口总量与增长', fontsize=16)
plt.xlabel('年份')
plt.ylabel('人口总量 (十亿)', color='#1f77b4')

plt.show()

4、添加图例

当图表中有多个数据系列时,需要添加图例来区分,可以通过plt.legend()函数实现。

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体(以Arial为例)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']#
plt.rcParams['axes.unicode_minus'] = False 

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9
growth_rate = np.diff(population) / population[:-1] * 100
growth_years = years[:-1]

# 绘制折线图
plt.plot(years, population / 10**9, label='人口总量')
plt.plot(growth_years, growth_rate, label='年增长率')

# 设置图例
plt.legend(loc='upper left')
plt.show()

5、双坐标轴

如果一个图中两个数据系列值差异很大时,可以使用双坐标轴,分别用于不同数据系列的度量,使用plt.twinx()函数实现。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9
growth_rate = np.diff(population) / population[:-1] * 100
growth_years = years[:-1]

# 绘制折线图1
plt.plot(years, population / 10**9, label='人口总量')
# 创建双轴
plt.twinx()
# 绘制折线图2
plt.plot(growth_years, growth_rate, label='年增长率')
plt.show()

6、添加文本注释和公式

在图表中可以添加文本注释,用于解释图表某节点的含义,使用plt.text()函数实现,它也可以用来添加Latex数据公式。

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体(以Arial为例)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图
plt.plot(years, population / 10**9)
# 添加文本注释
plt.text(2015, 7.0, '2020年后人口增长放缓', fontsize=12, style='italic', color='red',
         bbox=dict(boxstyle='round,pad=0.3', fc='yellow', ec='red', lw=1, alpha=0.5))
# 添加数学公式
plt.text(1970, 4.0, r'增长率公式: $P_{t+1} = P_t(1+r)$', fontsize=14, color='black', 
         bbox=dict(boxstyle='round,pad=0.5', fc='white', ec='gray', lw=1, alpha=0.8))
plt.show()

7、设置坐标轴和刻度

坐标轴和刻度也可以自定义调整,你能用plt.xlim()plt.ylim()plt.xticks(), 和 plt.yticks() 这几个方法来控制坐标轴的显示范围和刻度。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图
plt.plot(years, population / 10**9, label='人口总量')

# 设置x和y坐标轴范围
plt.xlim(1960, 2000)
plt.ylim(0, 9)
plt.show()

8、调整线条样式、颜色和标记

在plot函数中,通过调整color、marker、linestyle、linewidth等参数,可以自定义颜色、标记、线条样式、线条粗细等格式。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图,并调整线条样式
plt.plot(years, population / 10**9, label='人口总量', color='#1f77b4', marker='o', linestyle='--', linewidth=2.5)
plt.show()

9、设置背景样式

背景样式也可以一键调整,比如设置网格线等,通过plt.grid()函数添加样式。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图,并调整线条样式
plt.plot(years, population / 10**9, label='人口总量', color='#1f77b4', marker='o', linestyle='--', linewidth=2.5)
#添加背景网格线
plt.grid(True, linestyle=':', alpha=0.6)
plt.show()

10、设置不同风格

matplotlib内置了很多种图表风格,可以自主切换,通过plt.style.use()函数实现。

import matplotlib.pyplot as plt
import numpy as np

# 使用 'ggplot' 风格
plt.style.use('ggplot')

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 绘制折线图,并调整线条样式
plt.plot(years, population / 10**9, label='人口总量', color='#1f77b4', marker='o', linestyle='--', linewidth=2.5)
plt.show()

11、创建多子图

matplotlib支持创建多个子图,可以用plt.subplots() 方式实现,它是一种面向对象的形式。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
years = np.arange(1950, 2021, 10)
population = np.array([2.52, 3.02, 3.70, 4.44, 5.33, 6.13, 6.96, 7.78]) * 10**9

# 创建多子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8), sharex=True)

# 子图1
line1, = ax1.plot(years, population / 10**9)

# 子图2
line2, = ax2.plot(years, population / 10**9)
ax2.fill_between(years, population / 10**9, color='#2ca02c', alpha=0.3)

plt.show()

12、导出图表

plt.savefig('test_chart.png', dpi=300)