使用对数标度上的stat_函数在R中绘图

使用对数标度上的stat_函数在R中绘图,r,ggplot2,R,Ggplot2,在R的ggplot2中,我在尝试处理stat\u函数时遇到了严重的问题。我从这个简单的例子开始: 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_fun

在R的
ggplot2
中,我在尝试处理
stat\u函数时遇到了严重的问题。我从这个简单的例子开始:

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)
我得到了以下结果,这是对identity函数非常严重的违反。

我有没有遗漏一些非常基本的东西?那么,在对数标度上绘制函数的正确且最简单的方法是什么

编辑: 受这些答案的启发,我继续用天平和
美学参数进行实验。我甚至更困惑地发现,我使用下面的代码得到了我所期望的:

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\u函数使用)。轴变换是否取决于数据的可用性?

当您使用
scale\u x\u log10()
时,将
x
值进行日志变换,然后仅用于使用
stat\u function()计算
y
值。然后将
x
值反变换为原始值以进行缩放<代码>y
值保留为根据对数变换的
x
计算得出的值。您可以通过不使用
scale\u y\u log10()打印值来检查这一点。
。在绘图中有一条直线

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

如果应用
scale\u y\u log10()
则记录已计算的
y
值的变换,因此绘制曲线。

在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相比)中看到这一点

案例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)

情况2:相反,坐标变换发生在统计变换之后;i、 例如,首先以原始单位计算函数,然后在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")

是的,非常好,我把注意力集中在ggplot做事的顺序上。
ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10")
ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10", ytrans = "log10")