创建一个二维函数图像
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y = 2*x + 1
plt.plot(x, y)
plt.show()
这里plot()会制作一个以前者为横轴后者为纵轴的图像,show()会展示我们做好的图像
figure的使用方法
第一个是展示两个图片
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x, y1)
plt.figure(num=5,figsize=(8,5))
plt.plot(x,y2)
plt.show()
如上,右边出现了两个图片,figure后面还可以接上num=5,figsize=(8,5),修改其figure的名称还有图片的尺寸。
我们也可以让一个图片中出现两个函数曲线,并且控制其样式,可以修改其颜色,宽度,还有线条的样式。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x, y1)
plt.figure(num=5,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=10.0,linestyle='--')
plt.show()
修改坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.show()
这里使用xlim和ylim,会限制产生图像的数据范围,当然还是可以用鼠标去拖动图片的,只是优先会显示范围内的图像。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('I am x')
plt.ylabel('I am y')
plt.show()
这里我们还可以设置对x和y的描述,使用xlabel和ylabel标注,这里输出的图片是:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('I am x')
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],['redlly bad','bad','normal','good','really good'])
plt.show()
这里我们也可以对其刻度进行修改,针对于xticks和yticks,x这里相当于使用上方new_ticks的分割方式去取代,y这里则是将数据和文本一一对应,最后的输出效果如下图所示:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('I am x')
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],['redlly bad','bad','normal','good','really good'])
# gac = 'get current axis"
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',1))
plt.show()
如果我们要修改坐标轴位置,只需要对plt.gca()进行修改即可,这里的方法是先将右边和上面的边框改为透明,随后开始平移下方和左边的两条线,右边data后方的数字是坐标原点的位置。
图例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('I am x')
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],['redlly bad','bad','normal','good','really good'])
plt.plot(x,y2,label='up')
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down')
plt.legend()
plt.show()
这里通过在pkt.plot()括号中增加参数label来对该曲线打上一个标签,随后使用plt.legend()默认输出方法来输出这个图例,该代码具体效果如下:
这里可以继续修改图例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('I am x')
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],['redlly bad','bad','normal','good','really good'])
l1,=plt.plot(x,y2,label='up')
l2,=plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down')
plt.legend(handles=[l1,l2,],labels=['aaa','bbb'],loc='best')
plt.show()
这里plot是有返回值的,但是一定要有一个逗号(具体原因以后复习的时候在解释吧,有点懒),然后下方legend后面可以接上handles,这里就是指明要画的图像,label依然是标签,但是这里的loc改为best之后会随着改变图像自动找到数据量最小的地方来摆放这个图例。
注解
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y1)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
x0 = 1
y0 = 2*x0 + 1
plt.scatter(x0,y0)
plt.show()
这里上方的是一条直线,下方我们可以使用scatter来在图片中标注一个点,效果如下:
还可以修改这个点的大小和颜色,同时我们还可以做一条垂线下去,如下代码:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y1)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
x0 = 1
y0 = 2*x0 + 1
plt.scatter(x0,y0,s=50,color='b')
plt.plot([x0,x0],[y0,0],'k--',lw=2.5)
plt.show()
(其实感觉这部分纯粹用PS做就行,python太麻烦了,跳了!)
tick能见度
比如这行代码:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y = 0.1*x
plt.figure()
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.show()
这里直线和刻度卡在一起,看起来十分别扭,把坐标轴的数据全都都挡住了,我们对代码进行如下修改:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y = 0.1*x
plt.figure()
plt.plot(x,y,linewidth=10,zorder=1)
plt.ylim(-2,2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(12)
label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.7))
plt.show()
这里我们在plot后面增加了zorder=1,意思是设置相应的层级,,这样就可以看到了,然后下方我们可以对坐标轴进行设置,设置其尺寸类,还有字体的格式和效果,透明度等。
散点图
import matplotlib.pyplot as plt
import numpy as np
n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y,X)
plt.scatter(X,Y,s=75,c=T,alpha=0.5)
plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))
plt.xticks(())
plt.yticks(())
plt.show()
这里np.random.normal是创建一个正态分布,后续scatter才是散点图创建,下面的xticks和yticks是隐藏刻度,效果如下:
也可以这样:
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(np.arange(5),np.arange(5))
plt.xticks(())
plt.yticks(())
plt.show()
生成的效果是:
柱状图
import matplotlib.pyplot as plt
import numpy as np
n=12
X=np.arange(n)
Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1)
plt.bar(X,-Y2)
plt.xlim(-5,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()
使用bar创建相应的柱状图,对应的取值分别是均匀产出的X和使用均匀分布生成的Y1,Y2。
要进一步自定义颜色和打上相关标签
import matplotlib.pyplot as plt
import numpy as np
n=12
X=np.arange(n)
Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')
plt.xlim(-5,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()
这里再bar后方增加了facecolor和edgecolor,最后产出的效果为:
还可以在图像上打上对应的标签和数据:
import matplotlib.pyplot as plt
import numpy as np
n=12
X=np.arange(n)
Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')
for x,y in zip(X,Y1):
plt.text(x,y+0.05,'%.2f'%y,ha='center',va='center')
for x,y in zip(X,Y2):
plt.text(x,-y-0.05,'-%.2f'%y,ha='center',va='center')
plt.xlim(-5,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()
(暂时到此为止了,需要的时候再学吧)