ggplot2:将比例非线性地划分为相等宽度的部分

问题描述 投票:1回答:1

我正在尝试重现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的缩放值。

我不知道这个算法是否正确,但是当我尝试编码时,我得到的结果并不像预期的那样。更大的问题是:是不是有更简单的方法来实现这一目标?

r ggplot2
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.