我有一個漂亮的 geom_tile 圖,但我需要一種方法來突出顯示特定行或基于二進制值標記特定行。
這是寬格式的一小部分資料和結果輸出:
df <- structure(list(bin_level = c(0,1), sequence = c("L19088.1", "chr1_43580199_43586187"), X236 = c("G", "."), X237 = c("G", "."), X238 = c("A", "a"),
X239 = c("T", "C"), X240 = c("A", "c"), X241 = c("G", "G"
)), class = "data.frame", row.names = 1:2)
> df
bin_level sequence X236 X237 X238 X239 X240 X241
1 0 L19088.1 G G A T A G
2 1 chr1_43580199_43586187 . . a C c G
實際資料集要大得多,有 3096 個變數的 1045 個觀測值。
我的目標是將這個龐大的資料集繪制為每個不同核苷酸的顏色的熱圖,并能夠區分 bin_levels 為 0 和 1 的行。
以下代碼繪制了一個很棒的圖,但不包括我需要查看的 bin_level 差異。如果 bin_level 為 1,我想突出顯示整行,但我無法找到有關如何執行此操作的任何內容。我已經將核苷酸用于 aes 填充變數,所以我需要別的東西。到目前為止,我想出的最佳選擇是為行標簽著色。我使用
uj5u.com熱心網友回復:
雖然在某些情況下傳遞顏色矢量element_text()是一種快速選擇,恕我直言,在更一般的情況下,它很容易出錯,并且需要密切關注您訂購資料的方式。相反,我建議看一下ggtext引入主題元素element_markdown并允許使用一些 HTML、CSS 和 markdown 設定文本樣式的包。
此外,除了@I_O 已經指出的問題之外,另一個問題是您將資料操作步驟與繪圖代碼一起放在一個管道中。因此,當您通過bin_level使用原始未經處理的、未經安排的資料集df來排列資料時,順便說一下,該資料集仍然是用于顏色分配的寬格式。這就是為什么我個人總是建議將資料整理和繪圖分開,除了非常簡單的情況。
最后,雖然您按照bin_level真正重要的順序排列資料,但sequence您必須sequence在安排后設定我使用的順序forecast::fct_inorder。
注意:為了使您的示例更真實,我復制了您的資料集以添加兩行。
library(tidyr)
library(dplyr)
library(ggplot2)
df_long <- df %>%
pivot_longer(-c("sequence", "bin_level"),
names_to = "position",
values_to = "nucleotide"
) %>%
arrange(bin_level) %>%
mutate(
sequence = if_else(bin_level == 1, paste0("<span style='color: red'>", sequence, "</span>"), sequence),
sequence = forcats::fct_inorder(sequence))
ggplot(df_long)
geom_tile(aes(x = position, y = sequence, fill = nucleotide),
height = 1
)
scale_fill_manual(values = c(
"a" = "#ea0064", "c" = "#008a3f", "g" = "#116eff",
"t" = "#cf00dc", "\U00B7" = "#000000", "X" = "#ffffff"
))
labs(x = "x-axis-title", y = "Sequence")
theme(
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = ggtext::element_markdown()
)

資料
df <- structure(list(
bin_level = c(0, 1), sequence = c("L19088.1", "chr1_43580199_43586187"), X236 = c("G", "."), X237 = c("G", "."), X238 = c("A", "a"),
X239 = c("T", "C"), X240 = c("A", "c"), X241 = c("G", "G")
), class = "data.frame", row.names = 1:2)
df1 <- structure(list(
bin_level = c(0, 1), sequence = c("L19088.2", "chr1_43580199_43586187.2"), X236 = c("G", "."), X237 = c("G", "."), X238 = c("A", "a"),
X239 = c("T", "C"), X240 = c("A", "c"), X241 = c("G", "G")
), class = "data.frame", row.names = 1:2)
df <- dplyr::bind_rows(df, df1)
uj5u.com熱心網友回復:
在將資料輸入 ggplot 之前按 bin 級別排列資料時,繪圖的垂直排列遵循 y 值(即:序列)。您可以創建 bin_level 和 sequence 的組合,通過以下方式排列和繪制資料:
df %>%
...
## reformat bin_level to a three-digit character, so that
## 002 properly precedes 011 (otherwise 11 would come before 2)
mutate(dummy = paste(sprintf('.0f', bin_level),
Sequence, sep = '_')) %>%
arrange(dummy) %>%
...
## ggplot instructions:
ggplot() ...
geom_tile(aes(y = dummy, ...))
## remove the bin_level prefix ('00x_') for labelling:
scale_y_discrete(labels = gsub('.*_', '', df$dummy))
...
theme(axis.text.y = element_text(
## note: df$bin_level NOT levels(df$bin_level)
colour = ifelse(df$bin_level == 1, "red", "black"))
)
請注意,將來可能無法使用 element_text 為標簽著色:
element_text()官方不支持矢量化輸入。結果可能出乎意料,或者在 ggplot2 的未來版本中可能會發生變化。(控制臺警告)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466720.html
上一篇:每個變數ggplotR的比例線型
