在使用matlotlib之前我们首先需要进行导入:
import matplotlib.pyplot as plt
我们可以试着生成一个简单的图形:
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
plt.plot(data)
plt.show()
#将画出的图形在pycharm中显示
图片与子图
matplotlib所绘制的图片位于Figure对象中。可以使用plt.figure()生成一个续表的图片:
fig = plt.figure()
print(type(fig))
# <class 'matplotlib.figure.Figure'>
我们可以使用add_subplot创建一个或者多个子图:
ax1 = fig.add_subplot(2,2,1)
print(type(ax1))
# <class 'matplotlib.axes._subplots.AxesSubplot'>
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
上面的代码的意思是2×2(最多四个图片)的,并且我们选择了四个图形中的第一个(序号从1开始)。如果你接着创建了两个子图,就会得到以下结果:
matplotlib会在最后一个图片和子图上面进行绘制,我们接上以下代码:
plt.plot(np.random.randn(50).cumsum(),'k--')
plt.show()
就会得到以下结果:
其中’k–'是用于绘制折现的style(风格)选项。
另外我们还可以使用add_subplot返回的对象的plot方法在选定的子图上绘图:
ax1.hist(np.random.randn(100),bins = 20,color = 'k',alpha = 0.3)
ax2.scatter(np.arange(30),np.arange(30)+3*np.random.randn(30))
plt.show()
得到的结果如下:
使用matplotlib中的subplots函数,可以返回一个figure对象和一个包含Axes Subplot对象的列表,使得我们可以快速的访问每个子图:
fig,axes = plt.subplots(2,3)
#创建一个含有2*3个的子图的图片
print(axes)
#一个二维数组,可以通过axes[0,1]这样的形式进行调用
# [[<matplotlib.axes._subplots.AxesSubplot object at 0x00000245D7051358>
# <matplotlib.axes._subplots.AxesSubplot object at 0x00000245D73422E8>
# <matplotlib.axes._subplots.AxesSubplot object at 0x00000245D736F518>]
# [<matplotlib.axes._subplots.AxesSubplot object at 0x00000245D73969B0>
# <matplotlib.axes._subplots.AxesSubplot object at 0x00000245D73BEF28>
# <matplotlib.axes._subplots.AxesSubplot object at 0x00000245D73ED4E0>]]
以下是subplots函数的参数:
参数 | 描述 |
---|---|
nrows | 子图的行数 |
ncols | 子图的列数 |
sharex | 所有子图使用相同的x刻度(调整xlim会影响所有子图) |
sharey | 所有子图使用相同的y刻度(调整ylim会影响所有子图) |
subplot_kw | 传入add_subplot的关键字参照字典,用于生成子图 |
**fig_kw | 在生成图片时使用额外的关键字参数,例如plt.subplots(2,2,figsize = (8,6)) |
颜色、标记和线类型
matplotlib的主函数plot接受带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型。例如,要用绿色破折号绘制x对y的线,你需要执行:
ax.plot(x,y,'g--')
我们也可以显示的指定线类型和颜色:
ax.plot(x,y,linestyle = '--',color = 'g')
有很多颜色缩写被用于常用颜色,也可以使用十六进制颜色代码的方式指定任何颜色(如#CECECE)
我们可以使用marker参数来凸显出每个数据点:
ax.plot(x,y,linestyle = '--',color = 'g',marker = 'o')
可以使用drawstyle选项来更改线条的风格:
data = np.random.randn(30).cumsum()
plt.plot(data,'k--',label = 'Default',marker = 'o')
plt.plot(data,'k--',drawstyle = 'steps-post',label = 'steps-post',marker = 'o')
plt.show()
效果如下:
刻度、标签和图例
可以使用pyplot中xlim、xticks和xticklabels方法来控制绘图范围、刻度位置以及刻度标签。
对于xlim方法有以下两点需要注意:
- 在没有函数参数的情况下使用,返回的是当前的x轴绘图范围
- 在传入参数(如xlim([0,10])),将会按输入的值设置x轴绘图范围
所有的这些方法都会在当前活动的或者最近创建的AxesSubplot上生效。
设置标题、轴标签、刻度和刻度标签
先考虑以下代码绘制的图片:
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
结果如下:
改变x轴的刻度,可以使用set_xticks和set_xticklabels。set_xticks表示在数据范围内设定刻度的位置。可以使用set_xticklabels为标签幅值:
ticks = ax.set_xticks([0,250,500,720,1000])
#标签的位置
labels = ax.set_xticklabels(['one','two','three','four','five'],
rotation = 30,fontsize = 'small')
#rotation为将标签旋转指定的角度
ax.set_xlabel('Stages')
#设置x轴的标题
结果如下:
添加图例
有多种方式可以添加图例,最简单的方法是在画图时传递label参数,之后使用legend方法来显示图例:
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum(),'k',label='one')
ax.plot(np.random.randn(1000).cumsum(),'k--',label='two')
ax.plot(np.random.randn(1000).cumsum(),'k.',label='three')
ax.legend(loc='best')
效果如下:
将图片保存到文件
可以使用figure对象方法或者plt中自带的函数来将绘制好的图片进行保存:
ax.savefig('my_img1.png')
plt.savefig('my_img2.png')
savefig的常用选项:
参数 | 描述 |
---|---|
fname | 包含文件路径或者python文件型对象的字符串。图片格式由文件扩展名确定 |
dpi | 每英寸点数的分辨率,默认为100,但是可以配置 |
facecolor ,edgecolor | 子图之外的图形的背景颜色;默认情况下是白色(‘w’) |
format | 显式指定文件格式 |
bbox_inches | 要保存的图片范围,如果传递’tight’则将会去除掉图片周围空白的部分 |