`matplotlib` 是一个流行的 Python 数据可视化库,用于绘制出版质量级别的图形。它可以创建各种类型的图形,如折线图、散点图、条形图、直方图、等高线图、三维图和动画等。
`matplotlib` 的基本作图对象是图形(Figure)、坐标系(Axes)和绘图函数(Plotting functions)。其中,图形是最上层的容器,坐标系是图形下面基本的子容器,绘制函数则是直接在坐标系上添加各种图形元素进行绘图。
除了这些基本的绘图函数,`matplotlib` 还提供了许多更高级的功能,例如概率密度图、镶嵌曲线、误差线、填充和阴影等等。此外,它还支持多种输出格式,包括常见的图像格式(例如 png、jpeg 和 pdf),以及 LaTeX、SVG 和 AI 等矢量图格式。
`matplotlib` 被广泛应用于科学计算、数据分析、机器学习、金融、天气预测、生物学和地理信息系统等领域。其文档完善、社区活跃,还提供了大量的示例和教程,为用户提供了丰富的素材和工具。
安装
pip install matplotlib
引入
pip install matplotlib
解决中文乱码
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
主题背景
from matplotlib import style
style.use('ggplot') # 灰色网格背景
style.use('fivethirtyeight') # 白色网格背景
style.use('dark_background') # 黑色背景
style.use('grayscale') # 外灰内白
plt.grid(True) # 白色网格背景
相关描述
plt.title('标题') # 标题
plt.suptitle('顶级标题') # 顶级标题
plt.ylabel("左侧文字") # 左侧文字
plt.xlabel("底部文字") # 底部文字
创建画布
plt.figure(1) # 创建画布【参数代表第几个画布】
注意:默认有一个画布,所以没创建也可以画
绘制
plt.plot(x, y, 'r') # 第三个参数为颜色,r为red红色
添加图例
plt.plot(x, y, 'r', label='sine') # label添加图例
plt.legend(loc='upper left') # 图例的显示位置,左上
plt.legend(loc='lower right') # 图例的显示位置,右下
x/y轴的数据范围
plt.xlim(0, 5)
plt.ylim(0, 120)
x/y轴上面坐标数字替换为文字
plt.xticks([0.2,1.2,2.2,3.2], ['初级程序员', '中级程序员', '高级程序员', '架构师'])
plt.yticks([20, 40, 60, 80], ['一般', '喜欢', '很喜欢', '超级喜欢'])
某个点添加文字
plt.text(145, 200, "文字") # x轴,y轴
显示
plt.show()
创建一个具有3D坐标轴的画布
ax = plt.axes(projection='3d')
划分子图
ax1 = plt.subplot(211) # 子图划分 2行,1列,第一个
ax1.plot(x, y1)
自动调整图形的布局
plt.tight_layout() # 自动调整图形的布局,使得子图和标签等元素能够更好地适应图像窗口
曲线
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-100, 101)
y = 0.5 * x ** 2 + 2 * x
plt.plot(x, y)
plt.show()
多图
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 100, 1)
y1 = np.sin(x)
y2 = x ** 2 + 2 * x
plt.figure(1)
ax1 = plt.subplot(211)
ax1.plot(x, y1)
plt.figure(2)
ax2 = plt.subplot(212)
ax2.plot(x, y2)
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(50)
y = np.random.rand(50)
# marker散点图案,s散点大小
plt.scatter(x, y)
# plt.scatter(x, y, c='red', marker='*', s=10, cmap='Spectral')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
plt.title('编程语言各阶段人群喜爱统计')
plt.xlabel('人群')
plt.ylabel('分数')
people = ['初级程序员', '中级程序员', '高级程序员', '架构师']
index = np.arange(4)
python = (85, 67, 23, 98)
java = (50, 67, 89, 14)
javaScript = (60, 20, 56, 22)
c = (88, 23, 40, 87)
plt.bar(index, python, width=0.2, label='Python')
plt.bar(index + 0.2, java, width=0.2, label='Java')
plt.bar(index + 0.4, javaScript, width=0.2, label='javaScript')
plt.bar(index + 0.6, c, width=0.2, label='c')
# 图例的显示位置
plt.legend(loc='upper right')
# x轴上面坐标数字替换为文字
plt.xticks(index + 0.2, people)
# y轴的数据范围
plt.ylim(0, 160)
plt.show()
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
plt.title("各学科喜欢人数统计")
nationalities = ['体育', '英语', '语文', '历史']
students = [60, 23, 21, 34]
# 排序
pairs = zip(students, nationalities)
pairs = sorted(list(pairs))
students, nationalities = zip(*pairs)
# autopct显示百分比,counterclock倒置,shadow是否有背影,explode重点突出哪部分
# plt.pie(students)
# plt.pie(students, labels=nationalities)
# plt.pie(students, labels=nationalities, autopct='%.2f%%')
# plt.pie(students, labels=nationalities, autopct='%.2f%%', counterclock=False)
# plt.pie(students, labels=nationalities, autopct='%.2f%%', counterclock=False, startangle=90)
# plt.pie(students, labels=nationalities, autopct='%.2f%%', shadow=True)
explode = [0, 0, 0.1, 0]
plt.pie(students, labels=nationalities, autopct='%.2f%%', explode=explode)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.title('学生身高统计')
plt.xlabel('身高')
plt.ylabel('人数')
plt.grid(True)
# 随机出来一组数据,让其服从正太分布
mu, sigma = 172, 8
x = mu + sigma * np.random.randn(10000)
# 100可视化x轴上100个点,density用来指定概率密度【面积和为1】
plt.hist(x, 100, facecolor='b')
# plt.hist(x, 100, facecolor='b', density=True)
plt.show()
示例1
import numpy as np
import matplotlib.pyplot as plt
# 创建一个具有3D坐标轴的图形
ax = plt.axes(projection='3d')
# 一个轴作为输入,另外两个轴是根据输入计算出来的
z = np.linspace(0, 30, 100)
x = np.sin(z)
y = np.cos(z)
ax.plot3D(x, y, z)
plt.show()
示例2
import numpy as np
import matplotlib.pyplot as plt
ax = plt.axes(projection='3d')
# 两个轴作为输入,第三个轴是根据前俩个轴计算出来的
def z_function(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = z_function(X, Y)
ax.plot_surface(X, Y, Z)
plt.show()