3

我在尝试使用stat_functionR's时遇到了严重的问题ggplot2。我从这个简单的例子开始:

ggplot(data.frame(x = c(1, 1e4)), aes(x)) + stat_function(fun = function(x) x)

按预期工作。不幸的是,当我为 x 和 y 轴添加对数刻度时:

ggplot(data.frame(x = 1:1e4), aes(x)) +
  scale_x_log10() + 
  scale_y_log10() +
  stat_function(fun = function(x) x)

我得到以下结果,这是对身份函数的严重违反。 在此处输入图像描述

我缺少一些非常基本的东西吗?那么在对数刻度上绘制函数的正确且最简单的方法是什么?

编辑: 受答案的启发,我继续尝试了尺度和aesthetics参数。我更加困惑地发现我使用下面的代码得到了我所期望的:

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
  scale_x_log10() + 
  scale_y_log10() +
  stat_function(fun = function(x) x)

具有明显未使用的 y 值向量(stat_function即未使用)。轴转换是否取决于数据的可用性?

4

2 回答 2

5

在 ggplot2 中,规则是比例变换先于统计变换,而统计变换又先于坐标变换。在这种情况下,函数(通过 stat_function())是统计转换。

如果您在 ggplot2 调用中使用 scale_x/y_*() 函数,它将在计算函数之前先应用比例变换。

案例 0:以 x 和 y 的原始比例绘制。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
    stat_function(fun = function(x) x)

案例 1a:由于 scale_x/y_log10() 的存在,x 和 y 在计算函数之前都进行了对数转换。您可以从它们各自刻度上的值中看到这一点(与案例 0 相比)。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
    stat_function(fun = function(x) x) +
    scale_x_log10() +
    scale_y_log10()

情况 1b:x 在原始数据帧中进行了对数转换。因此,该函数实际上在 log10(x) 值上运行,因此仍将是一条直线,但在 x 和 y 的 log10 尺度上。

ggplot(data.frame(x = log10(seq(1e4)), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x)

案例 1c:同 1b,除了一个例外:x 尺度是原始单位,而 y 尺度是 log10(x) 单位,因为 x 上的尺度变换发生在统计变换 f(y) =计算 y,其中 y = log10(x)。

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    scale_x_log10()

案例2:相比之下,坐标变换发生统计变换之后;即,首先以原始单位计算函数,然后在 x 上进行坐标变换,这会扭曲函数:

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10")

...当然,除非您对 x 和 y 应用相同的转换:

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10", ytrans = "log10")
于 2013-03-02T08:46:36.490 回答
5

当您使用scale_x_log10()then时,值x会被对数转换,然后才用于计算. 然后将值反向转换为原始值以进行缩放。值保持为从 log 转换计算。您可以通过绘制不带. 在情节中有直线。ystat_function()xyxscale_y_log10()

ggplot(data.frame(x=1:1e4), aes(x)) +
    stat_function(fun = function(x) x) +
    scale_x_log10() 

如果应用scale_y_log10()对数变换已经计算y的值,则绘制曲线。

于 2013-02-28T20:41:42.183 回答