使用 ggplot 在对数图中绘制椭圆

ploting an ellipse in log plot with ggplot

几周前我发现了ggforce,它具有绘制椭圆的强大功能。但我没能在对数图中使用它。这是一个例子:

我想用椭圆圈出这个组

library(ggforce)
library(ggplot2)

ggplot(mtcars)+
  geom_point(aes(hp,disp))+
  geom_ellipse(aes(x0 = 230, y0 = 450, a = 80, b = 30, angle = -10))

但我想在日志图中执行此操作。如果我天真地做

ggplot(mtcars)+
  geom_point(aes(hp,disp))+
  geom_ellipse(aes(x0 = 230, y0 = 450, a = 80, b = 30, angle = -10))+
  scale_y_log10()

我得到一个巨大的椭圆:

看起来椭圆参数没有进行对数变换。我可以尝试减少参数轴以获得对数轴上的良好尺寸,例如:

ggplot(mtcars)+
  geom_point(aes(hp,disp))+
  scale_y_log10()+
  geom_ellipse(aes(x0 = 230, y0 = 450, a = 80, b = 0.05, angle =0))

有效:

但前提是角度为0,否则两个wxis混在一起得不到我想要的椭圆:

ggplot(mtcars)+
  geom_point(aes(hp,disp))+
  scale_y_log10()+
  geom_ellipse(aes(x0 = 230, y0 = 450, a = 80, b = 0.05, angle = -10))

如何在 ggplot 中的对数或对数-对数图中绘制椭圆? ggforce 是否有任何可行的解决方法?是否有任何其他 "simple" 解决方案(除了在半对数坐标中编码椭圆)?

对我来说真正有用的是变换坐标系而不是 y 尺度。

ggplot(mtcars) +
  geom_point(aes(hp,disp)) +
  geom_ellipse(aes(x0 = 230, y0 = 450, a = 80, b = 30, angle = -10)) +
  coord_trans(y = "log10")

老实说,使用坐标变换对我来说直觉上是有意义的 - 它类似于 coord_map 在绘制不同形状的多边形时你也在变换坐标 - 但我不知道足够的内部原理解释为什么缩放转换不起作用。