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 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()函数导出图表,导出格式很多,比如png、jpg、svg、pdf等,还可以通过dpi参数设置分辨率。
plt.savefig('test_chart.png', dpi=300) 总结最后综合以上基础用法,咱们绘制一张商业图表,用于展示世界人口增长的趋势,相当于是练手,你可以绘制任何想要绘制的图表。
