使用对数标度上的stat_函数在R中绘图
在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
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")