matplotlib
from birthday import get_p
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
m = 2000
n = [i for i in range(100)]
q = [get_p(m, i) for i in n]
plt.plot(n, q)
plt.xlabel("student number")
plt.ylabel("probability")
plt.legend()
plt.savefig(fname='pic.png')
plt.show()
创建图片与子图
若不创建实例,一切对象名均使用plt!
导入
import matplotlib.pyplot as plt
层次
-
Figure:面板(图),matplotlib 中的所有图像都是位于 figure 对象中,一个图像只能有一个 figure 对象。
-
Subplot:子图,figure 对象下创建一个或多个 subplot 对象(即 axes)用于绘制图像。
创建图片
fig = plt.figure()
plt.figure()
返回 figure 实例
一个空白的绘图窗口就会出现
重要参数
-
num:新图的编号,默认递增
-
figsize:宽度,高度,以英寸为单位
-
dpi:分辨率,整数
-
facecolor:背景颜色
-
edgecolor:边框颜色
-
frameon:若为 False,则没有边框
-
clear:若为 True,如果图的编号已存在则先清除
创建子图
.add_subplot()
ax1 = fig.add_subplot(2, 2, 1)
#将fig分割成2行3列,画出并返回序号1的子图
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
#注意,此时fig上只有3张子图,其他子图没有被初始化
fig.add_subplot(nrows, ncols, index)
以图片作为对象,返回 Axes 实例
你可以直接在其他空白的子图上调用 Axes 对象的实例方法进行绘图

plt.subplots()
使用子图网格创建图片是非常常见的任务,所以 matplotlib 包含了一个便捷方法 plt.subplots,它创建一个新的图片,然后返回包含了已生成子图对象的 NumPy 数组:
fig, axes = plt.subplots(2, 3)

API
plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
返回 figure 实例和子图数组
参数
- nrows,ncols:子图的行列数
- sharex, sharey
- 设置为 True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴,
- 设置为 False or ‘none’ 时,所有子图的 x,y 轴均为独立,
- 设置为 ‘row’ 时,每一行的子图会共享 x 或者 y 轴,
- 设置为 ‘col’ 时,每一列的子图会共享 x 或者 y 轴。
- squeeze:设置返回的子图对象的数组格式。
- 当为 False 时,不论返回 的子图是只有一个还是只有一行,都会用二维数组格式返回他的对象。
- 当为 True 时,如果子图只有一个,则返回的子图对象是标量形式,如果子图有(N×1)或(1×N)个,则返回的子图对象是一维数组,如果是(N×M)则返回二维数组。
- subplot_kw:字典格式,传递给
add_subplot()
,用于创建子图 - gridspec_kw:字典格式,传递给
GridSpec
的构造函数,用于创建子图所摆放的网格。 - **fig_kw :所有其他关键字参数都传递给
figure()
调用。
格式
#单行单列,按照一维数组来表示
ax = fig.subplots(2,1) # 2*1
ax[0].plot([1,2], [3,4]) # 第一个图
ax[1].plot([1,2], [3,4]) # 第二个图
#多行多列,按照二维数组来表示
ax = fig.subplots(2,2) # 2*2
ax[0,1].plot([1,2], [3,4]) # 第一个图
ax[0,1].plot([1,2], [3,4]) # 第二个图
ax[1,0].plot([1,2], [3,4]) # 第三个图
ax[1,1].plot([1,2], [3,4]) # 第四个图
数组 axes 可以像二维数组那样方便地进行索引,例如,axes[0,1]
调整子图周围的间距
默认情况下,matplotlib 会在子图的外部和子图之间留出一定的间距。这个间距都是相对于图的高度和宽度来指定的,所以如果你通过编程或手动使用 GUI 窗口来调整图的大小,那么图就会自动调整。
可以使用图对象上的plt.subplots_adjust
方法更改间距
plt.subplots_adjust(wspace=1,hspace=0)

API
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
参数
- left, right, bottom, top:子图所在区域的边界
- 当值大于 1.0 的时候子图会超出 figure 的边界从而显示不全;值不大于 1.0 的时候,子图会自动分布在一个矩形区域
- 要保证 left < right, bottom < top,否则会报错

- wspace, hspace:子图之间的横向间距、纵向间距分别 与子图平均宽度、平均高度的比值,也就是图片的宽度和高度百分比
修饰
设置标题
设置图片标题
plt.suptitle('The Title',fontsize=14,color='purple')
若要直接在 figure 上操作
plt.title('The Title',fontsize=14,color='purple')
#传figure的名字最好
fig.title('The Title',fontsize=14,color='purple')
常用参数
- fontsize:设置字体大小,默认 12,
['xx-small', 'x-small', 'small', ‘medium’, ‘large’, ’x-large’, ‘xx-large’]
- fontweight:设置字体粗细
[‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’]
- fontstyle:设置字体类型
[ ‘normal’, ‘italic’, ‘oblique’ ]
;italic 斜体,oblique 倾斜
- color:设置字体颜色
- verticalalignment:设置水平对齐方式
[ ‘center’ , ‘top’ , ‘bottom’ ,’baseline’]
- horizontalalignment:设置垂直对齐方式
['left', 'right', 'center']
- rotation:旋转角度
[‘vertical’, ‘horizontal’]
也可以为数字
- alpha:透明度,参数值 0 至 1 之间
- backgroundcolor:标题背景颜色
- bbox:给标题增加外框
‘boxstyle’
:方框外形‘facecolor’
:(简写 fc)背景颜色‘edgecolor’
:(简写 ec)边框线条颜色‘edgewidth’
:边框线条大小
设置子图标题
ax1.set_title('graph1')
用 Axe 对象接受此函数
参数见 2.1.1
轴操作
set 方法允许批量设置绘图属性,如
props = {
'title': 'My first matplotlib plot',
'xlabel': 'Stages'
}
ax1.set(**props)
改变轴刻度
ax1.set_xticks([0,25,50,75,100])
ax1.set_yticks([10,20,30,40,50])
若要直接在figure上操作
plt.xticks([0,25,50,75,100])
plt.yticks([10,20,30,40,50])
添加轴标签
添加与刻度对应的标签
ax1.set_xticklabels(['one','two','three','four','five'])
ax1.set_yticklabels(['a','b','c','d','e'])
添加单一轴标签
ax1.set_xlabel('stage')
参数见 2.1.1
若要直接在figure上操作
plt.yticks([-2,-1.8,-1,1.22,3],['really bad','bad','normal','good','really ',
'good'])
#或
plt.xlabel('x-year',fontsize=14)
plt.ylabel('y-income',fontsize=14)
设置显示范围
plt.xlim(xmin, xmax)
xmin:x 轴上的最小值
xmax:x 轴上的最大值
y 轴亦如是
ax.get_lim()
ax.set_lim()
添加图例
.lengend()自动接受图像的label
值,(label
值在画图时传入)
ax1.legend(loc=4)
常用参数
- loc:设置图列位置,数字代表在第几象限
['best','upper right','upper left', 'lower left','lower right', 'right', 'center left', 'center right', 'lower center','upper center','center']
- fontsize:设置图例字体大小
- int or float or
{‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}
- int or float or
- 设置图例边框及背景
frameon=False
:去掉图例边框edgecolor='blue'
:设置图例边框颜色facecolor='blue'
:设置图例背景颜色,若无边框,参数无效
- title:设置图例标题
- markerfirst:如果为 True(默认),则图例标记位于图例标签的左侧
- ncol:设置图例分为 n 列展示
若要直接在 figure 上操作
plt.legend()
添加注释
.text()
plt.text(0.4,0.8,"This is a text",rotation=45)

API
.text(x,y,string,fontsize=15,verticalalignment=“top”,horizontalalignment=“right”)
参数
- x,y:设置坐标值值
- string:设置说明文字
- 其余详见 2.1.1
.annotate()
plt.annotate('Testing',xy=(0.4,0.6),fontsize=20,color='b')

API
.annotate(string, xy=(x,y) ,xytext=(l1,l2) ,… )
参数
- string:设置注释文本内容
- xy:设置被注释的坐标点
- xytext:设置注释文字的坐标位置
添加网格
plt.grid(linestyle="--", alpha=0.5)
绘制参考线
plt.axhline(y, c, ls, lw) #绘制平行于x轴的水平参考线
plt.axvline(x, c, ls, lw) #绘制平行于y轴的垂直参考线
y或x:水平参考线的出发点
c:参考线的线条颜色
ls:参考线的线条风格
lw:参考线的线条宽度
其他坐标轴设置
.axis()
参数
- ‘equal’:x,y 轴刻度等长
- ‘off’:关闭坐标轴
- [a, b, c, d]:设置 x 轴的范围为[a, b],y 轴的范围为[c, d]
绘图
点图,线图
.plot(x,y)