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

时间:2015-04-24 21:13:12

标签: r ggplot2

我想要在半对数刻度上绘制一些数据,但是当点之间有大的跳跃时,我会得到一些伪像。在线性比例上,在后续点之间绘制直线,这是可视化的精细近似。但是,使用对数比例(通过使用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))

产生这个:

enter image description here

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

enter image description here

由此代码生成:

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曲线。)

有一种想法是我可以搜索数据以获取跳转并自己填充一些插值点,但我希望有一种更简洁的方式,不会让我添加一堆伪数据点。

1 个答案:

答案 0 :(得分:2)

您所描述的是坐标系的转换,而不是尺度的转换。区别在于尺度变换在任何统计变换之前发生,并且之后发生坐标变换。在这种情况下,“统计变换”是“在点之间画一条直线”。通过变换的比例,线在变换(对数)空间中是直的;使用变换后的坐标,它在原始(线性)空间中是直的,因此在对数空间中弯曲。

# 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")

ggplot(data = data.frame(x = c(0.1, 1), y = c(0.1, 1)), aes(x = x, y = y)) + geom_line() + coord_trans(x="log10")