weixin_44354553 2026-02-14 12:05 采纳率: 50%
浏览 2

做cellchat画图时自环的角度颠倒

做cellchat画图时自环的角度颠倒,如何解决,cellchat版本为2.2,ggplot2为4.0.2

library(CellChat)

data.input <- LayerData(scRNA.tumor, layer = "data")
identity <- subset(scRNA.tumor@meta.data, select = c("celltype.4","orig.ident"))
colnames(identity) <- c("celltype.4", "samples")
identity$samples <- factor(identity$samples)
# 创建cellchat对象
cellchat <- createCellChat(object = data.input, 
                           meta = identity,  
                           group.by = "celltype.4")

# 可选CellChatDB.human(人类配体-受体知识库), CellChatDB.mouse
CellChatDB <- CellChatDB.human

# 查看可以选择的interaction的类型标签
unique(CellChatDB$interaction$annotation)
# 画数据库分类统计图(主要用于了解数据库构成)
showDatabaseCategory(CellChatDB)

# 把选定的数据库写入对象
cellchat@DB <- CellChatDB

# 将信号基因的表达数据进行子集化,只保留信号相关基因,以节省计算成本
cellchat <- subsetData(cellchat)

# 计算策略改串联,之前用的8核并行报错(内存可能不够)
future::plan("sequential") 

# 识别过表达基因
cellchat <- identifyOverExpressedGenes(cellchat,
                                       thresh.pc = 0.05,   # 一个基因在某细胞群中,至少有 5% 的细胞表达
                                       thresh.fc = 0.0,    # 不要求fold-change(差异倍数),只要满足其它条件就保留
                                       thresh.p  = 0.05
)

# 识别过表达配体-受体对
cellchat <- identifyOverExpressedInteractions(cellchat)

##相互作用推断
# 计算通信概率推断细胞互作的通信网络,每个LR的“通信概率/强度”
cellchat <- computeCommunProb(cellchat, raw.use = T) # 用原始表达(counts)或更接近原始的层

# 如果特定细胞群中只有少数细胞,则过滤掉细胞间的通信,celltype少于3个细胞则会被过滤
cellchat <- filterCommunication(cellchat, min.cells = 3)

# 提取推断出的细胞互作的通信网络数据框,我们提供了一个subsetCommunication 函数,
# 可以方便地访问感兴趣的推断的细胞间通信。
# 返回一个数据框,包含所有推断的配体/受体级别的细胞-细胞通信。
# 设置slot.name = "netP"以访问信令路径级别的推断通信
df.net.1 <- subsetCommunication(cellchat, slot.name = "netP")# 提取通路层面的通信
df.net.2 <- subsetCommunication(cellchat )

## 提取
levels(cellchat@idents)

##2、在信号通路水平上推断细胞间的通讯
cellchat <- computeCommunProbPathway(cellchat)
# 汇总通信概率来计算细胞间的聚合通信网络。
cellchat <- aggregateNet(cellchat)

##3、计算聚合细胞互作通信网络
groupSize <- as.numeric(table(cellchat@idents))
par(mfrow = c(1,2), xpd=TRUE) # xpd允许绘图超出绘图区边界

netVisual_circle(cellchat@net$count, 
                 vertex.weight = groupSize, # 节点大小 ∝ 细胞数
                 weight.scale = T,          # 把边权重做缩放映射到边宽
                 label.edge= F,             # 不在边上写数值
                 title.name = "Number of interactions")



netVisual_circle(cellchat@net$weight, 
                 vertex.weight = groupSize, 
                 weight.scale = T, 
                 label.edge= F, 
                 title.name = "Interaction weights/strength")


img

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-14 12:10
    关注

    中午好🌞🌞🌞
    本答案参考通义千问

    在使用 CellChat 绘制细胞间通信网络时,如果出现 自环(self-loop)的角度颠倒问题,这通常是因为 netVisual_circle 函数的参数设置不当或绘图逻辑导致的。特别是在 版本 2.2 中,某些绘图函数可能没有正确处理自环的绘制方向。

    下面我将详细解释问题并提供解决方案:


    🔧 问题分析

    • 自环角度颠倒:指的是在图中,某些节点与自身之间的连接(即自环)显示为反向或错误的方向。
    • 这种现象通常发生在 netVisual_circle 函数中,它用于绘制圆形的细胞通讯网络图。
    • CellChat 2.2ggplot2 4.0.2 的组合下,由于 ggplot2 的更新,某些绘图行为可能发生变化,从而影响了 netVisual_circle 的输出。

    解决方案

    1. 修改 netVisual_circle 的参数

    你可以在调用 netVisual_circle 时,通过调整参数来控制自环的绘制方式。

    修改后的代码如下:

    # 修改前:
    netVisual_circle(cellchat@net$count, 
                     vertex.weight = groupSize, # 节点大小 ∝ 细胞数
                     weight.scale = T,          # 把边权重做缩放映射到边宽
                     label.edge= F,             # 不在边上写数值
                     title.name = "Number of interactions")
    
    # 修改后:
    netVisual_circle(cellchat@net$count, 
                     vertex.weight = groupSize, 
                     weight.scale = T, 
                     label.edge = F, 
                     title.name = "Number of interactions",
                     self.loop = TRUE,  # 强制绘制自环
                     loop.angle = 0.5   # 设置自环角度,0.5 表示中间位置
    )
    

    重点说明:

    • self.loop = TRUE:确保自环被绘制出来。
    • loop.angle = 0.5:控制自环的位置,0.5 表示居中,可以尝试其他值如 0.30.7 来调整方向。

    2. 升级 CellChat 版本

    如果你发现该问题在 CellChat 2.2 中依然存在,建议考虑 升级到更高版本(例如 CellChat 2.4 或更高),因为新版本通常修复了旧版本中的绘图问题。

    升级命令:

    if (!requireNamespace("BiocManager", quietly = TRUE))
        install.packages("BiocManager")
    
    BiocManager::install("CellChat")
    

    重点说明:

    • 升级 CellChat 可能解决自环角度颠倒的问题,因为新版本对 netVisual_circle 的实现进行了优化。

    3. 手动调整自环方向(进阶)

    如果你希望更精细地控制自环的方向和角度,可以使用 igraph 包进行进一步调整。

    示例代码:

    library(igraph)
    
    # 将 CellChat 的网络转换为 igraph 对象
    g <- as.igraph(cellchat@net$count)
    
    # 手动调整自环方向
    g <- set.vertex.attribute(g, name = "label", value = levels(cellchat@idents))
    
    # 绘制图形
    plot(g, layout = layout.circle, edge.label.cex = 0.8, vertex.size = groupSize * 2)
    

    重点说明:

    • 使用 igraph 可以更灵活地控制图的布局和自环方向。
    • 如果你对 R 的图形绘制有一定经验,这种方式是最推荐的。

    4. 检查数据是否包含重复的自环

    有时,数据中可能存在多个相同的自环记录,导致绘图异常。

    检查代码:

    # 查看自环数量
    sum(cellchat@net$count[which(cellchat@net$count$from == cellchat@net$count$to), "weight"])
    

    重点说明:

    • 如果自环数量过多或不一致,建议先清理数据再进行绘图。

    📌 总结

    以下是解决 自环角度颠倒 的步骤:

    1. netVisual_circle 中添加 self.loop = TRUEloop.angle 参数,控制自环方向。
    2. 升级 CellChat 到更高版本(如 2.4 或以上),以获得更好的兼容性和稳定性。
    3. 使用 igraph 包手动调整图的布局,以获得更精确的绘图控制。
    4. 检查数据中是否存在重复或异常的自环,避免绘图出错。

    如果你需要进一步帮助或有其他问题,请随时告诉我!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月14日