Matplotlib提供了和Matlab类似的绘图API,方便用户快速绘制2D图表。
首先要导入库:
import matplotlib
import matplotlib.pyplot as plt
常用函数
plot函数
plt.plot([1,2,3,4])
plt.ylabel('...') //给y轴加注释
plt.show()
plot可以接受成对的参数,并选择线的标记和颜色,如
控制颜色
颜色的对应关系如下:
b—blue
c—cyan (青)
g—green
k—-black
m—magenta (洋红)
r—red
w—white
y—-yellow
还有3种表示颜色的方式:
a:用全名
b:16进制如:#FF00FF
c:RGB或RGBA元组(1,0,1,1)
d:灰度强度如:’0.7’
控制线型
符号和线型之间的对应关系
- 实线
-- 短线
-. 短点相间线
: 虚点线
控制标记风格
标记风格有多种:
. Point marker 点
, Pixel marker 像素
o Circle marker 圆圈
v Triangle down marker 下三角
^ Triangle up marker 上三角
< Triangle left marker 左三角
> Triangle right marker 右三角
1 Tripod down marker 下三脚架
2 Tripod up marker 上三脚架
3 Tripod left marker 左三角架
4 Tripod right marker 右三脚架
s Square marker 方形
p Pentagon marker 五边形
* Star marker 星形
h Hexagon marker 六芒星形
H Rotated hexagon D Diamond marker 六边形
d Thin diamond marker 菱形
| Vertical line (vlinesymbol) marker 竖线
_ Horizontal line (hline symbol) marker 下划线
+ Plus marker 加号
x Cross (x) marker 叉号
例如:
plt.plot([1,2,3,4],[1,4,9,16],'ro:')
其中,ro表示用虚线连接的红圆点,默认是b-,即蓝线
axis函数与对数坐标系
接受[xmin,xmax,ymin,ymax]的列表,指定坐标轴范围
plt.axis([0,6,0,20])
有时候需要将x轴或y轴设置为对数坐标,有3个函数可以实现这种功能,分别是:semilogx(),semilogy(),loglog()
。它们分别表示对X轴,Y轴,XY轴取对数。如:
plt.semilogx(x,y)
plt.show()
figure和subplot函数
plt.figure(1) #figure(1)是可选的,因为它是默认创建的
plt.subplot(211) #指定1个坐标系,2表示行数,1表示列数,最后的1表示当前图像的序号
plt.clf() #清空当前图像
text函数和legend函数
text函数可以在任意位置添加文本,如
plt.text(1, 2, 'I'm a text')
legend函数可以绘制曲线
legend((plot1, plot2), ('label1, label2'), 'best’, numpoints=1)
其中第三个参数表示图例放置的位置:’best’’upper right’, ‘upper left’, ‘center’, ‘lower left’, ‘lower right’.
例如:
import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]
plot1 = pl.plot(x1, y1, 'r')# use pylab to plot x and y : Give your plots names
plot2 = pl.plot(x2, y2, 'go')
pl.title('Plot of y vs. x')# give plot a title
pl.xlabel('x axis')# make axis labels
pl.ylabel('y axis')
pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)
pl.legend([plot1, plot2], ('red line','green circles'), 'best', numpoints=1)# make legend
pl.show()# show the plot on the screen
如果在当前figure里plot的时候已经指定了label,如plt.plot(x,z,label="$cos(x^2)$")
,直接调用plt.legend()就可以了。
scatter函数
创建散点图。
fig=plt.figure()
ax=fig.add_subplot(111)
ax=scatter(data[:1],data[:,2]) #表示使用data矩阵的第2,3列数据创建散点图
savefig函数
保存图像。
import pylab
pylab.savefig('xxx.png')
plt.cla() #清空当前图像
中文显示问题
坐标标签的中文显示
import matplotlib
import matplotlib.pyplot as plt
myfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=36)
# 然后,在每个绘图的方法中,添加一项参数
fontproperties=myfont
一次完整的作图如下所示:
import matplotlib
import matplotlib.pyplot as plt
myfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=36)
# 然后,在每个绘图的方法中,添加一项参数
fontproperties=myfont
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.xlabel('横坐标',fontproperties=myfont) #给x轴加注释
plt.ylabel('纵坐标',fontproperties=myfont) #给y轴加注释
plt.show()
图例标签的中文显示(附带修改字体大小)
通过上面的设置,坐标标签能够显示中文了,但图例标签中如果有中文,还是不能正常显示,这时候应该把原先的
plt.legend()
替换为
plt.legend(loc=0, numpoints=1,prop=myfont)
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize=36)
这样就能正常显示中文了。另外,最后一行的plt.setp(ltext, fontsize=36)
可以修改图例标签字体大小。
设定x/y轴坐标的主刻度和次要刻度的方法
按照matplotlib官方document中的用法,对x axis/ y axis
坐标刻度间隔的控制可以基于 matplotlib.ticker
里的 MultipleLocator /FormatStrFormatter
模块来控制,具体实现见下:
from pylab import *
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
xmajorLocator = MultipleLocator(20) #将x主刻度标签设置为20的倍数
xmajorFormatter = FormatStrFormatter('%1.1f') #设置x轴标签文本的格式
xminorLocator = MultipleLocator(5) #将x轴次刻度标签设置为5的倍数
ymajorLocator = MultipleLocator(0.5) #将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式
yminorLocator = MultipleLocator(0.1) #将此y轴次刻度标签设置为0.1的倍数
t = arange(0.0, 100.0, 1)
s = sin(0.1*pi*t)*exp(-t*0.01)
ax = subplot(111) #注意:一般都在ax中设置,不再plot中设置
plot(t,s,'--b*')
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
#显示次刻度标签的位置,没有标签文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
ax.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
show()
仔细看代码,可以得知,设置坐标轴刻度和文本主要使用了"MultipleLocator"、"FormatStrFormatter"
方法。
这两个方法来自matplotlib
安装库里面ticker.py
文件;"MultipleLocator(Locator)"
表示将刻度标签设置为Locator的倍数,"FormatStrFormatter"
表示设置标签文本的格式,代码中"%1.1f"
表示保留小数点后一位,浮点数显示。
除了以上方法,还有另外一种方法,那就是使用xticks方法(yticks)。
import matplotlib.pyplot as pl
import numpy as np
from matplotlib.ticker import MultipleLocator, FuncFormatter
x = np.arange(0, 4*np.pi, 0.01)
y = np.sin(x)
pl.figure(figsize=(10,6))
pl.plot(x, y,label="$sin(x)$")
ax = pl.gca()
def pi_formatter(x, pos):
"""
比较罗嗦地将数值转换为以pi/4为单位的刻度文本
"""
m = np.round(x / (np.pi/4))
n = 4
if m%2==0: m, n = m/2, n/2
if m%2==0: m, n = m/2, n/2
if m == 0:
return "0"
if m == 1 and n == 1:
return "$\pi$"
if n == 1:
return r"$%d \pi$" % m
if m == 1:
return r"$\frac{\pi}{%d}$" % n
return r"$\frac{%d \pi}{%d}$" % (m,n)
# 设置两个坐标轴的范围
pl.ylim(-1.5,1.5)
pl.xlim(0, np.max(x))
# 设置图的底边距
pl.subplots_adjust(bottom = 0.15)
pl.grid() #开启网格
# 主刻度为pi/4
ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )
# 主刻度文本用pi_formatter函数计算
ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) )
# 副刻度为pi/20
ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )
# 设置刻度文本的大小
for tick in ax.xaxis.get_major_ticks():
tick.label1.set_fontsize(16)
pl.legend()
pl.show()
改变坐标轴刻度大小的方法
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter
plt.plot(x,y)
# 设置坐标轴刻度的字体大小
ax = plt.gca()
for label in ax.xaxis.get_ticklabels():
label.set_fontsize(25)
for label in ax.yaxis.get_ticklabels():
label.set_fontsize(25)
plt.show()
改变坐标轴标签字体与大小的方法
在myfont中设置要使用的字体的位置,同时设置字体大小。
myfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=24)
plt.xlabel(u'xxx',fontproperties=myfont)#给x轴加注释
plt.ylabel(u'yyy',fontproperties=myfont)#给y轴加注释