专注收集和自写可发表的科研图形的数据和代码分享,该系列的数据均可从以下链接下载:
百度云盘链接: https://pan.baidu.com/s/1M4vgU1ls0tilt0oSwFbqYQ
提取码: 请关注WX公zhong号 生信学习者 后台发送 科研绘图 获取提取码
介绍
在科学研究中,评估药物对小鼠肿瘤生长影响的实验设计,通常涉及绘制一条以时间节点为X轴,肿瘤大小为Y轴的线图。这种图表能够直观地展示不同时间点下,实验组与对照组之间肿瘤大小的对比情况。该图具有以下优势:
图表设计:创建一条线图,其中X轴代表时间节点,Y轴表示肿瘤的大小。这种设计使得研究者能够追踪并比较不同时间点的肿瘤生长情况。
数据分组:实验通常包括至少两个组别:实验组(接受药物治疗的小鼠)和对照组(未接受药物治疗的小鼠)。
数据对比:通过在同一图表中绘制两组数据的线,可以直观地观察和比较实验组与对照组的肿瘤大小差异。
疗效判断:根据线图上显示的肿瘤大小变化趋势,研究者可以评估药物的疗效。如果实验组的肿瘤生长速度明显低于对照组,这可能表明药物具有抑制肿瘤生长的潜力。
统计分析:为了进一步验证药物疗效,通常还会进行统计分析,以确定两组之间的差异是否具有统计学意义。
图表优化:为确保图表信息的清晰传达,采用适当的标记、颜色和线条样式区分不同组别,并添加误差条以展示数据的变异性。
结论提炼:基于图表分析和统计结果,提炼出药物对肿瘤生长影响的结论,为进一步的研究或临床应用提供依据。
导入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 size | Week | Treatment |
---|---|---|
2 | 1 | Control |
2 | 1 | Control |
3 | 1 | Control |
3 | 2 | Control |
4 | 2 | Control |
5 | 2 | Control |
画图
采用seaborn
包,进行画图,python画图相比R的ggplot2语法来说,它是一点一点修改图的元素,以下是代码解释:
1. plt.figure:设置图表的大小为4x4英寸:
2. err_kws:定义误差条的样式(例如,误差条末端的圆形大小、线宽等):
3. 使用seaborn
的lineplot
函数绘制线图,其中:
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
上存在显著差异,药物能够有效抑制肿瘤生长。
如果大家有任何问题,欢迎留言沟通交流