使用ggplot2和轴缩放在R中的点之间正确插值

Interpolating correctly between points in R using ggplot2 and axis scaling

我有一些数据想在半对数尺度上绘制图表,但是当点之间有很大的跳跃时我会得到一些伪像。在线性尺度上,在后续点之间绘制一条直线,这是可视化的精细近似值。然而,当使用对数刻度时(通过使用 scale_x_log10 或 scale_x_continuous 进行对数转换,会发生完全相同的事情)。半对数刻度上两点之间的线应该显示为弯曲的。换句话说,这个:

df <- data.frame(x = c(0, 1), y = c(0, 1))
ggplot(data = df, aes(x, y)) + geom_line() + scale_x_log10(limits = c(10^-3, 10^0))

产生这个:

当我期待更多这样的事情时:

由此代码生成:

df <- data.frame(x = seq(0, 1, 0.01), y = seq(0, 1, 0.01))
ggplot(data = df, aes(x, y)) + geom_line() + scale_x_log10(limits = c(10^-3, 10^0))

很清楚发生了什么,但我不确定修复插值的最佳方法是什么。在我绘制的实际数据中,在不同的点有一些跳跃,这使得在尝试比较两条线时这些图非常具有误导性。 (在这种情况下,它们是 ROC 曲线。)

一个想法是我可以在数据中搜索跳跃并自己填充一些插值点,但我希望有一种更简洁的方法,不需要我添加一堆假数据点。

你说的是坐标系的变换,不是尺度的变换。区别在于比例变换发生在任何统计变换之前,而坐标变换发生在之后。在这种情况下,"statistical transformation" 是 "draw a straight line between the points"。使用转换后的比例,转换后的(log)中的线是直的space;使用变换后的坐标,它在原始(线性)space 中是直的,因此在 log space.

中是弯曲的
# don't include 0 in the data because log 0 is -Inf
DF <- data.frame(x = c(0.1, 1), y = c(0.1, 1))
ggplot(data = DF, aes(x = x, y = y)) +
  geom_line() +
  coord_trans(x="log10")