R:ggplot2:没有网格时刻度和标签的位置

R: ggplot2: position of ticks and labels in the absence of a grid

这是这个问题的后续问题:How can I suppress the vertical gridlines in a ggplot2 plot?

我有一个直方图,像这样:

library(ggplot2)
data <- c(1,1,3,2,2,2,2,1,4,1,4,4,1)
his <- qplot(data, geom="histogram")

我删除了垂直网格线,使用

his + theme(panel.grid.major.x = element_blank(),
            panel.grid.minor.x = element_blank()
      )

现在发现x轴的ticks太低了,和轴之间有间隙。虽然我可以使用 vjust= 调整文本的位置,但似乎没有办法调整刻度的位置,是吗?

这是问题的示例图:

library(ggplot2)
data <- c(1,1,3,2,2,2,2,1,4,1,4,4,1)
his <- qplot(data, geom="histogram") + 
         theme(panel.grid.major.x = element_blank(),
               panel.grid.minor.x = element_blank())

ggplot计算坐标轴的范围时,它总是在两端添加一点space以确保数据不会太靠近坐标轴的边界阴谋。您可以通过设置 scale_y_continuous(以及其他比例)的 expand 参数来防止它这样做:

his <- his + scale_y_continuous(expand = c(0, 0))

这解决了您删除刻度和数据之间的附加 space 的问题。但是,您可能希望在数据之上添加一些 space。要添加它,您可以使用 coord_cartesian,如下所示:

ymax <- max(table(data)) * 1.1
his + scale_y_continuous(expand = c(0, 0)) + 
      coord_cartesian(ylim = c(0, ymax))

我使用 max(table(data)) 来获取直方图将具有的最大计数数,然后为其添加 10% 的余量。请注意,这种固定直方图 y 轴范围的方法在手头的简单情况下效果很好,但在更复杂的情况下,即 bins 实际上包含一系列值,您将需要更复杂的解决方案。当然,您始终可以只创建绘图,然后读取 ymax.

的适当值

这给出了以下情节:

我还要说明一下,刻度和数据之间的 space 与水平网格线的存在与否无关。因此,如果不省略网格线,此解决方案也适用。