如何在同一张图中绘制多个函数

158
如何在同一张图上绘制以下三个函数(即 sincos 和加法),在域 t 上进行?
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2*np.pi, 400)

a = np.sin(t)
b = np.cos(t)
c = a + b
5个回答

251
为了在同一张图表上绘制多个图形,您需要执行以下操作:
from numpy import *
import math
import matplotlib.pyplot as plt

t = linspace(0, 2*math.pi, 400)
a = sin(t)
b = cos(t)
c = a + b

plt.plot(t, a, 'r') # plotting t, a separately 
plt.plot(t, b, 'b') # plotting t, b separately 
plt.plot(t, c, 'g') # plotting t, c separately 
plt.show()

enter image description here


好的,现在如果你想在新图表上绘制下一个图形,你该如何清除之前的图形呢? - NoName
@NoName:你所说的“清除图形”是什么意思?你想关闭绘图窗口并绘制一个新的吗? - Srivatsan
没关系,调用 plt.show() 后默认图形会被自动清除,所以重新绘制不会在同一个图表上绘制。 - NoName
我们如何自定义高度和宽度?我的情况下默认尺寸太小了。figsize不起作用。 - Nikhil VJ
1
@NikhilVJ:fig = plt.figure(figsize=(10,10)), ax = fig.add_subplot(111), ax.plot(a,b,'r'), fig.show(),这个原则上应该可以工作。 - Srivatsan

71
也许有更符合Python风格的方法来实现。
from numpy import *
import math
import matplotlib.pyplot as plt

t = linspace(0,2*math.pi,400)
a = sin(t)
b = cos(t)
c = a + b

plt.plot(t, a, t, b, t, c)
plt.show()

enter image description here


1
你能否使用这种方法更改每个绘图的颜色?如果可以,如何操作? - nbro
6
你可以通过更改 plt.plot() 的部分来指定颜色,例如:plt.plot(t, a, 'b', t, b, 'g', t, c, 'y')。你可以在此链接中提供的颜色基础上指定颜色:https://matplotlib.org/users/colors.html - Jash Shah
我们不能在pyplot中使用ion()来实现这个吗,而不是将所有东西都绘制在一条线上? - toing_toing
@toing_toing 抱歉,我对 ion() 不是很了解。你能举个例子吗? - Jash Shah
4
这个“更符合Python风格”的比已接受的答案好在哪里?“显式优于隐式”,而且我认为可读性支持已接受的答案(虽然我承认这是主观的)。你密集的plt.plot()调用的快速理解是通过对三个曲线使用类似的“t”变量实现的,这并不是系统化的。话虽如此,我认为了解这个版本很有趣。 - Blupon

8

只需要按照以下方式使用plot函数即可

figure()
...
plot(t, a)
plot(t, b)
plot(t, c)

1
只需要做一个小改变:plt.figure() - Bavafaali

3
如果你想在图表中处理数据,我举一个例子:当你想要在同一张图表上绘制多个ROC曲线时。
from matplotlib import pyplot as plt
plt.figure()
for item in range(0, 10, 1): 
    plt.plot(fpr[item], tpr[item])
plt.show()

什么是ROC曲线? - Cheng
接收者操作特征曲线。它用于统计学上展示假设检验对于给定阈值的行为。例如,您可能有一个二元分类器,它将一些输入x,应用某些函数f(x)并在f(x) > t时预测H1。t是您用于决定是否预测H0或H1的阈值。变化阈值将产生不同的真正率 - 假正率对。ROC曲线捕获了这一点。名称来自于早期军事应用的假设检验来判断雷达是否发出虚假警报。 - Joud C

1
一个相当简洁的方法是将函数值水平连接起来,形成一个形状为(len(t), 3)的数组,并调用plot()
t = np.linspace(0, 2*np.pi, 400)

a = np.sin(t)
b = np.cos(t)
c = a + b

plt.plot(t, np.c_[a, b, c]);

如果数据不来自numpy数组,而且你不想使用numpy库,那么zip()就是你的好朋友。
plt.plot(t, list(zip(a, b, c)));

由于单个图上有3种不同的图形,因此可能有意义插入一个图例以区分它们。 通过传递标签可以轻松完成该操作。

plt.plot(t, np.c_[a, b, c], label=['sin', 'cos', 'sin+cos']);
plt.legend();

img1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接