如何在R中将两个重复基因的箱线图合并到同一画布?
把两个重复基因的交互箱线图合并成一个的实现方法
首先得搞定数据格式:把两个基因的宽格式数据转成长格式,新增一列标记是SDHBa还是SDHBb,这样绘图工具就能基于这个标记把两个基因的箱线图放在同一张图里展示。
方案1:用Plotly Express快速实现(推荐,交互性拉满)
Plotly Express写起来简单,自带交互,还能保留你要的所有样式——箱线图、抖动散点、颜色区分、参考线都能搞定:
示例代码
import plotly.express as px import pandas as pd # 假设你的原始数据是下面这样的,直接替换成你自己的真实数据就行 # SDHBa_data:包含分组列(比如样本分组group)和表达量列SDHBa_expr # SDHBb_data:和上面结构一致,表达量列是SDHBb_expr SDHBa_data = pd.DataFrame({ "group": ["A", "A", "B", "B", "C", "C"], "SDHBa_expr": [2.3, 3.1, 1.8, 2.5, 3.5, 4.2] }) SDHBb_data = pd.DataFrame({ "group": ["A", "A", "B", "B", "C", "C"], "SDHBb_expr": [1.9, 2.7, 1.5, 2.2, 3.2, 3.9] }) # 把两个数据集合并成长格式,方便绘图 merged_data = pd.melt( pd.concat([SDHBa_data, SDHBb_data], axis=1), id_vars=["group"], value_vars=["SDHBa_expr", "SDHBb_expr"], var_name="gene", value_name="expression" ) # 把gene列的_expr后缀去掉,显示更清爽(可选操作) merged_data["gene"] = merged_data["gene"].str.replace("_expr", "") # 绘制交互箱线图+抖动散点 fig = px.box( merged_data, x="group", # x轴是样本分组 y="expression", # y轴是表达量 color="gene", # 按基因分颜色 points="all", # 显示所有散点,自动做抖动避免重叠 color_discrete_map={"SDHBa": "#1f77b4", "SDHBb": "#ff7f0e"}, # 自定义颜色,换成你喜欢的色号就行 title="SDHBa & SDHBb 表达量分布" ) # 添加全局均值参考线(按需调整,也可以加分组均值) mean_expr = merged_data["expression"].mean() fig.add_hline( y=mean_expr, line_dash="dash", # 虚线样式 line_color="gray", annotation_text=f"全局均值: {mean_expr:.2f}", # 标注文本 annotation_position="bottom right" ) # 如果要加每组的均值参考线,用下面这段循环 for group in merged_data["group"].unique(): group_mean = merged_data[merged_data["group"] == group]["expression"].mean() fig.add_hline( y=group_mean, line_dash="dot", # 点线样式 line_color="red", annotation_text=f"{group}组均值: {group_mean:.2f}", annotation_position="top right", annotation_font_size=10 ) # 调整坐标轴和图例名称 fig.update_layout( xaxis_title="样本分组", yaxis_title="基因表达量", legend_title="基因名称" ) # 显示交互图 fig.show()
效果说明
- 同一分组下的两个基因箱线图会并排展示,自动区分颜色
- 散点自动抖动不重叠,鼠标悬停能看到每个点的具体数据
- 参考线可以灵活加全局或分组级别的,带文本标注,清晰明了
方案2:用Plotly Graph Objects精细自定义
如果你需要更细致的样式控制(比如调整箱线宽度、散点抖动幅度),用Graph Objects更灵活:
示例代码
import plotly.graph_objects as go import pandas as pd import numpy as np # 数据合并部分和方案1完全一样,这里省略,直接用merged_data就行 # ...(复制方案1的合并代码) # 创建空画布 fig = go.Figure() # 逐个基因添加箱线图和散点 for gene, color in zip(["SDHBa", "SDHBb"], ["#1f77b4", "#ff7f0e"]): gene_data = merged_data[merged_data["gene"] == gene] # 添加箱线图,设置宽度避免重叠 fig.add_trace(go.Box( x=gene_data["group"], y=gene_data["expression"], name=gene, marker_color=color, boxpoints=False, # 不自动生成散点,后面手动加抖动散点 width=0.3 # 箱线宽度,按需调整 )) # 手动生成抖动散点,控制抖动范围 jitter_x = gene_data["group"].apply(lambda x: x + np.random.uniform(-0.15, 0.15)) fig.add_trace(go.Scatter( x=jitter_x, y=gene_data["expression"], mode="markers", marker=dict(color=color, size=6, opacity=0.7), showlegend=False # 不重复显示图例 )) # 添加参考线,和方案1一样 mean_expr = merged_data["expression"].mean() fig.add_hline( y=mean_expr, line_dash="dash", line_color="gray", annotation_text=f"全局均值: {mean_expr:.2f}", annotation_position="bottom right" ) # 设置布局,让箱线图按分组并排 fig.update_layout( title="SDHBa & SDHBb 表达量分布", xaxis_title="样本分组", yaxis_title="基因表达量", legend_title="基因名称", boxmode="group" # 关键参数,让同分组的箱线图并排 ) fig.show()
优势
- 可以精确控制箱线的宽度、散点抖动的范围,避免两个基因的图重叠
- 箱线和散点的样式可以分开调整,比如散点的透明度、大小都能自定义
几个要注意的点
- 确保两个基因的分组列完全一致(比如分组名称、数量都一样),不然合并后会出现缺失值
- 如果你的数据是numpy数组或者其他格式,先转成DataFrame再合并会更方便
- 颜色映射可以随便改,比如换成你论文里用的配色体系,只要对应好基因就行
- Plotly生成的图自带交互功能:可以缩放、平移、悬停看数据,完全符合你的需求
内容的提问来源于stack exchange,提问作者n rank
相关产品推荐
相关产品推荐

