使用scRepertoire包进行单细胞免疫组库数据分析

简介

scRepertoire包是由华盛顿大学的Nick Borcherding博士开发,是一款针对10X V(D)J数据的免疫组库分析工具。它可以直接读取10X cellranger的输出结果,处理该数据并根据两个配对TCR或Ig链分配克隆型,分析colonotype的动态特征,提供了丰富的可视化展示工具。同时,还可以与Seurat、SingleCellExperiment 或 Monocle 3 包的单细胞mRNA 表达数据进行整合分析。

安装并加载所需的R包

BiocManager::install("scRepertoire")
# Most up-to-date version
devtools::install_github("ncborcherding/scRepertoire@dev")

# 加载所需的R包
suppressMessages(library(scRepertoire))
suppressMessages(library(Seurat))

# 查看R包的版本,最新的为‘1.3.1’
packageVersion("scRepertoire")
#[1] ‘1.3.1’

1. 加载并预处理VDJ重叠群数据

我们可以使用scRepertoire包直接读取10x cellranger vdj程序生成的filtered_contig_annotations.csv文件,为每个样本加载该文件并构建一个重叠群(contig)的列表。

# 读取不同的样本contig文件
S1 <- read.csv(".../Sample1/outs/filtered_contig_annotations.csv")
S2 <- read.csv(".../Sample2/outs/filtered_contig_annotations.csv")
S3 <- read.csv(".../Sample3/outs/filtered_contig_annotations.csv")
S4 <- read.csv(".../Sample4/outs/filtered_contig_annotations.csv")
# 构建重叠群列表
contig_list <- list(S1, S2, S3, S4)

这里我们使用scRepertoire包自带的一个数据集进行演示,该数据集来源于三名肾透明细胞癌患者的T细胞,样本由成对的外周血和肿瘤浸润细胞组成。

# 加载内置数据集
data("contig_list") #the data built into scRepertoire

# 查看数据集中contig的注释信息
head(contig_list[[1]])
##            barcode is_cell                   contig_id high_confidence length
## 1 AAACCTGAGAGCTGGT    TRUE AAACCTGAGAGCTGGT-1_contig_1            TRUE    705
## 2 AAACCTGAGAGCTGGT    TRUE AAACCTGAGAGCTGGT-1_contig_2            TRUE    502
## 3 AAACCTGAGCATCATC    TRUE AAACCTGAGCATCATC-1_contig_1            TRUE    693
## 4 AAACCTGAGCATCATC    TRUE AAACCTGAGCATCATC-1_contig_2            TRUE    567
## 5 AAACCTGAGCATCATC    TRUE AAACCTGAGCATCATC-1_contig_5            TRUE    361
## 6 AAACCTGAGTGGTCCC    TRUE AAACCTGAGTGGTCCC-1_contig_1            TRUE    593
##   chain   v_gene d_gene  j_gene c_gene full_length productive             cdr3
## 1   TRB TRBV20-1  TRBD1 TRBJ1-5  TRBC1        TRUE       TRUE CSASMGPVVSNQPQHF
## 2   TRB     None   None TRBJ1-5  TRBC1       FALSE       None             None
## 3   TRB  TRBV5-1  TRBD2 TRBJ2-2  TRBC2        TRUE       TRUE  CASSWSGAGDGELFF
## 4   TRA TRAV12-1   None  TRAJ37   TRAC        TRUE       TRUE CVVNDEGSSNTGKLIF
## 5   TRB     None   None TRBJ1-5  TRBC1       FALSE       None             None
## 6   TRB  TRBV7-9  TRBD1 TRBJ2-5  TRBC2        TRUE       TRUE CASSPSEGGRQETQYF
##                                            cdr3_nt reads umis raw_clonotype_id
## 1 TGCAGTGCTAGCATGGGACCGGTAGTGAGCAATCAGCCCCAGCATTTT 16718    6      clonotype96
## 2                                             None  6706    3      clonotype96
## 3    TGCGCCAGCAGCTGGTCAGGAGCGGGAGACGGGGAGCTGTTTTTT 26719   11      clonotype97
## 4 TGTGTGGTGAACGATGAAGGCTCTAGCAACACAGGCAAACTAATCTTT 18297    6      clonotype97
## 5                                             None   882    4      clonotype97
## 6 TGTGCCAGCAGCCCCTCCGAAGGGGGGAGACAAGAGACCCAGTACTTC 11218    6      clonotype98
##          raw_consensus_id
## 1 clonotype96_consensus_1
## 2                    None
## 3 clonotype97_consensus_2
## 4 clonotype97_consensus_1
## 5                    None
## 6 clonotype98_consensus_1

注意:有些VDJ数据处理程序会在生成的细胞barcode前添加样本的注释信息,如“Sample1_AAACCTGAGAGCTGGT”,此时我们可以使用stripBarcode()函数去除barcode前的注释信息,在使用该函数时有以下参数:

  • column:指示barcode所在的列
  • connector:指示barcode与前缀注释信息之间的连接符
  • num_connects:指示barcode前缀连接的级别,其中X_X_AAACGGGAGATGGCGT-1 == 3, X_AAACGGGAGATGGCGT-1 = 2。
# 去除barcode前缀注释信息
for (i in seq_along(contig_list)) {
  contig_list[[i]] <- stripBarcode(contig_list[[i]], 
                                   column = 1, connector = "_", num_connects = 3)
}

2. 合并VDJ重叠群,构建TCR克隆型

由于CellRanger默认是输出对TCRA和TCRB链的量化,没有将细胞的barcode与clonotype直接对应起来,因此我们需要使用combineTCR()函数将它们合并到一起,同时我们还可以添加样本和ID信息以防止细胞条形码重复。

combined <- combineTCR(contig_list, 
                       samples = c("PY", "PY", "PX", "PX", "PZ","PZ"), 
                       ID = c("P", "T", "P", "T", "P", "T"), 
                       cells ="T-AB")

combineTCR()函数的输出结果是一个合并重叠群的数据列表,它将每个细胞配对的两条链放在一行,同时还将核苷酸序列 (CTnt)、氨基酸序列 (CTaa)、VDJC 基因序列 (CTgene) 或核苷酸和基因序列的组合 (CTstrict) 合并到一起组成克隆型clonotype进行调用。类似的,对于B细胞,我们可以使用combineBCR()函数进行clonotyep重叠群的合并。

这里,有两个需要注意的地方:

  1. 每个细胞barcode最多只能有2个序列,如果存在更多的序列,则选择具有最高读数的2个。
  2. TCR克隆型的严格定义 (CTstrict) 是基于V基因和核苷酸序列>85%的归一化Levenshtein距离。

3. 其他预处理功能

3.1 添加附加变量信息

除了添加sample和ID信息外,我们还可以使用addVariable()函数来添加其他的变量信息。我们只需要设置添加的变量的名称和特定的字符或数字值(变量)。例如,这里我们添加处理和排序样本的批次。

example <- addVariable(combined, name = "batch", 
                       variables = c("b1", "b1", "b2", "b2", "b2", "b2"))

example[[1]][1:5,ncol(example[[1]])] # This is showing the first 5 values of the new column added
## [1] "b1" "b1" "b1" "b1" "b1"

3.2 提取重叠群的子集

同样的,我们还可以使用subsetContig()函数在combineTCR()之后删除特定的列表元素。为了提取相应的重叠群子集信息,我们需要确定要用于子集化的向量(name)以及子集的变量值(variables)。下面我们将从PX和PY样本中分离出4个测序结果。

subset <- subsetContig(combined, name = "sample", variables = c("PX", "PY"))

4. 可视化重叠群

cloneCall参数:

  • "gene":使用包含TCR/Ig的VDJC基因
  • "nt":使用CDR3区域的核苷酸序列
  • "aa":使用CDR3区域的氨基酸序列、
  • "gene+nt":使用包含TCR/Ig的VDJC基因+CDR3区域的核苷酸序列

需要注意的是,TCR克隆型的定义基本上是使用两个基因座的基因或nt/aa序列以及CDR3序列的组合来命名的。在scRepertoire中,克隆型的调用没有考虑CDR3序列中的微小变异。因此,"gene"方法将是最敏感的,而使用"nt"或"aa"方法是中度敏感,"gene+nt"方法对克隆型最具特异性。

探索克隆型的第一个函数是quantContig(),它将返回独特克隆型的总数或相对数量。

scale参数:

  • TRUE - 独特克隆型的相对百分比按克隆型库的总大小缩放
  • FALSE - 报告独特克隆型的总数
quantContig(combined, cloneCall="gene+nt", scale = TRUE)
image.png
#设置exportTable = T,则输出表格而非图形
quantContig_output <- quantContig(combined, cloneCall="gene+nt", 
                                  scale = TRUE, exportTable = TRUE)
quantContig_output
##   contigs values total   scaled
## 1    2690   PY_P  3208 83.85287
## 2    1495   PY_T  3119 47.93203
## 3     823   PX_P  1068 77.05993
## 4     918   PX_T  1678 54.70799
## 5    1143   PZ_P  1434 79.70711
## 6     749   PZ_T  2768 27.05925
#设置group = "ID",进行分组可视化
quantContig(combined, cloneCall="gene", group = "ID", scale = TRUE)
image.png

我们还可以使用abundanceContig()函数通过丰度来查看克隆型的相对分布。它将生成一个折线图,展示不同样本中克隆型的总数量。

abundanceContig(combined, cloneCall = "gene", scale = FALSE)
image.png

与上面一样,我们也可以使用函数中的group变量根据contig对象中的向量对其进行分组。

abundanceContig(combined, cloneCall = "gene", group = "ID", scale = FALSE)
image.png

设置exportTable = T,输出相应的表格

abundanceContig(combined, cloneCall = "gene", exportTable = T)
## # A tibble: 7,230 x 3
##    CTgene                          Abundance values
##    <chr>                               <int> <chr> 
##  1 NA_TRBV10-1.TRBJ2-2.TRBD1.TRBC2         1 PY_P  
##  2 NA_TRBV10-2.TRBJ1-1.TRBD1.TRBC1         1 PY_P  
##  3 NA_TRBV10-2.TRBJ2-1.TRBD2.TRBC2         1 PY_P  
##  4 NA_TRBV10-2.TRBJ2-3.TRBD2.TRBC2         1 PY_P  
##  5 NA_TRBV10-3.TRBJ1-1.None.TRBC1          2 PY_P  
##  6 NA_TRBV10-3.TRBJ1-1.TRBD1.TRBC1         2 PY_P  
##  7 NA_TRBV10-3.TRBJ1-5.None.TRBC1          1 PY_P  
##  8 NA_TRBV10-3.TRBJ1-5.TRBD2.TRBC1         1 PY_P  
##  9 NA_TRBV10-3.TRBJ2-1.TRBD1.TRBC2         2 PY_P  
## 10 NA_TRBV10-3.TRBJ2-2.TRBD2.TRBC2         1 PY_P  
## # … with 7,220 more rows

我们可以通过调用lengtheContig()函数来查看CDR3序列的长度分布。重要的是,与其他基本可视化不同,这里cloneCall只能选择“nt”或“aa”。

chain参数:

  • “both” 选择组合链进行可视化
  • “TRA”、“TRB”、“TRD”、“TRG”、“IGH”或“IGL” 选择特定单链进行可视化
lengthContig(combined, cloneCall="aa", chains = "combined") 
image.png
lengthContig(combined, cloneCall="nt", chains = "TRA") 
image.png

我们还可以使用compareClonotypes()函数查看样本之间的克隆型和动态变化。
可以设置以下参数:
samples

  • 设置特定样本的名称

graph

  • “alluvial” - 绘制冲击,如下图所
  • “area” - 绘制相应克隆型的面积图

number

  • 设置要绘的最高克隆型数,这将根据单个样本的频率计算,也可以留空。

clonotypes

  • 设置可用于分离特定的克隆型序列,确保调用与您想要可视化的序列相匹配。
compareClonotypes(combined, numbers = 10, 
                  samples = c("PX_P", "PX_T"), 
                  cloneCall="aa", graph = "alluvial")
image.png

我们还可以使用vizVgenes()函数可视化TCR或BCR基因的相对使用情况。
可以设置以下参数:
gene

  • “V”
  • “D”
  • “J”
  • “C”

chain

  • “TRB”
  • “TRA”
  • “TRG”
  • “TRD” + “IGH”
  • “IGL”

plot

  • “bar” for a bar chart
  • “heatmap” for a heatmap

separate
Variable to separate the counts along the y-axis

scale

  • TRUE to scale the graph by number of genes per sample
  • FALSE to report raw numbers
vizVgenes(combined, TCR="TCR1", facet.x = "sample", facet.y = "ID")
image.png

5. 更多高级克隆型分析

5.1 Clonal Space Homeostasis克隆空间稳态

我们可以使用clonalHomeostasis()函数查看不同克隆型在整个克隆空间内的相对丰度,该分析将克隆型分为rare, small, medium, large和hyperexpanded 5大类,并统计各个类别的占比。
cloneTypes:

  • Rare = .0001
  • Small = .001
  • Medium = .01
  • Large = .1
  • Hyperexpanded = 1
clonalHomeostasis(combined, cloneCall = "gene")
image.png
clonalHomeostasis(combined, cloneCall = "aa")
image.png

5.2 Clonal Proportion克隆型比例

类似的,我们还可以使用clonalProportion()函数查看克隆型的比例,按克隆型的出现频率将其进行排名,1:10表示每个样本中的前10个克隆型。
split:

  • 10
  • 100
  • 1000
  • 10000 * 30000 * 100000
clonalProportion(combined, cloneCall = "gene") 
image.png
clonalProportion(combined, cloneCall = "nt") 
image.png

5.3 Overlap Analysis重叠分析

我们可以使用clonalOverlap()函数分析样本之间的相似性,目前有三种方法可用于clonalOverlap()
1)overlap coefficient,2)Morisita index和3)Jaccard index。

clonalOverlap(combined, cloneCall = "gene+nt", method = "morisita")
image.png

我们还可以使用 clonesizeDistribution()函数通过克隆大小分布对样本进行聚类,该函数改编自powerTCR包。

clonesizeDistribution(combined, cloneCall = "gene+nt", 
                      method="ward.D2")
image.png

5.4 Diversity Analysis多样性分析

多样性也可以通过样本或其他变量来衡量。多样性可以通过以下四个指标来进行计算:
1)Shannon, 2) inverse Simpson, 3) Chao1和4)based Coverage Estimator (ACE)。

前两者通常用于估计基线多样性,而Chao/ACE指数用于估计样本的丰富度。此函数的新实现包括使用最少数量的独特克隆型对 100 个引导带 (n.boots) 进行下采样,作为更稳健的多样性估计。

clonalDiversity(combined, cloneCall = "gene", group = "samples", 
                n.boots = 100)
image.png
clonalDiversity(combined, cloneCall = "gene", group = "ID")
image.png

5.5 Scatter Compare散点图比较(仅限开发版)

我们可以使用scatterClonotype()函数计算两个样本的相对克隆型,并生成比较两个样本的散点图。
可以设置以下参数:
x.axis and y.axis:

  • 设置 x 轴和 y 轴上的列表元素的名称,例如“PX_P”和“PX_T”。

dot.size:

  • “total” 显示 x 轴和 y 轴之间的克隆总数
  • Name of the list element to use for size calculation

graph:

  • “proportion” 表示克隆型在所有克隆型中代表的相对比例
  • “count” 表示按样本的克隆型总数
scatterClonotype(combined, cloneCall ="gene", 
                 x.axis = "PY_P", 
                 y.axis = "PY_T",
                 dot.size = "total",
                 graph = "proportion")
image.png

5.6 Clustering Clonotypes克隆型聚类

通过检查序列的编辑距离,我们可以使用clusterTCR()函数对链的核苷酸或氨基酸序列进行克隆型的聚类分析。

sub_combined <- clusterTCR(combined[[2]], chain = "TCRA", 
                           sequence = "aa", 
                           threshold = 0.85, group = NULL)

sub_combined <- as.data.frame(sub_combined)

counts_TCRAcluster <- table(sub_combined$TCRA_cluster)
counts_TCRA<- table(sub_combined$cdr3_aa1)

#Change in histogram range using clusters over exact amino acid sequence
plot(rev(sort(counts_TCRAcluster)), xaxt='n')
image.png
plot(rev(sort(counts_TCRA)), xaxt='n')
image.png

6. 与Seurat包进行整合分析

除了对单细胞免疫组库数据进行常规分析外,我们还可以使用scRepertoire包将其与scRNA-seq数据进行整合分析。通过细胞barcode信息将VDJ数据和scRNA-seq的基因表达数据联系起来,就可以将clonotype显示在降维图上,也可以基于细胞聚类后的cluster展示clonotype的分布情况。
这里,我们利用官网提供的示例scRNA-seq数据演示,它是一个降维聚类后的seurat对象。

# 加载示例scRNA-seq数据
seurat <- get(load("/Users/data/seurat2.rda"))
# 查看细胞降维聚类信息
DimPlot(seurat, label = T) + NoLegend()
image.png
table(Idents(seurat))
##   C1   C2   C3   C4   C5   C6   C7   C8   C9  C10  C11  C12 
## 2293 2138 1746 1419 1167 1128  807  792  495  357  328  241

接下来,我们可以使用combineExpression()函数获取克隆型信息,并将其附加到我们的Seurat对象中。需要注意的是,该函数要求匹配的colontype的细胞barcode要与Seurat对象中的细胞行名相一致。如果匹配不一致,可能会导致结合失败。

seurat <- combineExpression(combined, seurat, 
                            cloneCall="gene", 
                            groupBy = "sample", 
                            proportion = FALSE, 
                            cloneTypes=c(Single=1, Small=5, Medium=20, Large=100, Hyperexpanded=500))

查看外周血和肿瘤浸润T细胞的分布情况。

colorblind_vector <- colorRampPalette(c("#FF4B20", "#FFB433", 
                                        "#C6FDEC", "#7AC5FF", "#0348A6"))
DimPlot(seurat, group.by = "Type") + NoLegend() +
  scale_color_manual(values=colorblind_vector(2))
image.png

根据clonotype的类型查看其分布情况。

slot(seurat, "meta.data")$cloneType <- factor(slot(seurat, "meta.data")$cloneType, 
                                              levels = c("Hyperexpanded (100 < X <= 500)", 
                                                         "Large (20 < X <= 100)", 
                                                         "Medium (5 < X <= 20)", 
                                                         "Small (1 < X <= 5)", 
                                                         "Single (0 < X <= 1)", NA))
DimPlot(seurat, group.by = "cloneType") +
  scale_color_manual(values = colorblind_vector(5), na.value="grey")
image.png

6.1 clonalOverlay

我们可以使用clonalOverlay()函数基于降维后的坐标生成克隆扩展细胞位置的叠加情况。

# 分面展示不同样本的情况
clonalOverlay(seurat, reduction = "umap", 
              freq.cutpoint = 30, bins = 10, 
              facet = "Patient") + 
  guides(color = FALSE)
image.png

我们还可以使用highlightClonotypes()函数高亮展示特定序列的克隆型分布。

seurat <- highlightClonotypes(seurat, cloneCall= "aa", sequence = c("CAVNGGSQGNLIF_CSAEREDTDTQYF", "NA_CATSATLRVVAEKLFF"))
DimPlot(seurat, group.by = "highlight")
image.png

6.2 occupiedscRepertoire

我们可以使用occupiedscRepertoire()函数并通过指定x.axis来展示seurat对象元数据中的cluster或其他变量,从而查看分配到特定频率范围的cluster的细胞数。

occupiedscRepertoire(seurat, x.axis = "cluster")
image.png

6.3 alluvialClonotypes

我们可以使用alluvialClonotypes()函数来查看展示跨多个类别的clonotypes。

alluvialClonotypes(seurat, cloneCall = "gene", 
                   y.axes = c("Patient", "cluster", "Type"), 
                   color = "TRAV12-2.TRAJ42.TRAC_TRBV20-1.TRBJ2-3.TRBD2.TRBC2") + 
  scale_fill_manual(values = c("grey", colorblind_vector(1)))
image.png

绘制桑基图展示clonotype在不同patient-cluster-type之间的关系。

alluvialClonotypes(seurat, cloneCall = "gene", 
                   y.axes = c("Patient", "cluster", "Type"), 
                   color = "cluster") 
image.png

6.4 getCirclize

像桑基图一样,我们也可以使circlize包中的和弦图来可视化cluster之间的互连信息。

library(circlize)
library(scales)

circles <- getCirclize(seurat, groupBy = "cluster")

#Just assigning the normal colors to each cluster
grid.cols <- scales::hue_pal()(length(unique(seurat@active.ident)))
names(grid.cols) <- levels(seurat@active.ident)

#Graphing the chord diagram
circlize::chordDiagram(circles, self.link = 1, grid.col = grid.cols)
image.png

如果我们只想通过对单细胞对象进行子集化来探索肿瘤特异性T细胞,也可以使用此方法。

# 提取子集
subset <- subset(seurat, Type == "T")

circles <- getCirclize(subset, groupBy = "cluster")

grid.cols <- hue_pal()(length(unique(subset@active.ident)))
names(grid.cols) <- levels(subset@active.ident)

chordDiagram(circles, self.link = 1, grid.col = grid.cols)
image.png

6.5 StartracDiversity

StartracDiversity(seurat, type = "Type", 
                  sample = "Patient", by = "overall")
## [2021-07-08 15:49:51] initialize Startrac ...
## [2021-07-08 15:49:51] calculate startrac index ...
## [2021-07-08 15:49:51] calculate pairwise index ...
## [2021-07-08 15:49:52] calculate indices of each patient ...
## [2021-07-08 15:49:53] collect result
## [2021-07-08 15:49:53] return
image.png

7. 可视化细胞聚类后的clonotype

对于希望在Seurat对象中使用元数据来执行scRepertoire提供的分析的用户来说,我们还可以使用expression2List()函数将获取元数据并按cluster将数据输出为列表。

combined2 <- expression2List(seurat, group = "cluster")
length(combined2) #now listed by cluster
## [1] 12

7.1 Clonal Diversity

clonalDiversity(combined2, cloneCall = "nt")
image.png

7.2 Clonal Homeostasis

clonalHomeostasis(combined2, cloneCall = "nt")
image.png

7.3 Clonal Proportion

clonalProportion(combined2, cloneCall = "nt")
image.png

7.4 Clonal Overlap

clonalOverlap(combined2, cloneCall="aa", method="overlap")
image.png

参考来源:https://ncborcherding.github.io/vignettes/vignette.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容