使用ggplot2中的facet_grid更改间断数

4

我有一些数据,如下所示:

y<-rep(c(1, 2, 3), times=5)
group<-rep(c("a", "b", "c", "d", "e"), each=3)
x<-c(2, 3, 4, 5, 7, 10, 10, 15, 19, 8, 10, 14, 25, 28, 33)

a<-data.frame (x, y, group)

当我使用facet_grid()函数并设置scales="free_x"选项时,我会得到5个具有不同断点数的图形。是否有可能让这5个图形具有相同数量的断点?例如3个。

ggplot(a, aes(x, y))+geom_point()+ facet_grid(~group, scales="free_x")

我知道如果我去掉scales="free_x"选项,那么这5个图表将使用相同的比例尺,但是它们看起来很丑。你能帮我解决吗?


你的问题不太清楚。你所说的“different breaks”是什么意思?如果你想让所有的图表在同一x轴上可比较,最好将它们叠放在一起,就像这样:ggplot(a, aes(x, y))+geom_point()+ facet_wrap(~group, ncol=1) - MattLBeck
请查看以下链接:https://dev59.com/ImQm5IYBdhLWcg3w4CIN - agenis
如果我没有解释清楚,我很抱歉。当我说“不同的间断点”时,我的意思是,“a”有5个间断点(2.0、2.5、3.0、3.5、4.0),“b”有6个(5、6、7、8、9、10),“c”有4个(10.0、12.5、15.0、17.5),"d"和"e"也是如此。我的问题是,有没有办法设置相同数量的间断点? 使用ncol=1轴,x具有相同的比例,但我不想这样做,因为xmin和xmax之间的范围太宽了。 - Nacho Glez
我尝试了链接和Agensis中看到的方法,但对于geom_point()不起作用,或者我做得不好 :/ - Nacho Glez
1个回答

14

您可以定义自己喜欢的断点函数。下面的示例展示了等距断点。请注意,函数中的x已经通过scale_x_continuousexpand参数扩展了其范围。在本例中,我将其缩回去(对于乘法扩展参数)。

# loading required packages
require(ggplot2)
require(grid)
# defining the breaks function, 
# s is the scaling factor (cf. multiplicative expand)
equal_breaks <- function(n = 3, s = 0.05, ...){
  function(x){
    # rescaling
    d <- s * diff(range(x)) / (1+2*s)
    seq(min(x)+d, max(x)-d, length=n)
  }
}
# plotting command 
p <- ggplot(a, aes(x, y)) + 
  geom_point() + 
  facet_grid(~group, scales="free_x") +
  # use 3 breaks, 
  # use same s as first expand argument, 
  # second expand argument should be 0
  scale_x_continuous(breaks=equal_breaks(n=3, s=0.05), 
                     expand = c(0.05, 0)) + 
  # set the panel margin such that the 
  # axis text does not overlap 
  theme(axis.text.x = element_text(angle=45), 
        panel.margin = unit(1, 'lines'))

生成的图像


太好了!谢谢你!但是,我又遇到了一个问题。这里只有1或0个小数位,但如果我将此函数用于我的真实数据,则会有5或6个小数位。我尝试使用 fmt <- function(){ function(x) format(x,nsmall = 2,scientific = FALSE) } 并在 scale_x_continuous 中添加 fmt。但是我收到了一个错误: Error in scale$labels(breaks) : unused argument (breaks)。如何使用此函数设置小数位数? - Nacho Glez
1
equal_breaks函数中,您可以将断点四舍五入到两位小数。例如,使用round(seq(min(x)+d, max(x)-d, length=n), 2)作为返回语句。 - shadow
@shadow 我修改了函数的返回值:ifelse(x > 1e-02, round(seq(min(x)+d, max(x)-d, length=n), 2), round(seq(min(x)+d, max(x)-d, length=n), 4) ) 因为我的数据具有不同的数量级,但现在无论 n 是多少,图表上只显示其中两个。我的数据在这里:http://stackoverflow.com/questions/31961170/changing-the-breaks-and-limits-in-a-facet-grid-where-scales-free-y - user4786271
这对我也起作用,但是我不知道为什么。特别是,函数“equal_breaks”中使用省略号(即“...”)的含义是什么?这是使用scale_continuous的官方方式还是某种黑客技术? - fstevens
1
@fstevens:(1)省略参数绝对不是必要的。我现在不记得为什么要添加它,可能意味着要在发布之前扩展函数,然后没有删除省略号。(2)这是在scale_continuous中使用 breaks 参数的标准方法。对于许多可能的断点,scales包中有标准函数,例如 pretty_breakslog_breaks。但如果您希望比较特殊的刻度看起来不同,那么你不妨自己加入。 - shadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接