首页 > 解决方案 > facet_zoom 不能改变缩放图的中断

问题描述

我目前有一个情节,并且曾经facet_zoom专注于 x 轴上 0 到 10 之间的记录。以下代码重现了一个示例:

require(ggplot2)
require(ggforce)
require(dplyr)
x <- rnorm(10000, 50, 25)
y <- rexp(10000)
data <- data.frame(x, y)

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = dplyr::between(x, 0, 10))

我想将图表缩放部分的中断更改为:

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = dplyr::between(x, 0, 10)) +
  scale_x_continuous(breaks = seq(0,10,2))

但这也改变了原始情节的中断。是否可以只更改缩放部分的中断,同时将原始图保留为默认值?

标签: rggplot2ggforce

解决方案


这适用于您的用例:

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = between(x, 0, 10)) +
  scale_x_continuous(breaks = pretty)

阴谋

?scale_x_continuous,breaks将接受以下内容(强调添加):

之一:

  • NULL不休息
  • waiver()对于转换对象计算的默认中断
  • 位置的数值向量
  • 限制作为输入并返回中断作为输出的函数

pretty()就是这样一种功能。它没有提供非常精细的控制,但确实允许您有一些余地来指定跨不同方面的不同尺度的中断。

为了说明,这里有两个示例,它们具有不同的所需休息次数。有关?pretty此函数接受的其他参数的更多详细信息,请参阅。

p <- ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = between(x, 0, 10))

cowplot::plot_grid(
  p + scale_x_continuous(breaks = function(x) pretty(x, n = 3)),
  p + scale_x_continuous(breaks = function(x) pretty(x, n = 10)),
  labels = c("n = 3", "n = 10"),
  nrow = 1
)

更多示例

当然,您也可以定义自己的函数来将绘图限制转换为所需的中断,(例如,类似的东西p + scale_x_continuous(breaks = function(x) seq(min(x), max(x), length.out = 5))),但我通常发现这些函数需要更多的调整才能正确,&pretty()通常已经足够好了。


推荐阅读