matplotlib绘图的几种方式
Matplotlib是整个软件包,matplotlib.pyplot
是Matplotlib中的模块。
matplotlib.pyplot是使matplotlib像MATLAB一样工作的命令样式函数的集合。每个pyplot函数对一个图进行一些更改:例如,创建一个图,在图中创建一个标绘区域,在标绘区域中绘制一些线,用标签装饰该图,等等。在matplotlib。pyplot各种状态保存在函数调用,所以它跟踪当前图和绘图区域,和绘图功能是针对当前轴(请注意“轴”,在大多数地方的文档是指轴图的一部分,而不是严格的数学术语多个轴)。
注意,pyplot API通常不如面向对象API灵活。您在这里看到的大多数函数调用也可以作为来自axes对象的方法来调用。我们建议您浏览教程和示例,看看它是如何工作的。
补充:Matplotlib中的两种绘图API说明
在Matplotlib库中提供了两种风格的API供开发者使用:一种是Pyplot编程接口(state-based),一种是面向对象对象的编程接口(object-based)。
Pyplot封装了底层的绘图函数提供了一种绘图环境,使得我们可以直接像在MATLAB那样绘制图形。
在使用面向对象的编程接口时候,我们需要自己创建画布(FigureCanvas),自己创建图对象(Figure),自己创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot()绘图函数便会创建一个Axes),所有对象一起才能完成一次完整的绘图。使用面向对象编程接口有利于我们对于图形绘制的完整控制,但是相对于Pyplot接口可能需要书写更多的代码。
参考原文链接:https://blog.csdn.net/theonegis/article/details/81230211
对于pyplot模块中的功能,始终有一个“当前”图形和轴(根据要求自动创建)。例如,在下面的例子中,在第一次调用plt.plot
创建轴,则后续调用plt.plot
在同一坐标添加额外的线,以及plt.xlabel
,plt.ylabel
,plt.title
和plt.legend
设置轴标签和标题和添加的图例。
x = np.linspace(0, 2, 100)
plt.plot(x, x, label='linear')
# 试试在这里加入plt.show(),此时会显示两个figure
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend() # 要设了label且放置图例后才会显示图例
plt.show() # 阻塞模式必须调用show才能显示figure
在一个figure中绘制多个axes,用plt.subplot()
names = ['group_a', 'group_b', 'group_c']
values = [1, 10, 100]
plt.figure(figsize=(9, 3))
plt.subplot(131)
plt.bar(names, values)
plt.subplot(132)
plt.scatter(names, values)
plt.subplot(133)
plt.plot(names, values)
plt.suptitle('Categorical Plotting')
plt.show()
#------------------------------------
import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(0.0, 5.0)
x2 = np.linspace(0.0, 2.0)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
y2 = np.cos(2 * np.pi * x2)
plt.subplot(2, 1, 1)
plt.plot(x1, y1, 'o-')
plt.title('A tale of 2 subplots')
plt.ylabel('Damped oscillation')
plt.subplot(2, 1, 2)
plt.plot(x2, y2, '.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')
plt.show()
上面的教程中时不时提到两个概念:figure和axes,这两者是matplotlib面向对象绘图时要明确的两个点,可以参考上一篇教程。
下面用面向对象的方式绘图
x = np.arange(0, 10, 0.2)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
#---------------------------
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
fig.savefig("test.png")
plt.show()
一个figure中绘制多个axes
x = np.arange(0, 10, 0.2)
y = np.sin(x)
fig, (ax1,ax2) = plt.subplots(1,2)
ax1.plot(x, y)
ax2.plot(y, x)
plt.show()
还有一个对官方文档整理很到位的博客https://segmentfault.com/a/1190000020450334?utm_source=tag-newest
上一篇: RMI简单示例
下一篇: 数据分布倾斜性风险浅析