Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在不明确指定中断的情况下,改进糟糕的自动勾选位置选择_R_Ggplot2 - Fatal编程技术网

R 在不明确指定中断的情况下,改进糟糕的自动勾选位置选择

R 在不明确指定中断的情况下,改进糟糕的自动勾选位置选择,r,ggplot2,R,Ggplot2,我发现使用scale\u y\u log10时,ggplot2有时会产生太少的记号。我正在尝试从任意数据自动生成绘图,我正在寻找一种方法来增加勾号的数量,而无需明确指定它们(因为我不知道数据将是什么)。例如,这里有一个函数用于创建具有对数y比例的简单散点图: example_plot <- function(x) { p <- ggplot(d, aes(x=MW, y=rel.Ki)) + geom_point() + scale_y_log10() p

我发现使用
scale\u y\u log10
时,
ggplot2
有时会产生太少的记号。我正在尝试从任意数据自动生成绘图,我正在寻找一种方法来增加勾号的数量,而无需明确指定它们(因为我不知道数据将是什么)。例如,这里有一个函数用于创建具有对数y比例的简单散点图:

example_plot <- function(x) {
  p <- ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10()
  p
}


y轴上的单个记号标记没有多大帮助。除了重新编写自动勾选位置功能外,是否有任何方法可以防止这种情况?

您可以通过编程设置限制。例如,使用您提供的数据,我们可以在函数中定义如下限制:

example_plot <- function(x){
  # identify the range of data
  lims <- c(10^floor(log10(min(x$rel.Ki, na.rm=TRUE))), 
    10^ceiling(log10(max(x$rel.Ki, na.rm=TRUE))))
  # require ggplot2
  require('ggplot2')
  # create the plot
  p <- ggplot(data = x, aes(x = MW, y = rel.Ki)) + 
    geom_point() +
    scale_y_log10(limits = lims)
  p
}

print(example_plot(d))
就我个人而言,我更喜欢对数图来显示至少一个数量级的变化,所以这种方法有助于确保这种情况发生


我刚刚通过阅读
?continuous_scale
发现,
breaks
参数可以是:

一种函数,当用一个参数调用时,一个给出比例限制的字符向量返回一个字符向量,指定要显示的断点

因此,为了保证一定数量的中断,您可以执行以下操作:

break_setter = function(lims) {
  return(seq(from=as.numeric(lims[1]), to=as.numeric(lims[2]), length.out=5))
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter)
很明显,这个非常简单的示例函数并不能很好地适应数据的对数性质,但它确实展示了如何以编程的方式实现这一点


您还可以使用
pretty
,它接受大量中断的建议,并返回漂亮的整数。使用

break_setter = function(lims) {
    return(pretty(x = as.numeric(lims), n = 5))
}
结果如下:

更好的是,我们可以使
break_setter()
返回一个适当的函数,其中包含您想要的
n
,默认值为5

break_setter = function(n = 5) {
   function(lims) {pretty(x = as.numeric(lims), n = n)}
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter())  ## 5 breaks as above

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter(20))

在将轴设置为对数后,您是否尝试过将y限制设置为
c(1,10)
c(1100)
?如果您不必使用
ggplot
标准旧
和(d,plot(MW,rel.Ki,log=“y”)
提供几乎完全相同的结果,但有合理的y轴点选择。正如我在文章中所述,我真的不能明确地设置限制,因为我不知道数据的范围是什么-问题是勾选有时效果很差。@LateMail+1让我相信基本图形是有用的!您可以使用
c(10^下限(log10(最小值(相对Ki,na.rm=TRUE)))、10^上限(log10(最大值(相对Ki,na.rm=TRUE)))
。这给了我c(0.1,10),正如你所期望的那样。@shujaa:不用担心,这肯定是对我的基本概念证明的改进。所以你在这里使用我回答中的
lims
?只是想知道。@AndyClifton:不,当您在
连续刻度中使用函数作为
中断
参数时,它会接受自动确定的限制,并通过函数传递这些限制。
break_setter = function(lims) {
  return(seq(from=as.numeric(lims[1]), to=as.numeric(lims[2]), length.out=5))
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter)
break_setter = function(lims) {
    return(pretty(x = as.numeric(lims), n = 5))
}
break_setter = function(n = 5) {
   function(lims) {pretty(x = as.numeric(lims), n = n)}
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter())  ## 5 breaks as above

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter(20))