上一次修改时间:2018-07-31 20:42:09

matplotlib的使用

1.matplotlib的基本用法

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1,1,100)#从-1到1生成100个点
y = 2*x + 1
plt.plot(x,y)
plt.show()

image.png

2.matplotlib+figure图像

#linspace函数:创建等差数列,第一个参数和第二个参数为数列开始和结束的值,第三个参数指定数列的个数
x = np.linspace(-1,1,100)
y1 = 2*x + 1
y2 = x**2

plt.figure()#创建一个图像
plt.plot(x,y1)#绘制图像

plt.figure()
plt.plot(x,y2)

plt.show()#显示图像

image.png

x = np.linspace(-1,1,100)
y1 = 2*x + 1
y2 = x**2

plt.figure()
plt.plot(x,y1)

plt.figure(figsize=(8,5))#创建一个宽度为8高度为5的图像
plt.plot(x,y2)

plt.show()

image.png

#color指定绘制的线条颜色,linewidth指定线条宽度,linestyle指定线条风格
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')
plt.show()

image.png

3.设置坐标轴

x = np.linspace(-3,3,100)
y1 = 2*x + 1
y2 = x**2

#xy范围
plt.xlim((-1,2))
plt.ylim((-2,3))

#xy描述
plt.xlabel('I AM X')
plt.ylabel('I AM Y')

plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')
plt.show()

image.png

new_ticks = np.linspace(-2,2,11)
print(new_ticks)

x = np.linspace(-3,3,100)
y1 = 2*x + 1
y2 = x**2

#xy范围
plt.xlim((-1,2))
plt.ylim((-2,3))

#xy描述
plt.xlabel('I AM X')
plt.ylabel('I AM Y')

plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')

plt.xticks(new_ticks)
plt.yticks([-1,0,1,2,3],
           ['level1','level2','level3','level4','level5'])
plt.show()

image.png

x = np.linspace(-3,3,100)
y1 = 2*x + 1
y2 = x**2

#xy范围
plt.xlim((-1,2))
plt.ylim((-2,3))

#xy描述
plt.xlabel('I AM X')
plt.ylabel('I AM Y')

plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')

new_ticks = np.linspace(-2,2,11)
print(new_ticks)

plt.xticks(new_ticks)
plt.yticks([-1,0,1,2,3],
           ['level1','level2','level3','level4','level5'])

#gca get current axis
ax = plt.gca()
#把右边和上边的边框去掉
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
#把x轴的刻度设置为‘bottom’
#把y轴的刻度设置为‘left’
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#设置bottom对应到0点
#设置left对应到0点
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

plt.show()

image.png

4.legend图例

x = np.linspace(-3,3,100)
y1 = 2*x + 1
y2 = x**2

#xy范围
plt.xlim((-1,2))
plt.ylim((-2,3))

#xy描述
plt.xlabel('I AM X')
plt.ylabel('I AM Y')

#将绘制的两条线分别保存到l1和l2,保存的时候变量名后面要加一个逗号
l1, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
l2, = plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')
#loc可以指定图例在图像中的位置,best表示自动在图像中寻找较好的位置,此外也可以自己指定位置
plt.legend(handles=[l1,l2],labels=['test1','test2'],loc='best')


new_ticks = np.linspace(-2,2,11)
print(new_ticks)

plt.xticks(new_ticks)
plt.yticks([-1,0,1,2,3],
           ['level1','level2','level3','level4','level5'])

plt.show()

image.png

5.标注

x = np.linspace(-1,1,100)
y1 = 2*x + 1

plt.plot(x,y1,color='red',linewidth=1.0,linestyle='-')

#gca get current axis
ax = plt.gca()
#把右边和上边的边框去掉
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
#把x轴的刻度设置为‘bottom’
#把y轴的刻度设置为‘left’
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#设置bottom对应到0点
#设置left对应到0点
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

x0 = 0.5
y0 = 2*x0 + 1
#画点
plt.scatter(x0,y0,s=50,color='b')
#画虚线,[x0 , x0],[y0 , 0]表示起始点为x0,y0终点为x0,0,
#第一个[]里的两个值表示起点和终点的x轴的值,第二个[]里的两个值表示起点和终点的Y轴的值
#k--给示黑色的虚线--
plt.plot([x0,x0],[y0,0],'k--',lw=2)

#参数r'$2x+1=%s$' % y0,xy=(x0,y0)表示要标注内容及内容的位置
#参数xytext=(+30,-30),textcoords='offset points'表示以标注点为起点,偏移xytext个位置
#arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')表示标注文本到标注点的箭头格式
#其中connectionstyle='arc3,rad=.2'表示箭头的弧度,不加该参数时,箭头为直线
plt.annotate(r'$2x+1=%s$' % y0,xy=(x0,y0),xytext=(+30,-30),textcoords='offset points',fontsize=16,
             arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))

#r'$this\ is\ the\ text$'标注文本里的空格需要用\转义
plt.text(-1,2,r'$this\ is\ the\ text$',fontdict={'size':'16','color':'r'})

plt.show()

image.png

6.scatter散点图

plt.scatter(np.arange(5),np.arange(5))
plt.show()


# In[5]:

x = np.random.normal(0,1,500)
y = np.random.normal(0,1,500)
#alpha表示透明度,图中颜色比较深的地方表示有多个点重合在一起
plt.scatter(x,y,s=50,c='b',alpha=0.5)

#限制x轴和y轴的范围
plt.xlim((-2,2))
plt.ylim((-2,2))

#x和y轴的刻度函数里什么都不传的话,表示取消掉图像上的刻度
plt.xticks(())
plt.yticks(())

plt.show()

image.png

7.bar直方图

#普通直方图生成
x = np.arange(10)
y = 2**x + 10
plt.bar(x,y)
plt.show()

#将y的值加上一个负号,生成一个倒的直方图
x = np.arange(10)
y = 2**x + 10
plt.bar(x,-y)
plt.show()


#改变直方图的颜色
#facecolor定义方块的底色
#edgecolor定义方块的边框颜色
x = np.arange(10)
y = 2**x + 10
plt.bar(x,y,facecolor='#9999ff',edgecolor='white')
plt.show()


#为直方图增加文本标识
x = np.arange(10)
y = 2**x + 10
plt.bar(x,y,facecolor='#9999ff',edgecolor='white')
#zip函数可以将多个变量结合成一个整体,以便在循环时,一次传入一组值
#x+0.4,y定义了文本相对于方块的显示位置
#'%.2f'定义了显示的数值的精度
#ha='center',va='bottom'定义了文本在方块上显示的位置
for x,y in zip(x,y):
    plt.text(x+0.4,y,'%.2f' % y,ha='center',va='bottom')

plt.show()

image.png

  image.png

8.contours等高线图

#生成(x,y)点高度的函数
def f(x, y):  
    return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2) 

x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)

X,Y = np.meshgrid(x,y)
#cmap参数定义绘图的颜色
plt.contourf(X,Y,f(X,Y),1,alpha=0.75,cmap=plt.cm.hot)

#注:参数里的数字8表示生成等高线的数量
C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)
#inline为True时,描述在等高线的里面,为false时,在等高线的外面
plt.clabel(C,inline=True,fontsize=10)

plt.xticks(())
plt.yticks(())
plt.show()

image.png

9.3D图

#Ipython中绘制的3D图可以旋转
from mpl_toolkits.mplot3d import Axes3D

#figure绘制了一个空的平面图,axes3D则会将平面图绘制成了3D图
fig = plt.figure()
ax = Axes3D(fig)

x = np.arange(-4,4,0.25)
y = np.arange(-4,4,0.25)
X,Y = np.meshgrid(x,y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

#绘制3D图
#cmap定义了绘图的颜色,rainbow为彩虹色
#rstride=1,cstride=1定义了3D图上线条之间在x和y上的间隔
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
#绘制3D图的在平面上的投影图
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')
ax.set_zlim(-2,2)

plt.show()

image.png

10.subplot创建子图像

plt.figure()
#subplot(2,2,1)表示创建一个2*2的图像集合,且该图像位于位置1
plt.subplot(2,2,1)
plt.plot([0,1],[0,1])

plt.subplot(2,2,2)
plt.plot([0,1],[0,1])

plt.subplot(223)
plt.plot([0,1],[0,1])

plt.subplot(224)
plt.plot([0,1],[0,1])

plt.show()

image.png

plt.figure()
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])

#创建了第一行只有一个图像,第二行有三个图像的图像集合
#第二行的图像索引是从4开始的,即第一即使只有一个图像,也占了三个索引
plt.subplot(2,3,4)
plt.plot([0,1],[0,1])

plt.subplot(235)
plt.plot([0,1],[0,1])

plt.subplot(236)
plt.plot([0,1],[0,1])

plt.show()

image.png

11.动态图

#控制台下ipython --pylab可以进入Ipython
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation

fig,ax = plt.subplots()

x = np.arange(0,2*np.pi,0.01)
line, = ax.plot(x,np.sin(x))

#图像动画函数
def animate(i):
    line.set_ydata(np.sin(x+i/10))
    return line,

#图像初始化函数
def init():
    line.set_ydata(np.sin(x))
    return line,

ani = animation.FuncAnimation(fig=fig,func=animate,init_func=init,interval=20)
plt.show()

注:动态图的效果是正弦曲线一直在跑;

image.png