一、简单的例子
本文课pyplot风格,pyplot风格通常不如面向对象编程灵活。在这里看到的大多数函数调用也可以作为Axes对象的方法调用。我们建议浏览tutorials和例程来了解它是如何工作的。
参考教程:https://matplotlib.org/stable/tutorials/introductory/pyplot.html
使用pyplot可以方便的产生可视化图像
import matplotlib.pyplot as plt
plt.plot([3, 8, 2, 9])
plt.ylabel('some numbers')
plt.show()
plt.plot
说明:这里只有一个参数,代表y轴的值,而x轴默认从0开始算,即上述代码画的四个点为(0,3),(1,8),(2,2)和(3,9)
而给出具体的坐标则代码改为
plt.plot([1, 2, 7, 9],[1, 6, 9, 10])
则画(1,1),(2,6),(7,9)和(9,10)四个点
二、格式化绘图风格
对于每一对x、y参数都有一个可选的第三个参数。它是一个指示绘图颜色和线条类型的格式化字符串。您可以将颜色字符串与线条样式字符串连接起来。默认的格式字符串是’b-’,它表示蓝色实线。例如,要用红色圆圈绘制上面的图。代码改为
import matplotlib.pyplot as plt
plt.plot([1, 2, 7, 9],[1, 6, 9, 10],'ro')
plt.axis([0, 10, 0, 12])
plt.show()
上图代表将四个点画成红色圆圈,axis的参数表示[xmin, xmax, ymin, ymax]
。有关完整的风格和格式字符串,参数plot
官方文档
你还可以使用numpy
数组,实际上,所有序列都在内部转换为numpy数组。
import matplotlib.pyplot as plt
import numpy as np
#evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
#red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
函数解析:
t = np.arange(0.,5.,0.2)
代表起点为0,终点为5,步长的0.2的一串数字。然后通道plot
的(t,t),(t,t2)以及(t,t3)画图。
输出结果
三、使用关键字字符串绘图
在某些情况下,数据格式需要使用字符串访问特定变量。例如,使用numpy.recarray
或pandas.DataFrame
。
import numpy as np
import matplotlib.pyplot as plt
data = {'a': np.arange(50),
'c': np.random.randint(0, 50, 50),
'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
plt.scatter('a', 'b', c='c', s='d', data=data)
plt.xlabel('entry a')
plt.ylabel('entry b')
plt.show()
解析:scatter()
是画散点图 。前两个参数分别代表x,y,c代表颜色(序列),s是标题或shape数组。
官方文档下有一段关于使用字典传参的注解。
Note
In addition to the above described arguments, this function can take a data keyword argument. If such a data argument is given, the following arguments are replaced by data[]:
All arguments with the following names: ‘c’, ‘color’, ‘edgecolors’, ‘facecolor’, ‘facecolors’, ‘linewidths’, ‘s’, ‘x’, ‘y’.
Objects passed as data must support item access (data[]) and membership test ( in data).
运行结果
四、用分类变量绘图
示例
import numpy as np
import matplotlib.pyplot as plt
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()
代码解析:plt.figure(figsize=(9, 3))
代表创建一个9*3
英寸的figure。plt.subplot(131)
表示当前正准备在绘一行三列的三个子图中的第一个子图。然后在此画柱状图(plt.bar(names, values)
),接着在一行三列的三个子图中的第二个子图画散点(plt.scatter(names,values)
),最后在第三个子图直线(plt.plot(names.values)
)。
本例代码中的
plt.figure(figsize=(9, 3))
是可选的,因为一个figure
为空时会被自动创建,subplot
调用指定numrows, numcols和plot_number,其中plot_number的范围是1到numrowsnumcols。如果numrowsnumcols < 10,则subplot
中的逗号是可选的。所以subplot(131)
和subplot(1,3,1)
是一样的。
五、使用多种figures(图窗)和axes(笛卡尔坐标区)
在pyplot中,有一个figure和axes的概念。所有的绘图函数都要在当前的axes中完成。函数gca返回当前的axes(一个matplotlib.axes.Axes的实例,gcf返回当前的figure(一个matplotlib.figure.Figure实例)。通常情况下,我们不需要关心这些,因为函数底层已经帮我们完成。如下的脚本产生两个子图。
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure()
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
代码解析:创建两行一列的子图plt.subplot(21x)
,在第一个位置画蓝色的圈以及黑色的线(plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
)。在第二个位置画红色的虚线。
运行结果
六、添加文本
可以任意位置添加文本(text),也可以为x轴,y轴设置文本以及设置标题(更多的例子)。
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts') #亦可设置属性fontsize = 14,color='red'
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
七、注释文本
import numpy as np
import matplotlib.pyplot as plt
ax = plt.subplot()
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
plt.ylim(-2, 2)
plt.show()
运行结果
在这个基本示例中,xy(箭头尖端)和xytext位置(文本位置)都位于数据坐标中。可参阅其他基本用法,高级用法以及示例。