使用ggplot2包标记选定的中断

时间:2016-05-14 10:25:57

标签: r label

我试图标记x轴的一些中断。到目前为止我所做的是以下内容:

data <- data.frame(time = c(13, 25, 78, 130), event = 1)
roundDown <- function(x) 10 ^ trunc(log10(x))

xSeqBreaks <- sapply(log10(roundDown(min(data$time))):log10(roundDown(max(data$time))), function(x)(seq(10 ^ x, 10 ^ (x + 1), 10 ^ x)))

xSeqLabels <- sapply(log10(roundDown(min(data$time))):log10(roundDown(max(data$time))), function(x)(seq(10 ^ x, 5 * 10 ^ x, 10 ^ x)))

        # ... calling ggplot(..)        
scale_x_log10(breaks = xSeqBreaks, labels = xSeqLabels, expand = c(.05, .1)) +
        # ... some other ggplot functions 

xSeqBreaks给了我一个矩阵,它打破了x轴,使得在每个十进制功率范围之间有10行。例如,我的数据时间的最小值是13,最大时间是130,我会在c(10,20,30,40,50,60,70,80,90,100,200,300,400,500 ,600,700,800,900,1000)。

xSeqLabels生成一个矩阵,该矩阵应标记x轴,使得在每个十进制范围内仅标记前5行。继续上面的例子我希望标签在c(10,20,30,40,50,100,200,300,400,500)

问题是以下错误消息打印到控制台:

&#34;错误:breakslabels的长度必须相同&#34;

我尝试过几种方法,例如为两者,断点和标签编写自己的功能,但这也不会起作用。

对于任何类型的时间数据,此问题的解决方案都是可重复的,这一点非常重要。 这就是为什么这篇较早的帖子Only label selected breaks没有解决我的问题。

此外,如果我可以使用&#34;普通&#34;那将是非常好的。用于标记的数字而不是科学记数法(100000而不是1e + 05等)。

祝你好运

蒂姆

1 个答案:

答案 0 :(得分:0)

对之前误解了您的问题表示歉意。以下是您正在寻找的内容:

xSeqBreaks <- c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)

//Replace the last 4 labels for every power of 10 with empty strings
xSeqLabels <- xSeqBreaks
xSeqLabels[c(rep(F,5),rep(T,4))] <- ''

给出了:

> xSeqBreaks
[1]   10   20   30   40   50   60   70   80   90  100  200  300  400
[14]  500  600  700  800  900 1000
> xSeqLabels
[1] "10"   "20"   "30"   "40"   "50"   ""     ""     ""     ""    
[10] "100"  "200"  "300"  "400"  "500"  ""     ""     ""     ""    
[19] "1000"