Matplotlib库的方法众多,本文只展示基本主要的方法。
matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式。 即利用pyplot即可使用matplotlib的所有可视化类。
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.plot([3, 4, 5, 3, 2])
plt.ylabel('grade')
plt.savefig('test', dpi=600) # 保存为PNG文件,dpi为每一英寸区域中所包含的像素点
plt.show
import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8], [3, 4, 5, 3, 2])
plt.ylabel('grade')
plt.axis([-1, 10, 0, 6]) # x轴起始于-1,结束于10,y轴起始于0.结束于6
plt.show
输入两个列表时,第一个列表为x,第二个列表为y。
ply.subplot(nrows, ncols, plot_number)
将绘图区域分割为以第一个参数为横轴数量,第二个参数为纵轴数量的子区域;第三个参数为指定当前绘图的区域。
如plt.subplot(3,2,4)即将绘图区域在纵向上分为3块,横向上分为2块的合计6块子区域,绘制在4号区域(从1开始计数,先横向再纵向)。该语句也可以写为plt.subplot(324)。
plot(x, y, format_string, **kwargs)
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, 1.5 * a, a, 3 * a, a, 5 * a)
plt.show()
format_string格式控制字符串
format_string由颜色字符、风格字符、标记字符(在每一个数据点处做标记)组成:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, 1.5 * a, 'go', a, 3 * a, 'r--v', a, 5 * a, 'y:3')
plt.show()
也可以使用color,linestyle,marker等参数进行代替,如color=‘green’,linestyle=‘dashed’,marker=‘o’,markerfacecolor=‘blue’(控制标记的颜色),markersize=20(控制标记大小)。
pyplot默认不支持中文显示,需要rcParams修改字体实现。
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei' # 黑体
a = [3, 1, 4, 5, 2]
plt.plot(a)
plt.ylabel('纵坐标')
plt.show()
rcParams属性:
对于font.family
上述方法为绘图全局有效,以下是局部生效方法(建议使用):
在有中文输出处,增加一属性:fontproperties
import matplotlib.pyplot as plt
a = [3, 1, 4, 5, 2]
plt.plot(a)
plt.ylabel('纵坐标', fontproperties='SimHei', fontsize=20) # fontsize为字体大小
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False # 显示出符号
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横坐标:时间', fontproperties='SimHei', fontsize=20, color='green')
plt.ylabel('纵坐标:振幅', fontproperties='SimHei', fontsize=20)
plt.title(r'正弦波$ y= cos(2 \pi x) $', fontproperties='SimHei', fontsize=15) # 用\$括起来的是latex格式文本
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -1.5, 1.5])
plt.grid(True)
plt.show()
注释函数:
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
第一个参数为字符串,表示注释内容;第二个参数为箭头所指位置,为元组类型;第三个参数为注释文本所在位置,元组类型;第四个参数对属性进行定义,如:
arrowprops=dict(facecolor=‘black’, shrink=0.1, width=2),表示箭头为黑色,宽度为2,箭头和所指位置及文本的的距离。
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
理念:设计网格,选中网格,确定选中行列区域数量,编号从0开始。
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' # 标签
sizes = (15, 30, 45, 10) # 每个标签所对应尺寸
explode = (0, 0.1, 0, 0) # 每一块突出的比例
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90) # shadow为饼图阴影的展示与否,autopct为图中百分数显示的方式,startangle为起始的角度
plt.show()
用 plt.axis(‘equal’) 可以将饼图变为正圆形。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nu, sigma = 100, 20 # 均值和标准差
a = np.random.normal(nu, sigma, size=100)
plt.hist(a, 20, normed=1, histtype='stepfilled', facecolor='b', alpha=0.75) # 第二个参数为bin,控制生成直方图中直方的个数,normed为1时,将直方图中直方的高度归一化为所占的比例,为0时,则纵轴表示的是出现的个数。
plt.title('Histgram')
plt.show()
直方图将横轴均分为bin个区域,每个直方的高度为位于这个区域中元素个数。
面向对象绘制极坐标图
import numpy as np
import matplotlib.pyplot as plt
N = 20
theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r / 10.))
bar.set_alpha(0.5)
plt.show()
N为绘制数据的个数。
同样的,可以使用plt.polar来进行绘制。
import numpy as np
import matplotlib.pyplot as plt
N = 20
theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)
radii = 10 + np.arange(N)
width = 2 * np.pi / N
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r / 30.)) # 保证radii/30处于0到1的范围内才可调节颜色
bar.set_alpha(0.9) # 设置色彩的透明度,0到1之间
plt.show()
面向对象绘制散点图
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # fig,ax对应subplot生成的图表和图表对应区域,区域划分不设置默认为111
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
ax.set_title('Simple Scatter')
plt.show()