ggplot2:将比例尺非线性地分成相等的部分

时间:2019-02-12 15:36:04

标签: r ggplot2

我正在尝试复制this style of plot(贝叶斯顺序分析),但是我无法正确地使y轴正确。这是一些简单的示例数据:

library(ggplot2)
testdata <- data.frame(logbf=c(1/1000,1/300,1/100,1/30,1/10,1/3,1,3,10,30,100,300,1000),n=1:13)
ggplot(testdata,aes(n,logbf)) + geom_line()

目标是使它绘制为直线。为此,我需要将y轴分为1到3、3到10等的“部分”。我认为可以通过使用scale_y_continuous(trans=X)来实现,其中X是自定义非线性比例,如here一样。

问题是我无法正确使用缩放算法。以值38为例,我想到了找到最低的匹配分节符(30),并将每个值分解为代表节号的整数部分(例如3),范围从-5到5)和一个小数部分,代表到下一个部分的距离(8/(100-30) = 0.1143),得到的缩放值为3.1143

我不知道此算法是否正确,但是当我尝试对其进行编码时,得到的结果与预期不符。更大的问题是:难道没有更简单的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

对我而言,原始示例看起来像对数刻度,距离在10到30(x3)之间比在30到100(x3.33)之间更小的距离。可以使用scale_y_log10(或scale_y_continuous(trans = "log10"),然后指定自定义休息时间和这些休息时间的标签来复制该内容:

library(ggplot2)
testdata <- data.frame(logbf=c(1/1000,1/300,1/100,1/30,1/10,1/3,1,3,10,30,100,300,1000),n=1:13)
break_labels <- c("1/1000","1/300","1/100","1/30",
                  "1/10","1/3","1","3","10",
                  "30","100","300","1000")
ggplot(testdata,aes(n,logbf)) + geom_line() +
  scale_y_log10(breaks = testdata$logbf,
                labels = break_labels)

enter image description here