ggplot2 中具有两个分类变量的散点图

Scatter plot with two categorical variables in ggplot2

我正在尝试使用下面提供的数据绘制散点图。我将在 x 轴上设置两列的值,即“Locus_ID”和“Start”,它们对应于每个基因座编号的位置。在 y 轴上,我将表示“sp_score”的值。我还没有想出一种方法来将“Locus_ID”的值与“Start”组合起来来表示我想要的图形。例如,我只能在 x 轴上使用一个变量,“Locus_ID”或“Start”,但不能同时使用两者。是否可以将这两个分类变量合并为一个因素?

> dput(head(file))
structure(list(Locus_ID = c("locus3", "locus3", "locus3", "locus3", 
"locus7", "locus7"), Start = c(41L, 41L, 41L, 41L, 161L, 161L
), sp_score = c(0, 3.4, 5, 4.2, 2.1, 1.5), Selection = c("Negative", 
"Negative", "Negative", "Positive", "Positive", "Weak")), row.names = c(NA, 
6L), class = "data.frame")

可以附上一张代表性的图表。例如,每个季节都会匹配一个特定的轨迹“Locus_ID”,整个 x 轴的长度将由“Start”

的值表示

这是我完成任务的尝试

ggplot(data) +
  geom_point(aes(Start, sp_score, color = Selection)) +
  theme_minimal() + 
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_text(size = 8, face = "bold"),
        legend.position = "right", panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(),
        legend.title = element_text(size = 10)) + 
  scale_color_igv() +
  scale_x_continuous(breaks = scales::breaks_width(5000))

如果可以完成我希望的任务,我将感谢您的支持。

一个选项是将 Start 映射到 x,根据 Start 的唯一值选择中断并使用 Locus_ID 作为标签:

library(dplyr)
library(ggplot2)

# Dataframe of unique breaks and labels
breaks <- data %>% 
  distinct(Start, Locus_ID)

ggplot(data) +
  geom_point(aes(Start, sp_score, color = Selection)) +
  theme_minimal() + 
  scale_x_continuous(breaks = breaks$Start, labels = breaks$Locus_ID, expand = c(.3, .3))

我不知道你的开始是否意味着分类,如果你想要一个连续的 x 轴,基本上它反映了 LocusID 是靠得很近还是相距很远,你基本上可以用 Start 作为 x,去掉 x 刻度然后用注释替换它们:

ggplot(data,aes(x = Start,y=sp_score)) + geom_point() +
stat_summary(aes(label=Locus_ID,x = Start,y=0),geom="text",fun=mean,vjust=2.5) + 
coord_cartesian(xlim=c(0,200),clip="off") + 
theme(axis.text.x=element_blank(),axis.title.x = element_text(vjust=-1))

更新,澄清后见评论:

感谢您的澄清: 这是另一种没有 facet

的方法
df1 <- df %>% 
    mutate(Locus_ID_1 = parse_number(Locus_ID)) %>% 
    pivot_longer(
        cols = c(Locus_ID_1, Start),
        names_to = "name",
        values_to = "values"
    )

ggplot(df1, aes(x = Locus_ID, y=sp_score, color=Selection)) +
    geom_point(size=2) +
    xlab("Start") +
    theme_classic()

第一个回答 这是一个建议。我不确定!

library(tidyverse)

df1 <- df %>% 
    mutate(Locus_ID_1 = parse_number(Locus_ID)) %>% 
    pivot_longer(
        cols = c(Locus_ID_1, Start),
        names_to = "name",
        values_to = "values"
    )

ggplot(df1, aes(x = values, y=sp_score, color=Selection)) +
    geom_point(size=2) +
    facet_wrap(~Locus_ID,  strip.position = "bottom") +
    xlab("Start") +
    theme_classic()