ggplot - annotate() - “提供给连续比例的离散值”

时间:2017-05-19 07:35:14

标签: r ggplot2

我已经阅读了很多关于可能导致错误“离散值提供给连续比例”的SO答案,但我仍然无法解决以下问题。就我而言,错误是由使用annotate()引起的。如果摆脱+ annotate(...)一切正常。否则会引发错误。

我的代码如下:

base <- ggplot() + 
     annotate(geom = "rect", ymin = -Inf , ymax = 0, xmax = 0, xmin = Inf, alpha = .1)
annotated <- base + 
     geom_boxplot(outlier.shape=NA, data = technicalsHt, aes(x = name, y = px_last))
> base  # fine
> annotated
Error: Discrete value supplied to continuous scale

不幸的是,我不能给出导致这里使用的数据帧的代码(即technicalsHt),因为它很长并且依赖于APis。它的描述:

> str(technicalsHt)
'data.frame':   512 obs. of  3 variables:
 $ date   : Date, format: "2016-11-14" "2016-11-15" ...
 $ px_last: num  1.096 0.365 -0.067 0.796 0.281 ...
 $ name   : Factor w/ 4 levels "Stock Price Strength",..: 1 1 1 1 1 1 1 1 1 1 ...

> head(technicalsHt)
        date     px_last                 name
1 2016-11-14  1.09582090 Stock Price Strength
2 2016-11-15  0.36458685 Stock Price Strength
3 2016-11-16 -0.06696111 Stock Price Strength
4 2016-11-17  0.79613481 Stock Price Strength
5 2016-11-18  0.28067475 Stock Price Strength
6 2016-11-21  1.10780834 Stock Price Strength

没有annotate的代码完美无缺:

    base <- ggplot() 
    annotated <- annotated + 
      geom_boxplot(outlier.shape=NA, data = technicalsHt, aes(x = name, y = px_last))
    > annotated   # fine

我尝试使用technicalsHt,例如执行以下操作:

technicalsHt[,3] <- "hi"
technicalsHt[,2] <- rnorm(ncol(technicalsHt), 2,3)

但无论如何,使用annotate语句会引发错误。

修改 在下面的答案中,我尝试将dataaes放入最初的ggplot来电,并从一开始就拥有geom_boxplot

base <-                                  
# also tried: base <- ggplot(data = technicalsHt, aes(x = factor(name), y = px_last)) + geom_boxplot(outlier.shape=NA)
annotated <- base + ggplot(data = technicalsHt, aes(x = name, y = px_last)) + geom_boxplot(outlier.shape=NA)
  annotate(geom = "rect", ymin = -Inf , ymax = 0, xmax = 0, xmin = Inf, alpha = .1)

这种方法有效,但由于注释图层(坐标系的着色部分)覆盖了方框,因此效果不理想。

(虽然例如that link也提到与annotate有关的错误,但那里的答案并没有解决我的问题,所以我非常感谢你的帮助。首先,哪一个变量导致问题?)

3 个答案:

答案 0 :(得分:5)

切换订单,将数据和主要美学带入您的ggplot来电。你基本上写这个:

p1 <- ggplot() +
  annotate(geom = "rect", ymin = -Inf , ymax = 10, xmax = 0, xmin = Inf, alpha = .1)

此时,p1有一个连续的x轴,因为你在这里提供了数字。

p2 <- p1 + geom_boxplot(aes(factor(cyl), mpg), mtcars)

现在添加另一个具有离散轴的图层,这会产生错误。

如果你用'正确'的方式写它,一切都OK:

ggplot(mtcars, aes(factor(cyl), mpg)) + 
  geom_boxplot() +
  annotate(geom = "rect", ymin = -Inf , ymax = 10, xmax = 0, xmin = Inf, alpha = .1)

p.s。:正如您所看到的那样,制作可重现的最小示例并不难以准确显示您的问题。

答案 1 :(得分:5)

我遇到了这个问题,没有找到想要的答案,所以这是我的解决方案。这比绘制两倍于箱线图的图漂亮。

如果要在离散比例时在点下方注释一个矩形,则需要将其指定为ggplot

ggplot(mtcars, aes(factor(cyl), mpg)) + 
  scale_x_discrete() +
  annotate(geom = "rect", ymin = -Inf , ymax = 10, xmax = 0, xmin = Inf, alpha = .1) +
  geom_boxplot()

答案 2 :(得分:1)

为了响应分层,我发现的最简单的工作就是简单地绘制两次相同的盒子图。我知道这是不必要的代码,但它是一个非常快速的解决分层问题。

ggplot(mtcars, aes(factor(cyl), mpg)) + 
  geom_boxplot() +
  annotate(geom = "rect", ymin = -Inf , ymax = 10, xmax = 0, xmin = Inf, alpha = .1) + 
  geom_boxplot()

由于像素完全重叠,我无法注意到它的任何图像质量下降。如果有人有UHD显示器,请随时纠正我。