R 基于刻面图中的数据计算轴记号位置

R 基于刻面图中的数据计算轴记号位置,r,ggplot2,facet-grid,R,Ggplot2,Facet Grid,我有一个问题,我想用facet\u grid()计算大型绘图中y轴标签的位置。让我向您展示我使用mpg数据集的意思 require(tidyverse) ggplot(mpg, aes(x = displ)) + geom_point(aes(y = hwy)) + facet_grid(drv ~ class, scales = "free") 您将注意到,两个轴都使用不同数量的标签。忽略x轴的问题,我只想在y轴上标记三个值:0、最大值的一半和最大值。这在我的

我有一个问题,我想用
facet\u grid()
计算大型绘图中y轴标签的位置。让我向您展示我使用
mpg
数据集的意思

require(tidyverse)

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free")

您将注意到,两个轴都使用不同数量的标签。忽略x轴的问题,我只想在y轴上标记三个值:0、最大值的一半和最大值。这在我的用例中是有意义的,所以下面是我尝试过的

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free") +
  geom_blank(aes(y = 0)) +                                 # extends y-axis to 0
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)), # prevents ggplot2 from extending beyond y = 0
                     n.breaks = 3)                         # Three axis labels, please.

绘图从y=0开始,并正确标记。但是,剩余的标签分配不好,出于某种原因,标签是
n=2
n=4
而不是
n=3

如果我能直接计算标签的位置就好了

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class, scales = "free") +
  geom_blank(aes(y = 0)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)),
                     n.breaks = 3,
                     breaks = c(0, 0.5*max(hwy), 1*max(hwy))) # Maybe these formulas works?
我相信通过这种方式提供断点应该是可行的,但我的语法不好。如何访问和使用绘图基础数据?或者,如果这不起作用,我可以为每行面板手动指定y轴标签吗


我真的需要一些帮助。

你可以删除
免费的秤。
:你得到你想要的吗

require(tidyverse)

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class)

您可以移除免费的
秤:那么您能得到您想要的吗

require(tidyverse)

ggplot(mpg, aes(x = displ)) +
  geom_point(aes(y = hwy)) +
  facet_grid(drv ~ class)

如果需要自定义中断规则,最简单的方法是在给定(面板)限制的情况下使用函数实现这些规则

下面是标记0、最大值和半最大值的示例

库(ggplot2)
ggplot(mpg,aes(x=显示))+
几何点(aes(y=hwy))+
平面网格(drv~class,scales=“free”)+
连续缩放(扩展=扩展(mult=c(0,0.1)),

limits=c(0,NA),#如果需要自定义中断规则,最简单的方法是使用函数实现给定(面板)限制的规则

下面是标记0、最大值和半最大值的示例

库(ggplot2)
ggplot(mpg,aes(x=显示))+
几何点(aes(y=hwy))+
平面网格(drv~class,scales=“free”)+
连续缩放(扩展=扩展(mult=c(0,0.1)),

limits=c(0,NA),#很好的解决方案teunbrand。问题是第一行的最大值与第二行的最小值重叠。您看到克服这种重叠的解决方案了吗?您可以使用
主题(panel.spating.y=unit(10,“pt”))将面板进一步分开
。这是一个很好的建议,但它似乎对x轴最大值有效,而不是对数据最大值有效。我通过将值调整为1.1的展开形式来解决它:
breaks=function(x){c(x[1]/1.1,mean(x)/1.1,x[2]/1.1})
。这会将标签正确定位在最大值的一半和最大值,并与expansion()结合使用还可以避免与下一个面板重叠。很好的解决方案是teunbrand。问题是第一行的最大值与第二行的最小值重叠。您看到克服这种重叠的解决方案了吗?您可以使用
主题(panel.spating.y=单位(10,“pt”))将面板进一步分开
。这是一个很好的建议,但它似乎在x轴最大值上工作,而不是在数据最大值上。我通过将值调整为1.1的展开形式来解决它:
breaks=function(x){c(x[1]/1.1,mean(x)/1.1,x[2]/1.1)}
。这会将标签正确定位在最大值的一半和最大值,这与expansion()结合使用还可以避免与下一个面板重叠。