我已经阅读了很多关于可能导致错误“离散值提供给连续比例”的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
语句会引发错误。
修改
在下面的答案中,我尝试将data
和aes
放入最初的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
有关的错误,但那里的答案并没有解决我的问题,所以我非常感谢你的帮助。首先,哪一个变量导致问题?)
答案 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显示器,请随时纠正我。