血药浓度-时间曲线一般是通过拟合所测定的血药浓度点而画出来的,但是在某些时候,如阅读文献时,我们需要根据别人报道的PK参数来画出药时曲线。Python语法简单,拥有丰富的开源库,下面尝试通过Python来根据已知的血药浓度公式绘制药时曲线。

我们选择口服给药、符合单室模型的药物来画图,因为这种药物较为常见,公式也很简单,并将2个模型的血药浓度画在同一张图上,便于比较。

首先绘制单剂量给药,对于model1,我们设置给药剂量$X_0=5mg$,生物利用度$F=100%$,表观分布容积$V=20L$,一级吸收速率常数$k_a=1$,一级消除速率常数$k=0.1$;对于model2,我们设置给药剂量$X_0=5mg$,生物利用度$F=100%$,表观分布容积$V=40L$,一级吸收速率常数$k_a=1$,一级消除速率常数$k=0.1$。

隔室模型示意图如下:

model1的血药浓度表达式为:

$$C=\frac{k_a\cdot X_0\cdot F}{V(k_a-k)}(e^{-kt}-e^{-k_at})=\frac{1\times 5 \times 1}{20\times (1-0.1)}(e^{-1}-e^{-0.1})$$

model2的血药浓度表达式为:

$$C=\frac{k_a\cdot X_0\cdot F}{V(k_a-k)}(e^{-kt}-e^{-k_at})=\frac{1\times 5 \times 1}{40\times (1-0.1)}(e^{-1}-e^{-0.1})$$

有了血药浓度公式,下面就可以画图了。

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 e=np.e5 plt.figure(figsize=(6,4))6 t= np.linspace(0, 20, 1000)7

8 plt.plot(t,5/(20*(1-0.1))*(e**(-0.1*t)-e**(-1*t)),label='model 1')9 plt.legend()10 plt.plot(t,5/(40*(1-0.1))*(e**(-0.1*t)-e**(-1*t)),label='model 2')11 plt.legend()12 plt.title('single dose')13 plt.xlabel('t (h)')14 plt.ylabel('c (ng/ml)')15 plt.show()

单剂量搞定,下面考虑多剂量给药的图形。对于多剂量给药,我们一般需要使血药浓度达到稳态。

以model1为例,首先求算其表达式。设置给药间隔$\tau =5h$,给药次数$n=10$。在第1个给药周期内,其血药浓度为第1次给药后的浓度;在第2个给药周期内,其血药浓度为第1次给药后5~10 h内的浓度加上第2次给药后0~5 h内的浓度;以此类推。显然,多剂量给药,其体内药量是一个分段函数:

$\begin{cases}

X_0\cdot e^{-kt} & \text{ } n=1, 0\leq t\leq 5 \\

X_0\cdot e^{-kt}+X_1\cdot e^{-k\cdot(t-5)} & \text{ } n=2, 5\leq t\leq 10 \\

X_0\cdot e^{-kt}+X_1\cdot e^{-k\cdot(t-5)}+X_2\cdot e^{-k\cdot(t-10)} & \text{ } n=3, 5\leq t\leq 10 \\

\cdots \\

X_0\cdot e^{-kt}+X_1\cdot e^{-k\cdot(t-5)}+X_2\cdot e^{-k\cdot(t-10)}+\cdots +X_n\cdot e^{-k\cdot [t-5(n-1)]} & \text{ } n=n, 5(n-1)\leq t\leq 5n

\end{cases}$

分段函数图像分段画,代码如下:

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 e=np.e5 t= np.linspace(0,49,1000)6

7 #intervals

8 i1 = [1 if (i>=0 and i<=5) else 0 for i int]9 i2 = [1 if (i>=5 and i<=10) else 0 for i int]10 i3 = [1 if (i>=10 and i<=15) else 0 for i int]11 i4 = [1 if (i>=15 and i<=20) else 0 for i int]12 i5 = [1 if (i>=20 and i<=25) else 0 for i int]13 i6 = [1 if (i>=25 and i<=30) else 0 for i int]14 i7 = [1 if (i>=30 and i<=35) else 0 for i int]15 i8 = [1 if (i>=35 and i<=40) else 0 for i int]16 i9 = [1 if (i>=40 and i<=45) else 0 for i int]17 i10 = [1 if (i>=45 and i<=49) else 0 for i int]18

19 defc(t):20 return 5/(20*(1-0.1))*(e**(-0.1*t)-e**(-1*t))21

22 y=c(t)*i1+\23 (c(t)+c(t-5))*i2+\24 (c(t)+c(t-5)+c(t-10))*i3+\25 (c(t)+c(t-5)+c(t-10)+c(t-15))*i4+\26 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20))*i5+\27 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20)+c(t-25))*i6+\28 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20)+c(t-25)+c(t-30))*i7+\29 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20)+c(t-25)+c(t-30)+c(t-35))*i8+\30 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20)+c(t-25)+c(t-30)+c(t-35)+c(t-40))*i9+\31 (c(t)+c(t-5)+c(t-10)+c(t-15)+c(t-20)+c(t-25)+c(t-30)+c(t-35)+c(t-40)+c(t-45))*i1032

33 plt.plot(t,y)34 plt.show()

画出model1给药次数为10次,给药间隔为$5h$时的药时曲线:

由于分段函数需要分段表示,必须要用语句划分区间,并且每一段的表达式都要写出来,导致上述代码比较长。在药代动力学教材中,通过引入多剂量函数($r=\frac{1-e^{-nk\tau }}{1-e^{-k\tau}}$)这个概念,可利用$n$和$t$把第$n$次给药的体内药量$X(n,t)$的通式表示出来:

$$X_n=X_0\cdot \frac{1-e^{-nk\tau }}{1-e^{-k\tau}}\cdot e^{-kt}$$

则第$n$次给药后,血药浓度$C_n$为:

$$X_n=\frac{X_0}{V}\cdot \frac{1-e^{-nk\tau }}{1-e^{-k\tau}}\cdot e^{-kt}$$

根据此公式画图:

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 e=np.e5 t= np.linspace(0,49,1000)6

7 i1 = [1 if (i>=0 and i<=5) else 0 for i int]8 i2 = [1 if (i>=5 and i<=10) else 0 for i int]9 i3 = [1 if (i>=10 and i<=15) else 0 for i int]10 i4 = [1 if (i>=15 and i<=20) else 0 for i int]11 i5 = [1 if (i>=20 and i<=25) else 0 for i int]12 i6 = [1 if (i>=25 and i<=30) else 0 for i int]13 i7 = [1 if (i>=30 and i<=35) else 0 for i int]14 i8 = [1 if (i>=35 and i<=40) else 0 for i int]15 i9 = [1 if (i>=40 and i<=45) else 0 for i int]16 i10 = [1 if (i>=45 and i<=49) else 0 for i int]17

18 defc(t,n):19 return 5/(20*(1-0.1))*((1-e**(-0.1*5*n))/(1-e**(-5*0.1))*e**(-0.1*t)-(1-e**(-1*5*n))/(1-e**(-1*5))*e**(-1*t))20

21 y=c(t,1)*i1+c(t-5,2)*i2+c(t-10,3)*i3+c(t-15,4)*i4+c(t-20,5)*i5+c(t-25,6)*i6+c(t-30,7)*i7+c(t-35,8)*i8+c(t-40,9)*i9+c(t-45,10)*i1022

23 plt.plot(t,y)24 plt.show()

血药浓度图像如下:

与上一段代码比起来,这段代码在表示y的时候简洁了许多,但仍然需要划分区间,这就导致在改变给药次数$n$后,画图需要改动代码,并且$n$比较大时,代码也比较长。那么如在让我们设置任意的$n$时,图形都可以方便地画出来呢?

之前我们是根据表达式直接画图(虽然Python实现起来是通过生成很多散点),而表达式一旦是分段函数的话,画起来就很麻烦,必须分段(因此可以看到代码中有很长的一段是在分割区间)。现在可以转换一下思路,不通过表达式画图,而是通过表达式生成散点,再通过散点作图。利用分段函数产生点比利用分段函数画图方便多了,尤其是$C(n,t)$的通式已经给出了,只需一个简单的循环语句就能生成每一次给药后的浓度点,再通过Python的列表(list)或数组(array)的append()方法,把不同时间段的浓度点连接起来,就是我们所需要的y(全程的浓度),根据时间散点和浓度散点,就可以把图画出来了。并且给药次数可以任意设置。

给药次数设为10次:

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 defc(t,n):5 return 5/(20*(1-0.1))*((1-e**(-0.1*5*n))/(1-e**(-5*0.1))*e**(-0.1*t)-(1-e**(-1*5*n))/(1-e**(-1*5))*e**(-1*t))6

7 e=np.e8 t1= np.linspace(0,4,100)9 y1=c(t1,1)10 t=t111 y=y112

13 for N in range(2,10):14 tN=t1+(N-1)*5

15 yN=c(t1,N)16 t=np.append(t,tN)17 y=np.append(y,yN)18

19 plt.plot(t,y)20 plt.show()

如果想把给药次数设为50,只需将第13行代码的10改成50即可:

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 defc(t,n):5 return 5/(20*(1-0.1))*((1-e**(-0.1*5*n))/(1-e**(-5*0.1))*e**(-0.1*t)-(1-e**(-1*5*n))/(1-e**(-1*5))*e**(-1*t))6

7 e=np.e8 t1= np.linspace(0,4,100)9 y1=c(t1,1)10 t=t111 y=y112

13 for N in range(2,50):14 tN=t1+(N-1)*5

15 yN=c(t1,N)16 t=np.append(t,tN)17 y=np.append(y,yN)18

19 plt.plot(t,y)20 plt.show()

由于开头说比较model1和model2,要把2条曲线画在一起。所以最后再画上model2的药时曲线,添上标题、图例、横纵坐标,画图完成。

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4 plt.figure(figsize=(8,6))5

6 defc1(t,n):7 return 5/(20*(1-0.1))*((1-e**(-0.1*5*n))/(1-e**(-5*0.1))*e**(-0.1*t)-(1-e**(-1*5*n))/(1-e**(-1*5))*e**(-1*t))8 defc2(t,n):9 return 5/(20*(1-0.2))*((1-e**(-0.2*5*n))/(1-e**(-5*0.2))*e**(-0.2*t)-(1-e**(-1*5*n))/(1-e**(-1*5))*e**(-1*t))10

11 e=np.e12 t0= np.linspace(0,4,100)13 t=t014 y1=c1(t0,1)15 y2=c2(t0,1)16

17 for N in range(2,20):18 tN=t0+(N-1)*5

19 yN1=c1(t0,N)20 yN2=c2(t0,N)21 t=np.append(t,tN)22 y1=np.append(y1,yN1)23 y2=np.append(y2,yN2)24

25 plt.plot(t,y1,label='model 1')26 plt.plot(t,y2,label='model 2')27 plt.legend()28 plt.title('multiple dose')29 plt.xlabel('t (h)')30 plt.ylabel('c (ng/ml)')31 plt.show()

利用python画曲线_利用Python绘制血药浓度-时间曲线——口服吸收一室模型相关推荐

  1. python显示血量条,利用Python绘制血药浓度-时间曲线——口服吸收一室模型

    血药浓度-时间曲线一般是通过拟合所测定的血药浓度点而画出来的,但是在某些时候,如阅读文献时,我们需要根据别人报道的PK参数来画出药时曲线.Python语法简单,拥有丰富的开源库,下面尝试通过Pytho ...

  2. python画两条曲线图_python绘制多个曲线的折线图

    这篇文章利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图: # -*- coding: UTF-8 -*- import numpy as np i ...

  3. 用python画明星_用Python画一颗特别的心送给她

    [前言] 520刚过去了,大家有没有跟自己喜欢的对象在一起呢? 520 当天你还在送 玫瑰花?巧克力?情侣套装?... 小编就想说:你能不能换点新意呢,这些操作已经普通的不能再普通了吧!就像别人来例假 ...

  4. 用python画圆锥_用python画一幅美瞳,今日份来自程序员的浪漫

    如果说,眼睛是心灵的窗户,那么,美瞳就是心灵的彩窗,就像下图中这样. 而我们今天所要挑战的,就是用python画美瞳,而且是五分钟之内画三百副争奇斗艳.各领风骚.绝不重样的美瞳.作为这颗地球上最纯情的 ...

  5. 用python画佩奇_使用python画个小猪佩奇的示例代码

    基本原理 选好画板大小,设置好画笔颜色.粗细,定位好位置,依次画鼻子.头.耳朵.眼睛.腮.嘴.身体.手脚.尾巴,完事儿. 都知道,Turtle 是 Python 内置的一个比较有趣味的模块,俗称&qu ...

  6. 用python画皇冠_用python做数字油画或者从一幅画学习风格,去画另一幅画

    原博文 2018-08-30 17:12 − 1. 用python做数字油画 模块: pillow 2. 从一幅画学习风格,去画另一幅画 http://pytorch.org/tutorials/ad ...

  7. python画雪_用Python画一棵带音乐的雪夜圣诞树

    本文我们用 Python 来画一棵带音乐效果的雪夜圣诞树,基本思路如下:用 Python 画一棵圣诞树作为背景图 在圣诞树背景图中添加雪落效果及音乐 下面来看一下具体实现. 首先,我们来画一棵圣诞树, ...

  8. 用python画风车_用Python画小女孩放风筝的示例

    我就废话不多说了,直接上代码吧! # coding:utf-8 2import turtle as t 3import random 4# 画心 5def xin(): 6 def curvemove ...

  9. 怎么用python画房子_用python画一个小房子

    用python画一个小房子 2020年07月22日 | 萬仟网IT编程 | 我要评论 如何用python画一个小房子?效果图如下:代码如下:import turtle# 前置p = turtle.Pe ...

最新文章

  1. 自然语言处理「迷惑行为大赏」,自然语言处理太难难难了!
  2. 这一招将 Numpy 加速 700 倍!!!
  3. 大写“惨”?三次改变世界、却被无情出局的程序员大牛!
  4. html自定义标签提示,用简单的jquery+CSS创建自定义的a标签title提示tooltip_HTML/Xhtml_网页制作...
  5. 关于分布式事务、两阶段提交协议、三阶提交协议
  6. NoSQL数据库程序员应该在2019年学习的5大知识
  7. professional中文_Microsoft office 2007 简体中文版
  8. 读写文本文件和二进制文件——二进制模式
  9. 表达式for loop
  10. linux安装vnc
  11. android界面设计中用的字体,APP界面设计必备!最全UI设计字体规范
  12. JsonView用法
  13. html5个人博客毕业论文,基于HTML的个人博客网页设计.docx
  14. 模电——电阻与电容并联作用
  15. Linux程序设计(常用Linux命令)
  16. matlab计算正弦信号基波,Matlab入门篇——正弦信号、实指数信号和复指数信号的仿真.ppt...
  17. CocosCreator微信小游戏开发 之 开放数据域设置微信好友排行榜布局自适应高度和宽度
  18. Android Proximity Sensor近距离传感器P-Sensor
  19. 开源库3dTagCloudAndroid使用,实现3D球形云标签tag效果
  20. XUL 用户界面语言介绍

热门文章

  1. VDA高可用,在 Delivery Controller 出现故障时可以访问桌面和应用程序
  2. Meta for Mac(专业的音乐标签编辑器)
  3. eclipse压缩包国内镜像下载
  4. 解决买火车票问题的方案。
  5. 计算机使用个人经验及日常维护
  6. 保利威(polyv)加密视频的使用详解---python(基于drf/vue)
  7. 三分钟学会基础k线图知识
  8. 用python画小黄人代码-Python turtle模块小黄人程序
  9. 如何在Activity中获取调用者 -- getReferrer()
  10. 开源WebGIS-相关知识