我该如何让我在ggplot2中缩放转换的点不被裁剪?

4

我正在制作一个点图表,想要对x轴进行对数变换。 我有一些在0处的点,ggplot很好地处理了这些点,不会将它们删除,但是会截断它们。

我该怎么办才能使0点不被截断? 似乎xlim()和比例变换不兼容,只会执行最后一个调用的函数。

以下是一个示例:

myData <- data.frame(x = c(rexp(5), 0), y = "category")
myBreaks <- c(.1, 1, 5)
ggplot(myData, aes(x = x, y = y)) +
scale_x_continuous(trans = "log",
                   breaks = myBreaks,
                   labels = myBreaks) +
geom_point(size = 5, legend = F)

clipped

2个回答

2
自从log(0)-Inf,我怀疑如果您将其保持为零,则始终会剪切您的0点。 我试图调整expand = ...coord_trans和我能想到的所有其他内容。
这是一个解决方法:
  • 将零值设置为任意小的值(例如1e-6)
  • 在该值处插入断点
  • 可选地标记该断点为0
代码:
myData <- data.frame(x = c(rexp(5), 0), y = "category")

myData <- within(myData, x[x==0] <- 1e-6)
myBreaks <- c(1e-6, 0.1, 1, 5)
myLabels <- c(0, myBreaks[-1])
ggplot(myData, aes(x = x, y = y)) +
    geom_point(size = 5, legend = F) +
    scale_x_continuous(
        trans = "log",
        breaks = myBreaks,
        labels = myLabels
    ) 

enter image description here


我就知道可能会发生这种情况。谢谢! - Gregor Thomas
3
我不会轻易接受这个。希望@kohske很快能用惊人的调整或新的几何图形证明我们是错误的! - Andrie
@Kohske很难证明log(0)!= -Inf。其他任何内容都是误导的,特别是将10 ^ -6标记为0! - hadley
是的,在尝试了几个不同的“0”值之后,我决定在我的数据中省略零。这可能是最好的选择。然而,这个答案仍然很好地回答了问题,以避免它们被剪切。 - Gregor Thomas

1
随着ggplot2版本3.0.0的发布,您可以使用coord_cartesian(clip = 'off')
library(ggplot2)

myData <- data.frame(x = c(rexp(5), 0), y = "category")
myBreaks <- c(.1, 1, 5)
ggplot(myData, aes(x = x, y = y)) +
  scale_x_continuous(trans = "log",
                     breaks = myBreaks,
                     labels = myBreaks) +
  geom_point(size = 5, legend = F) +
  coord_cartesian(clip = 'off') +
  labs(title = "coord_cartesian(clip = 'off')")

enter image description here


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