科研绘图系列:python语言抑癌药物疗效线图(line chart)

文摘   2024-07-09 22:39   中国香港  

专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:

百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码

介绍

在科学研究中,评估药物对小鼠肿瘤生长影响的实验设计,通常涉及绘制一条以时间节点为X轴,肿瘤大小为Y轴的线图。这种图表能够直观地展示不同时间点下,实验组与对照组之间肿瘤大小的对比情况。该图具有以下优势:

  1. 图表设计:创建一条线图,其中X轴代表时间节点,Y轴表示肿瘤的大小。这种设计使得研究者能够追踪并比较不同时间点的肿瘤生长情况。

  2. 数据分组:实验通常包括至少两个组别:实验组(接受药物治疗的小鼠)和对照组(未接受药物治疗的小鼠)。

  3. 数据对比:通过在同一图表中绘制两组数据的线,可以直观地观察和比较实验组与对照组的肿瘤大小差异。

  4. 疗效判断:根据线图上显示的肿瘤大小变化趋势,研究者可以评估药物的疗效。如果实验组的肿瘤生长速度明显低于对照组,这可能表明药物具有抑制肿瘤生长的潜力。

  5. 统计分析:为了进一步验证药物疗效,通常还会进行统计分析,以确定两组之间的差异是否具有统计学意义。

  6. 图表优化:为确保图表信息的清晰传达,采用适当的标记、颜色和线条样式区分不同组别,并添加误差条以展示数据的变异性。

  7. 结论提炼:基于图表分析和统计结果,提炼出药物对肿瘤生长影响的结论,为进一步的研究或临床应用提供依据。

导入python包

import pandas as pd 
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

准备数据

两实验组在一段时间的Tumor size的变化数据。

ctr = [2, 2, 3, 3, 4, 5, 5, 6, 4, 8, 6, 6, 9, 11, 12, 12, 15, 16, 20, 25, 27]
drug = [2, 3, 2, 3, 4, 3, 3, 4, 5, 5, 6, 6, 8, 7, 6, 7, 8, 11, 10, 11, 15]

week = []
for x in range(1, 8):
week += [x, x, x]
week += week

vals = ctr + drug

labels = ['Control'] * 21 + ['Drug_z'] * 21

df = pd.DataFrame(zip(vals, week, labels), columns = ['Tumor size', 'Week', 'Treatment'])

df.head()
Tumor sizeWeekTreatment
21Control
21Control
31Control
32Control
42Control
52Control

画图

采用seaborn包,进行画图,python画图相比R的ggplot2语法来说,它是一点一点修改图的元素,以下是代码解释:

1. plt.figure:设置图表的大小为4x4英寸:

2. err_kws:定义误差条的样式(例如,误差条末端的圆形大小、线宽等):

3. 使用seabornlineplot函数绘制线图,其中:

  • data=df:指定数据源为df DataFrame。

  • x='Week':X轴代表周数。

  • y='Tumor size':Y轴代表肿瘤大小。

  • hue='Treatment':根据治疗方法对数据进行分组,并用不同颜色表示。

  • lw=2.5:线条宽度。

  • style='Treatment':使用治疗方法作为线条样式的依据。

  • markers=['o', '^']:定义不同治疗组的标记符号。

  • dashes=False:不使用虚线。

  • markersize=8:标记大小。

  • err_style='bars':误差条的样式为条形。

  • err_kws=err_kws:应用之前定义的误差条样式。

  • palette=['gray', 'firebrick']:指定调色板,为不同治疗组分配颜色。

4. 自定义图表的边框样式,隐藏顶部和右侧边框,并设置其他边框的宽度和颜色。

5. 设置坐标轴刻度参数,包括宽度和颜色。

6. 设置X轴和Y轴标签的字体大小、加粗、颜色。

7. 自定义图例样式,包括无边框、字体加粗、大小和颜色。

8. 循环处理每一周的数据,使用stats.ttest_ind函数计算药物处理组和对照组肿瘤大小的统计显著性(p值)。如果p值小于0.05(表示统计显著),在图表上对应周数的位置添加一个星号(*);如果不显著,添加"ns"(不显著的缩写)。plt.text函数用于在图表上的特定位置添加文本。

plt.figure(figsize = (4, 4))

err_kws = {'capsize': 5, 'capthick': 2, 'elinewidth': 2}

ax = sns.lineplot(data = df, x = 'Week', y = 'Tumor size', hue = 'Treatment',
lw = 2.5, style = 'Treatment', markers = ['o', '^'], dashes = False,
markersize = 8, err_style = 'bars', err_kws = err_kws,
palette = ['gray', 'firebrick'])

for axis in ['bottom', 'left']:
ax.spines[axis].set_linewidth(2.5)
ax.spines[axis].set_color('0.2')

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

ax.tick_params(width = 2.5, color = '0.2')

plt.xticks(size = 14, weight = 'bold', color = '0.2')
plt.yticks(size = 14, weight = 'bold', color = '0.2')

ax.set_xlabel(ax.get_xlabel(), fontsize = 14, weight = 'bold', color = '0.2')
ax.set_ylabel(ax.get_ylabel(), fontsize = 14, weight = 'bold', color = '0.2')

plt.legend(frameon = False, prop = {'weight': 'bold', 'size': 14}, labelcolor = '0.2')

for week in range(1, 8):
z = df[(df.Week == week) & (df.Treatment == 'Drug_z')]['Tumor size'].values
c = df[(df.Week == week) & (df.Treatment == 'Control')]['Tumor size'].values

p = stats.ttest_ind(z, c).pvalue

max_v = df[df.Week == week]['Tumor size'].max()

if p < 0.05:
plt.text(x = week - 0.05, y = max_v - 0.5, s = "*",
fontsize = 20, ha = 'center', va = 'bottom')
else:
plt.text(x = week, y = max_v, s = "ns", fontsize = 14,
ha = 'center', va = 'bottom', color = '0.2')

plt.show()

# plt.savefig('line_errorbar.png', bbox_inches = 'tight', dpi = 500, facecolor = ax.get_facecolor())

结果:随着时间推移,在week5之后,药物组和对照组在Tumor size上存在显著差异,药物能够有效抑制肿瘤生长。

如果大家有任何问题,欢迎留言沟通交流


生信学习者
生信教程分享,专注数据分析和科研绘图方向欢迎大家关注,也可一起探讨生信问题