扩展ggplot中定性变量的限制

时间:2017-05-26 01:31:34

标签: r ggplot2

大家好,感谢您的考虑,

目标是在有许多很多x轴标签的情况下提供更多空间。注意我不关心标签本身是否在图上可视化(我在下面的代码中将它们排除在外)。我想要改变的是,当典型的geom_point图中有~1000个x轴标签和1000个数据点时,与那些第一个和最后几个x轴标签相关联的最左边和最右边的点被压碎了绘图区域的边缘。我想填补一些空间,这些点不会受到挤压。

我想知道在scale-x-discrete(limits=c(xi,xii))xi不是数字的情况下是否有办法改变xii类型的命令,而是字符串。一对例子(希望)明确:

在第一种情况下,最右边的点和灰色阴影图的边缘之间的间距很大,使得该点不会在绘图区域的边缘上向上流血。我希望这个效果在最后一个点和绘图边缘之间有一些空间。

library(ggplot2)
set.seed(10)
lessVals = sample(1:100000, 10, replace = T)
lessIDs = as.character(sample(1:100000, 10, replace = T))
df.less <- data.frame(lessIDs, lessVals)
df.less$lessIDs <- as.character(df.less$lessIDs)
lessDat <- ggplot(df.less)
lessDat + geom_point(aes(lessIDs, lessVals)) + theme(axis.text.x = 
element_blank())

然而,在下列情况下,有数千个x轴点,虽然可视化身份本身的标签是无关紧要的,但我想避免让左右两点被压扁到边缘。绘图区。注意我并不关心图中的点被挤压在一起 - 这是不可避免的,过度绘图可以用alpha参数或其他东西来解决。我想要解决的是让图的边缘上的点(最好是左边和右边)在水平面之间有一些缓冲,左边是y轴刻度,右边是目前什么都没有(但可能是一个传说)。

manyIDs = as.character(sample(1:100000, 1000, replace = T))
manyVals = sample(1:100000, 1000, replace = T)
df.many <- data.frame(manyIDs, manyVals)
df.many$manyIDs <- as.character(df.many$manyIDs)
manyDat <- ggplot(df.many)
manyDat + geom_point(aes(manyIDs, manyVals)) + theme(axis.text.x = 
element_blank())

我很想知道究竟可以做些什么来为这些点的水平边缘提供一点缓冲。

感谢分享你的天才。

1 个答案:

答案 0 :(得分:0)

因为你的x变量是字符,ggplot2会创建一个'离散'的x轴。当类别数量相当小(2 - 25)时,离散轴的默认绘图限制很有意义。您可以使用expand参数scale_x_discrete来手动调整绘图限制。视觉外观将取决于点和图形设备的大小,因此您可能需要相应调整。

例如,scale_x_discrete(expand=c(0.1, 0))将扩展绘图的每一边10%的数据范围。虽然scale_x_discrete(expand=c(0, 2))将每边扩展2(无论x是什么单位)。另请参阅http://ggplot2.tidyverse.org/reference/scale_discrete.html

p1 <- ggplot(df.less, aes(x=lessIDs, y=lessVals)) +
      geom_point() + 
      theme(axis.text.x=element_blank()) +
      labs(title="Default x-axis limits")

# Added x-axis space with expand.
p2 <- ggplot(df.less, aes(x=lessIDs, y=lessVals)) +
      geom_point() + 
      theme(axis.text.x=element_blank()) +
      scale_x_discrete(expand=c(0, 2)) +
      labs(title="expand=c(0, 2)")

p3 <- ggplot(df.many, aes(x=manyIDs, y=manyVals)) +
      geom_point() + 
      theme(axis.text.x=element_blank()) +
      theme(panel.grid.major.x=element_blank()) +
      theme(axis.ticks.x=element_blank()) +
      labs(title="Default x-axis limits")

# Added x-axis space with expand.
p4 <- ggplot(df.many, aes(x=manyIDs, y=manyVals)) +
      geom_point() + 
      theme(axis.text.x=element_blank()) +
      theme(panel.grid.major.x=element_blank()) +
      theme(axis.ticks.x=element_blank()) +
      scale_x_discrete(expand=c(0.1, 0)) +
      labs(title="expand=c(0.1, 0)")

library(gridExtra)

ggsave("plots.png", plot=arrangeGrob(p1, p2, p3, p4, nrow=2), 
       height=4, width=6, dpi=150)

enter image description here