【问题标题】:ggplot2 error : Discrete value supplied to continuous scaleggplot2错误:提供给连续比例的离散值
【发布时间】:2014-11-14 05:31:48
【问题描述】:

我有一个名为“merged”的数据集,其中包含 3 个数字列“pauseMedian”、“numTotalPauses”和“diff”。我还有一个 splineHull 数据集,其中还包含数字列“pauseMedian”和“numTotalPauses”,以及一个 6 级因子“microstyle”

我有以下代码,效果很好。它绘制一个散点图,然后用根据“微样式”着色的 splineHull 多边形覆盖它。

脚本 1:

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ñorO 嗨,是的,我试过了。它给出了同样的错误。在脚本 2 中,有两个颜色属性,一个在 ggplot aes 中,另一个在 geom_polygon aes 中。前者被分配一个数值“diff”,后者被分配一个因子值“microstyle”。我猜,也许 ggplot 不能同时处理数字颜色和因子颜色?
  • 实际上,现在我想这可能是正确的——因为它需要为颜色制作一个图例。尝试对多边形使用fill = microstyle
  • 您不需要发布整个数据集。只需发布一个小样本,我们就可以使用您的数据重现问题。例如,dput(merged[sample(1:nrow(merged),20),]) 输出的帖子。这将提供 20 个随机选择的数据行(对 splineHull 执行相同操作)。
  • 使用一些(我希望)与您的数据相似的假数据,我能够得到相同的错误消息。但是,当我颠倒geom_polygongeom_point 的顺序时,我得到Error: Continuous value supplied to discrete scale。两个几何图形的色阶之间似乎存在冲突,一个是离散的,另一个是连续的,但我不确定为什么会这样。我原以为拥有两个单独的几何图形会产生两个单独的色标。

标签: r ggplot2


【解决方案1】:

既然我们知道这两个颜色变量属于不同类型,那么问题就来了。您可以尝试使用不同的比例(例如填充而不是颜色)

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)

如果您必须使用相同的比例(颜色),并且无法将变量转换为相同的类型,请参阅此了解更多信息:Plotting continuous and discrete series in ggplot with facet

【讨论】:

  • 嗨,我有一个非常大的数据集,所以很难在这里发布数据。 alpha 应该大于 0,但这不是问题,我只需要绘制未填充多边形的轮廓,因为该图由于错误而根本不显示。我尝试了你的解决方案,但我得到了同样的错误。对于 geom_point 中指定的颜色,它是一个数值变量“diff”,在 geom_polygon 中指定的是一个离散的“因子”。我只是猜测如果颜色属性被分配了不同的类型,ggplot 不起作用。
  • 哦,那是丢失信息的关键部分。查看新解决方案
  • 嗨,谢谢。是的,它是这样工作的。实际上我还是更喜欢颜色,因为我只想拥有轮廓(空多边形)。无论如何,这个解决方案现在有效。谢谢!
【解决方案2】:

显然,对于两种不同的几何图形,您不能有不同的颜色美学。作为一种解决方法,请改为对点使用填充美学。这意味着您必须使用具有填充内部的点标记样式(请参阅?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) 

添加colour=NA(在aes() 之外),消除了点标记周围的默认黑色边框。如果您想在点周围设置彩色边框,只需将 colour=NA 更改为您喜欢的任何颜色即可。

另请参阅ggplot2 Google 小组中的this thread,讨论类似问题和一些解决方法。

【讨论】:

  • 这很好 (+1),但根据 Juan 在下面的回答 colour = "NA" 必须有引号,否则将不会绘制点。
【解决方案3】:

只是在上面的首选 eipi10 答案中添加一些内容(谢谢!!)。 colour="NA" 选项为了摆脱圆形 (pch=21) 周围的边框,必须在 "" 之间。如果您使用 colour=NA (不带引号),整个形状就会消失并且不会被绘制。 我本来只是对答案发表评论,但我仍然没有声誉:)

【讨论】:

  • 很高兴看到这个!我花了很长时间想知道为什么我不能让它工作。虽然colour = "NA" 会给出一个白色的边框,所以如果有重叠的点/几何,边框仍然是可见的。
猜你喜欢
  • 2023-03-06
  • 2015-11-09
  • 2018-06-20
  • 2014-05-27
  • 1970-01-01
  • 2019-12-18
  • 2016-07-26
  • 2014-07-06
  • 2019-01-04
相关资源
最近更新 更多