Thi*_*lle 5 r ggplot2 autoscaling
对于小于1e-10的数字,我有一个y缩放的问题:它们都出现在同一水平线上.
这是一个可重复的例子:
file <- structure(list(I = c(-7.254574e-11, -5.649333e-11, -5.015416e-11,
-4.228137e-11, -3.287486e-11, -2.714915e-11, -2.203692e-11, -1.784489e-11,
-1.150574e-11, -1.058553e-11, -6.189018e-12, -3.735149e-12, -2.303724e-12,
6.610914e-13, 1.274374e-12, -3.610768e-13, 5.465134e-12, 6.691699e-12,
8.020478e-12, 1.139353e-11, 1.537988e-11, 1.926399e-11, 2.130825e-11,
2.45791e-11, 3.204071e-11, 3.582262e-11, 4.287535e-11, 4.624839e-11,
5.16657e-11, 6.035387e-11), V = c(-2, -1.867, -1.733, -1.6, -1.467,
-1.333, -1.2, -1.067, -0.933, -0.8, -0.667, -0.533, -0.4, -0.267,
-0.133, 0, 0.133, 0.267, 0.4, 0.533, 0.667, 0.8, 0.933, 1.067,
1.2, 1.333, 1.467, 1.6, 1.733, 1.867)), .Names = c("I", "V"), class = "data.frame", row.names = c(NA,
-30L))
plot(file$V,file$I)
gg <- ggplot(file,aes(x = V,y=I))
print(gg + geom_point())
Run Code Online (Sandbox Code Playgroud)
如您所见,使用基本绘图功能可以正确显示点,而使用ggplot2则可以在水平线上显示这些点.
我在2011年5月在邮件列表上看到了类似的帖子,Hadley回答说它与ggplot2的开发版本一起工作.但是,使用下面描述的R版本我仍然会收到错误.
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i686-pc-linux-gnu (32-bit)
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C LC_TIME=fr_FR.UTF-8
[4] LC_COLLATE=fr_FR.UTF-8 LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
[7] LC_PAPER=C LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] tikzDevice_0.6.2 filehash_2.2-1 scales_0.2.0 plyr_1.7.1 reshape2_1.2.1
[6] ggplot2_0.9.0
loaded via a namespace (and not attached):
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.15.0 MASS_7.3-18
[6] memoise_0.1 munsell_0.3 proto_0.3-9.2 RColorBrewer_1.0-5 stringr_0.6
[11] tools_2.15.0
Run Code Online (Sandbox Code Playgroud)
有人有线索吗?
先感谢您 !Thibaud Ruelle
正如 Brian Diggs 在回复@joran 上面指出的相关帖子时所评论的那样,问题是由该函数引起的scales::zero_range()。它用于all.equal()测试最小和最大 y 值是否在tolerance = .Machine$double.eps ^ 0.5 = 1.490116e-08彼此之内;如果是,则数据将使用示例中使用的“零刻度”绘制。
作为临时修复,您可以使用fixInNamespace()删除zero_range().
library(scales) ## (The scales package needs to be on your search path)
fixInNamespace("zero_range", pos="package:scales")
Run Code Online (Sandbox Code Playgroud)
在 启动的编辑器中fixInNamespace(),替换 的定义zero_range():
function (x)
{
length(x) == 1 || isTRUE(all.equal(x[1] - x[2], 0))
}
Run Code Online (Sandbox Code Playgroud)
与此(确保保存编辑后的版本):
function (x)
{
length(x) == 1
}
Run Code Online (Sandbox Code Playgroud)
您提供的代码运行得很好:
