首页 文章

Scatterplot与不同的彩色异常值和geom文本编号标签

提问于
浏览
1

我有一个包含多列的数据框 . 这是一个例子 .

my_df <- data.frame(x = 1:5, y = c(50, 22, 15, 33, 49))
colnames(my_df) <- c("ID", "values")
my_df

我试图制作一个散点图,其中有这个数据框的子集作为异常值,与非异常值有不同的颜色 . 除此之外,我还试图用相关数字标记这些异常值 . 以下是一个示例尝试:

ggplot(data=my_df, aes(x = seq(1, length(values)), y = my_df$values))+ geom_point(data = subset(my_df, values > 48), aes(color = "blue"))+ geom_point(data = subset(my_df, values < 24, aes(color = "red"))+ geom_text(data = subset(my_df, values > 48), aes(label = values))

geom_text代码行提供此错误 .

错误:美学必须是长度1或与数据(2)相同:颜色,x,y

其次,我尝试使用ifelse将不同颜色的值分开作为不同的尝试 - 但是,我不知道用数字标记不同颜色部分的方法,或者甚至用每个颜色部分的名称标注图例 . 这是一个例子,但即使添加了geom_text,或尝试添加图例,我打算制作的内容也无法解决 . 以下是用作基线的代码:

ggplot(data=my_df, aes(x = seq(1, length(values)), y = my_df$values))+
  geom_point(color = ifelse(my_df$values > 25, "red", "blue"))

如果有人可以提供帮助,我会非常感激,因为我已经在这方面奋斗了一个多星期了 .

编辑:下面提供的答案已回答我的问题 . 这是我生成的绘图的代码,包括每个变量的图例 Headers 和名称,作为后来查找的人的参考 .

ggplot(my_df, aes(ID, values, color = factor(cut(values, c(0,24,48,Inf))))) +
  geom_point(size=3) + 
  geom_text_repel(data = . %>% filter(values> 48), aes(label = values), show.legend = F)+
  geom_text_repel(data = . %>% filter(values< 24), aes(label = values), show.legend = F)+
  labs(title = "Beautiful Scatterplot", x = "ID", y = "Values", color = "Legend Title") +
  scale_color_manual(labels = c("Below 24", "Between 24 and 48", "Above 48"), values = c("blue", "red", "purple"))

Example Answer Scatterplot

2 回答

  • 0

    你可以试试

    library(tidyverse)
    library(ggrepel)
    my_df %>% 
      mutate(col=case_when(values > 48 ~ 4,
                           values < 24 ~ 2,
                           T ~ 1)) %>% 
      ggplot(aes(ID, values, color = factor(col))) +
       geom_point(size=3) + 
       geom_text_repel(data = . %>% filter(values> 48), aes(label = values)) + 
       scale_color_identity()
    

    enter image description here

    或仅使用 ggplot

    ggplot(my_df, aes(ID, values, color = factor(cut(values, c(0,24,48,Inf))))) +
       geom_point(size=3) + 
       geom_text_repel(data = . %>% filter(values> 48), aes(label = values), show.legend = F)
    
  • 0
    ggplot(data=my_df,aes(x=ID,y=values,label=ifelse(values>48,values,"")))+
      geom_point(size=4,color = ifelse(my_df$values > 48, "red", "blue"))+
      geom_text(vjust = 1.3,nudge_x = 0.15,aes(colour="red"),fontface = "bold",show.legend=F)
    

    enter image description here

相关问题