5

几周前我发现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?有没有其他“简单”的解决方案(除了在半对数坐标中编码椭圆)?

4

1 回答 1

6

实际上对我有用的是转换坐标系而不是 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你在以不同形状绘制多边形时也在变换坐标的地方——但我不知道足够的内部结构来解释为什么比例变换不起作用。

于 2020-01-09T10:41:21.317 回答