如何将轴断点仅设置为轴的一部分?

时间:2012-08-19 02:11:10

标签: r plot ggplot2 histogram

在R中,我绘制了以下直方图。问题出在X轴上。大多数数据属于区间[0,10]。很少有X值大于10,尽管最大值为34。

因此,我不会在X轴上一直显示0,1,2,...直到34,而是显示0,1,2,...,10,15,20,25,30换句话说,当X> 10,仅以5的间隔显示标签,这样标签就不会重叠。

example figure

这是我的R代码。如何修改它?

d<-read.table("16_prop_s.tsv", header=T, sep="\t")
library(ggplot2)
library(scales)
ggplot(d, aes(x=factor(NRB))) + 
   geom_histogram(aes(y=(..count..)/sum(..count..))) + 
   scale_y_continuous(labels=percent_format()) + 
   xlab("Rotatable bonds") + opts(axis.title.y = theme_blank()) +
   opts(axis.title.x = theme_text(size = 24)) + 
   opts(axis.text.x = theme_text(size = 18)) + 
   opts(axis.text.y = theme_text(size = 18))

2 个答案:

答案 0 :(得分:12)

将scale_x_discrete与自定义中断结合使用:

d <- data.frame(NRB = c(abs(round(rnorm(1000, 5, 4))), 1:34))
library(ggplot2)
library(scales)
p <- ggplot(d, aes(x=factor(NRB))) +
  geom_histogram(aes(y=(..count..)/sum(..count..))) +
  scale_y_continuous(labels=percent_format()) +
  xlab("Rotatable bonds") + opts(axis.title.y = theme_blank()) +
  opts(axis.title.x = theme_text(size = 24)) +
  opts(axis.text.x = theme_text(size = 18)) +
  opts(axis.text.y = theme_text(size = 18))

p + scale_x_discrete(breaks = c(1:10, seq(15, 35,5)), 
                     labels = c(1:10, seq(15, 35,5)))

enter code here

如果您想要均匀分布的网格线但使用相同的数字,请使用空标签。

x <- 11:35
p + scale_x_discrete(breaks = c(1:35)), 
                     labels = c(1:10, ifelse(x%%5 == 0, x, "")))

答案 1 :(得分:4)

我喜欢@ lselzer的解决方案,但技术上可能不是你想要的。读者会得到这样的印象:刻度可能是对数刻度,这可能不是你想要的。您可以添加具有空值的标签,如下所示。

p + scale_x_discrete(breaks = 1:34, 
   labels = c(1:10, "", "", "", "", 15, "", "", "", "", 20, "", "", "", "", 25, "", "", "", "", 30, "", "", "", 34))

enter image description here