使用Python的matplotlib画图

注:相关内容来自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()

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值