注:相关内容来自b站莫烦python,link:https://www.bilibili.com/video/av16378354?from=search&seid=3944386009119624706
最近做论文大修,按照审稿人的要求,需要对实验图片进行重画。做了下调研,还是觉得用matplot比较方便,所以特意学了一下,把一些比较关键的功能分享给大家,做个参考。
在pycharm里,下载相关的功能包,包括numpy和matplot。
首先导入包:
import matplotlib.pyplot as plt
import numpy as np
1. 画一条直线和一条二次曲线:
x = np.linespace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y1)
#带参数
plt.figure(num = 3,figsize=(5,5))
plt.plot(x,y2,color='red',linewidth = 1.0, linestyle = '--')
plt.show()
2. 设置坐标轴的取值范围与一些相关设置
x = np.linespace(-1,1,50)
y2 = x**2
#带参数
plt.figure(num = 3,figsize=(5,5))
plt.plot(x,y2,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()
#替换坐标轴的数字为文字:
new_ticks = np.linespace(-1, 2, 5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2, -1.8 , -1, 1.22, 3,], [r'$really\ bad$', r'$bad$', r'$normal$', '$good$', '$really good$'])
#gca = 'get current axis'
ax = plt.gca()
ax.spine['right'].set_color('none')#图片右边框消除
ax.spine['top'].set_color('none')#图片右边框消除
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spine['bottom'].set_position(('data', -1))#调整x轴对其y的-1
as.spine['left'].set_position(('data', 0))#调整y轴对其x的0
plt.show()
3. 图例
l1,= plt.plot(x, y2, label='up')
l2,= plt.plot(x, y1, color = 'red', linewidth = 1.0, linestyle = '--', label='up')
#将坐标轴的信息拿到,并且输出在图例中
plt.legend(handles=[l1,l2]), labels = ['aaa','bbb'], loc = 'best')#loc代表位置
plt.show()
4. 在图片中添加注解
#在一个点标识注解
x0 = 1
y0 = 2*x0 + 1
plt.scatter(x0, y0, s = 50, color='b')
#[x0,x0],[y0,0]是两个点的连线,xo,y0与x0,0
plt.plot([x0, x0], [y0, 0], 'k--',lw = 2.5)
#xytext基于哪个点打注解,arrowprops打个箭头
plt.annotate(r'$2x+1=%$'% y0, xy = (x0,y0),xycoords = 'data',xytext = (+30,-30),textcoords='offset points', fontsize = 16, arrowprops = dict(arrowstyle='->',connectionstyle='arc3, rad=.2'))
#method2
##################
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text.\ \mu\ \sigma_i\ \alpha_t$',
fontdict={'size':16, 'color':'r'})
plt.show()
防遮挡:ticks的label能够单个设置参数以突出显示
ax = plt.gca()
#给坐标轴的标注加一个底以增加呈现
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(12)
label.set_bbox(dict(facecolor = 'white', edgecolor='None', alpha=0.7))
5. 散点图
n = 1024
#x y个1024 随机数
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X)#for color value
plt.scatter(X,Y,s = 75,c = T,alpha = 0.5)
#一条线的散点图
plt.scatter(np.arange(5),np.arange(5))
plt.xlim((-1.5, 1.5))
plt.ylim((-1.5, 1.5))
plt.xticks(())
plt.yticks(())
plt.show()
6. 柱状图
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 + 0.4, y + 0.05, '%.2f' % y, ha = 'center', va = 'bottom')
for x,y in zip(X,Y2):
plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha = 'center', va = 'top')
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()
7. 等高线
def f(x, y):
return (1 - x /2 + x**5 + y**3)*np.exp(-x**2 -y**2)
n = 256
x = np.linspace(-3, 3 ,n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x,y)#绑定网格输入值
plt.contourf(X,Y,f(X,Y),20,alpha = 0.75,cmap = plt.cm.hot)
#绘制等高线,8表示分段
C= plt.contour(X,Y,f(X,Y),20,colors = 'black',linewidth = .5)
#加等高线的说明字符
plt.clabel(C,inline=True,fontsize = 10)
plt.xticks(())
plt.yticks(())
plt.show()
8. 显示图片
a = np.array([0.3,0.3,0.4,0.3,0.4,0.5,0.4,0.5,0.6]).reshape(3,3)
plt.imshow(a, interpolation = 'nearest', cmap = 'bone',origin = 'upper')
#压缩
plt.colorbar(shrink = 0.5);
plt.xticks(())
plt.yticks(())
plt.show()
9. 3D图像
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
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)
#rstride = 1, cstride =1 行列线的密度
ax.plot_surface(X,Y,Z, rstride = 1, cstride = 1, cmap = plt.get_cmap('rainbow'))
#对应三维图画一个等高线图
ax.contourf(X,Y,Z, zdir='z',offset=-2,cmap='rainbow')
ax.set_zlim(-2,2)
plt.show()
10. 绘制子图1
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.figure()
#规则排队
# plt.subplot(2,2,1)
# plt.plot([0,1],[0,1])
#
# plt.subplot(2,2,2)
# plt.plot([0,1],[0,1])
#
# plt.subplot(2,2,3)
# plt.plot([0,1],[0,1])
#
# plt.subplot(2,2,4)
# plt.plot([0,1],[0,1])
#不规则
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])
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()
绘制子图2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
plt.figure()
ax1 = plt.subplot2grid((3,3),(0,0),colspan = 3, rowspan = 1)#1行2列
ax1.plot([1,2],[1,2])
ax1.set_title('ax1_title')
ax2 = plt.subplot2grid((3,3),(1,0),colspan = 2,)
ax3 = plt.subplot2grid((3,3),(1,2),rowspan = 2)
ax4 = plt.subplot2grid((3,3),(2,0))
ax5 = plt.subplot2grid((3,3),(2,1))
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
plt.figure()
gs = gridspec.GridSpec(3,3)
ax1 = plt.subplot(gs[0,:])#第0行,占用所有列
ax2 = plt.subplot(gs[1,:2])#第1行,占用前两列
ax3 = plt.subplot(gs[1:,2])#第1行之后,占用两行
ax4 = plt.subplot(gs[-1,0])#最后一行,第一列
ax5 = plt.subplot(gs[-1,-2])#最后一行,倒数第二列
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
f, ((ax11,ax12),(ax21,ax22)) = plt.subplots(2,2, sharex = True, sharey = True)
ax11.scatter([1,2],[1,2])
plt.tight_layout()
plt.show()
11. 大图里边放小图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
x = [1,2,3,4,5,6,7]
y = [1,3,4,2,5,8,6]
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left,bottom,width,height])
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_xlabel('y')
ax1.set_title('title')
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2 = fig.add_axes([left,bottom,width,height])
ax2.plot(x,y,'r')
ax2.set_xlabel('x')
ax2.set_xlabel('y')
ax2.set_title('title inside1')
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1],x,'g')
plt.xlabel('x')
plt.xlabel('y')
plt.title('title inside2')
plt.show()
12..次坐标轴
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
x = np.arange(0,10,0.1)
y1 = 0.05 * x **2
y2 = -1 * y1
fig,ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x,y1,'g-')
ax2.plot(x,y2,'b--')
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1', color = 'g')
ax2.set_ylabel('Y2', color = 'b')
plt.show()