12个Python Matplotlib可视化图表实战小技巧

B站影视 日本电影 2025-09-17 08:51 1

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

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

有不少库都基于matplotlib依赖实现可视化功能,比如Seaborn、Pandas、Statsmodels等,尤其Seaborn是matplotlib的高级封装版,用更少的代码实现更美观的图表。

还有一些库是matplotlib的拓展模块,能实现更专业化的绘图功能,比如Cartopy绘制地图、mplot3d绘制3D图像、Matplotlib-Animation创建动画、mplfinance绘制金融图表、SciencePlots绘制科研图表等,是matplotlib垂直领域的有力补充。

我大概梳理了matplotlib的12个基础用法,掌握后基本可以熟练运用matplotlib绘制各类图表,最终实现以下的商业图表绘制。

1、绘制基本图表

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

import matplotlib.pyplot as pltimport 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.show2、设置中文显示

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

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

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

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

import matplotlib.pyplot as pltimport 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.show4、添加图例

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

import matplotlib.pyplot as pltimport 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**9growth_rate = np.diff(population) / population[:-1] * 100growth_years = years[:-1]# 绘制折线图plt.plot(years, population / 10**9, label='人口总量')plt.plot(growth_years, growth_rate, label='年增长率')# 设置图例plt.legend(loc='upper left')plt.show5、双坐标轴

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

import matplotlib.pyplot as pltimport 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**9growth_rate = np.diff(population) / population[:-1] * 100growth_years = years[:-1]# 绘制折线图1plt.plot(years, population / 10**9, label='人口总量')# 创建双轴plt.twinx# 绘制折线图2plt.plot(growth_years, growth_rate, label='年增长率')plt.show

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

import matplotlib.pyplot as pltimport 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.show7、设置坐标轴和刻度

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

import matplotlib.pyplot as pltimport 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

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

import matplotlib.pyplot as pltimport 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.show9、设置背景样式

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

import matplotlib.pyplot as pltimport 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.show10、设置不同风格

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

import matplotlib.pyplot as pltimport 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.show11、创建多子图

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

import matplotlib.pyplot as pltimport 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)# 子图1line1, = ax1.plot(years, population / 10**9)# 子图2line2, = ax2.plot(years, population / 10**9)ax2.fill_between(years, population / 10**9, color='#2ca02c', alpha=0.3)plt.show12、导出图表

绘制好图表后使用plt.savefig函数导出图表,导出格式很多,比如png、jpg、svg、pdf等,还可以通过dpi参数设置分辨率。

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

最后综合以上基础用法,咱们绘制一张商业图表,用于展示世界人口增长的趋势,相当于是练手,你可以绘制任何想要绘制的图表。

来源:朱卫军AI

相关推荐