4

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

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

示例图

这是我的 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))
4

2 回答 2

13

将 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)))

在此处输入代码

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

x <- 11:35
p + scale_x_discrete(breaks = c(1:35)), 
                     labels = c(1:10, ifelse(x%%5 == 0, x, "")))
于 2012-08-19T09:48:52.950 回答
4

我喜欢@lselzer 的解决方案,但从技术上讲,它可能不是您想要的。读者得到的印象是比例可能是对数比例,这可能不是你想要的。您可以像这样添加中间具有空值的标签。

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

在此处输入图像描述

于 2012-08-19T14:51:27.650 回答