ggplot2错误:提供了离散值到连续比例尺

17
我有一个名为“merged”的数据集,包含3个数值列“pauseMedian”、“numTotalPauses”和“diff”。我还有一个名为“splineHull”的数据集,它也包含数值列“pauseMedian”和“numTotalPauses”,以及一个6级因子“microstyle”。
以下是完美运行的代码。它绘制了一个散点图,并在其上叠加了用“microstyle”着色的splineHull多边形。
ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses)) 
       + geom_point()  
       + geom_polygon(data = splineHull, 
                      mapping=aes(x=pauseMedian, 
                                  y=numTotalPauses, 
                                  group=microstyle, 
                                  color = microstyle),
                       alpha=0)

然后,我还想通过添加一个属性color = diff来更改散点图上点的颜色。

脚本2:

ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses, color = diff)) 
       + geom_point()  
       + geom_polygon(data = splineHull, 
                      mapping=aes(x=pauseMedian, 
                                  y=numTotalPauses, 
                                  group=microstyle, 
                                  color = microstyle),
                       alpha=0)

我看到下面的错误:

错误:已提供离散值以连续比例尺

我不知道为什么会出现这个错误。如果我想要有颜色的散点图但没有多边形,我运行以下代码后又可以工作了。 脚本 3:
ggplot(data=merged,aes(x = pauseMedian, y = numTotalPauses, color = diff)) 
       + geom_point()  

那么,脚本2发生了什么问题?错误是从哪里来的?我该如何让它工作?


这似乎很奇怪 - 没有看到示例数据很难确定错误。另外,您尝试将 color=diff 移动到 geom_point(aes(color=diff)) 吗? - Señor O
@SeñorO 你好,是的,我试过了。它给出了相同的错误。在脚本2中,有两个颜色属性,一个在ggplot aes中,另一个在geom_polygon aes中。前者被分配了一个数值“diff”,后者被分配了一个因子值“microstyle”。我猜,也许ggplot不能同时处理数字颜色和因子颜色? - nan
现在我想想,那可能是正确的 - 因为它需要为颜色制作图例。尝试使用 fill = microstyle 来绘制多边形。 - Señor O
你不需要发布整个数据集。只需发布一个小样本,以便我们使用你的数据重现问题。例如,发布dput(merged[sample(1:nrow(merged),20),])的输出结果。这将给出你的数据中随机选择的20行(对于splineHull也是同样的操作)。 - eipi10
使用一些类似于您数据的虚假数据,我能够得到相同的错误信息。但是,当我颠倒geom_polygongeom_point的顺序时,我会得到“Error: Continuous value supplied to discrete scale”的错误。两个geoms之间似乎存在冲突,一个是离散的颜色比例尺,另一个是连续的颜色比例尺,但我不确定为什么会发生这种情况。我本以为有两个单独的geoms会导致两个单独的颜色比例尺。 - eipi10
@eipi10 我觉得你的虚假数据和我的很相似。我刚试着交换了geom_polygon和geom_point的顺序,也遇到了同样的错误。之前我也认为不同geoms的颜色比例尺不会互相干扰。你有解决方案或者其他实现这个效果的替代方法吗? - nan
3个回答

19

显然,您不能为两个不同的几何图形设置不同的颜色美学。作为解决方法,改用填充美学来代替点的颜色美学。这意味着您必须使用具有填充内部的点标记样式(请参见?pch并向下滚动以查看可用的点样式)。以下是一种方法:

ggplot() + 
  geom_point(data=merged,aes(x = pauseMedian, y = numTotalPauses, fill = diff),
             pch=21, size=5, colour=NA) +
  geom_polygon(data = splineHull, 
               mapping=aes(x=pauseMedian, 
                           y=numTotalPauses, 
                           colour = microstyle),
               alpha=0) 

aes()之外添加colour=NA,可以去掉点标记周围的默认黑色边框。如果你想要点周围有彩色边框,只需将colour=NA更改为你喜欢的任何颜色。

此外,参见ggplot2 Google组中讨论类似问题和一些解决方法的此主题


这很好(+1),但是根据下面Juan的答案,colour = "NA"必须有引号,否则点将无法绘制。 - EcologyTom

4
现在我们知道两个颜色变量是不同类型的,这就产生了问题。您可以尝试为其中一个使用不同的比例尺(例如填充而不是颜色)。
set.seed(123)
my_df1 <- data.frame(a=rnorm(100), b=runif(100), c=rep(1:10, 10))
my_df2 <- data.frame(a=rnorm(100), b=runif(100), c=factor(rep(LETTERS[1:5], 20)))
 
# this won't work. can't assign discrete and continuous to same scale
ggplot() +
  geom_point(data=my_df1, aes(x=a, y=b, color=c)) +
  geom_polygon(data=my_df2, aes(x=a, y=b, color=c), alpha=0.5)

错误:离散值提供给连续比例尺。
# but use fill for polygons, and that works:
ggplot() +
  geom_point(data=my_df1, aes(x=a, y=b, color=c)) +
  geom_polygon(data=my_df2, aes(x=a, y=b, fill=c), alpha=0.5)

绘图输出

如果您必须使用相同的比例尺(颜色),而且不能将变量转换为相同类型,请查看此链接获取更多信息:在ggplot中使用facet绘制连续和离散的系列


嗨,我有一个非常大的数据集,所以很难在这里发布数据。alpha应该大于0,但这不是问题,我只需要轮廓而不是填充多边形,因为由于错误,图形根本没有显示出来。我尝试了你的解决方案,但我得到了相同的错误。在geom_point中指定的颜色是数值变量“diff”,在geom_polygon中指定的颜色是离散的“factor”。我只是猜测如果颜色属性被分配了不同类型,ggplot就无法工作。 - nan
哦,那就是缺失的关键信息。看看新的解决方案。 - arvi1000
嗨,谢谢。是的,这样可以工作。实际上,我仍然更喜欢颜色,因为我只想要轮廓(空多边形)。无论如何,这个解决方案现在可行。谢谢! - nan

2

补充eipi10之前的答案(非常感谢!)。 为了去掉圆形图(pch=21)周围的边框,需要使用colour="NA"选项,并将其放在""之间。如果您使用colour=NA(不带引号),整个图形将消失而不被绘制。 我本来想在答案下评论,但我的声望还不够 :)


1
太高兴看到这个了!我花了很长时间想知道为什么它不能正常工作。虽然 colour = "NA" 会给出一个白色边框,但如果有重叠的点/几何图形,则边框仍然可见。 - EcologyTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接