【问题标题】:ggplot multiple abline with color legend带有颜色图例的 ggplot 多个 abline
【发布时间】:2021-03-23 16:54:29
【问题描述】:

所以我有一个散点图数据集,我正在尝试使用 abline 在许多不同的线性线之上进行设置。问题是我希望每条线都以不同的方式着色,并以给定的类出现在图例中。

我有以下散点图,其中的点按组着色:

data = data.frame(x=c(-0.1,0,0.2,1.3,-1.2,-0.5),
                 y=c(-0.8,0,-0.2,1.3,-0.4,0.2),
                 group=c(1,0,0,0,1,1))
g=ggplot(data, aes(x=x,y=y,color=group))+geom_point()+
   geom_hline(yintercept = 0)+geom_vline(xintercept = 0)+
   ggtitle("Scatterplot of Original Points")

现在我想使用我创建的函数在顶部显示不同的线,该函数从我的新数据集中获取值并创建斜率和截距(跳过这个,因为它只在这里让你能够重现我的代码)。

decision = function(v1,v2,v3) {
  if(v3 == 0) {
    intercept = 0
    slope = -v2/v1
  }
  else {
    p1_intercept = -v3/v1
    p2_intercept = -v3/v2
    intercept = p2_intercept
    slope = (p2_intercept) / (-p1_intercept)
  }
  return( list( slope=slope, intercept = intercept))
}
init_gen = data.frame(ID=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"),v1=c(-1,-0.9,0.9,-0.1,1,-0.8,-0.1,0.6,-0.3,0.6), v2=c(-0.7,0.9,-0.3,0.8,0.5,0.1,0.8,0.8,-0.2,0.4),v3=c(0,0.3,-0.9,-0.4,-0.5,0.6,0.3,0.2,1,0.3))

for(i in 1:10) {
  line = decision(init_gen$v1[i],init_gen$v2[i],init_gen$v3[i])
  init_gen$slope[i] = line$slope
  init_gen$intercept[i] = line$intercept
}

然后我使用我之前的情节并添加这些斜率和截距:

g+geom_abline(data=init_gen, aes(slope=slope,intercept=intercept, linetype=ID))

现在的问题是我希望每条线都有不同的颜色,这在直觉上可能意味着添加 (color=ID):

g+geom_abline(data=init_gen, aes(slope=slope,intercept=intercept, linetype=ID,color=ID))

但我收到以下错误

我已经搜索并找到了其他资源,但没有任何与使用颜色的 abline() 相关的资源...

【问题讨论】:

  • 问题是您的点已经有一个连续的色标。如果您想添加第二个色标,请查看 ggnewscale 包。

标签: r ggplot2


【解决方案1】:

问题是您已经使用color 作为具有连续值的积分。这里的一个技巧是将fill 用于带有shape = 21 的点。

g=ggplot(data, aes(x=x,y=y)) + geom_point(aes(fill=group), shape = 21)+
   geom_hline(yintercept = 0)+geom_vline(xintercept = 0)+
   ggtitle("Scatterplot of Original Points")
g+geom_abline(data=init_gen, aes(slope=slope,intercept=intercept, linetype=ID,color=ID))

结果:

【讨论】:

    【解决方案2】:

    您可以像@stefan 所说的那样使用ggnewscale。这是一个很好的选择。或者,您可以制作调色板。

    我使用了库 viridis 中的调色板选项,但您可以使用其他选项。

    dPal = viridis::viridis_pal()(nrow(init_gen))  # palette size matching init_gen
    
    g + geom_abline(data=init_gen, 
                    aes(slope=slope,
                        intercept=intercept,
                        linetype=ID),
                        color = dPal) 
    

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2016-12-29
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多