使用ggplot绘制多个正方形

16

我想改变 ggplot 的 'background' 颜色。我想实现的是下面展示的图形。我已经尝试了使用 geom_ribbon,但这样只能定义 ymin 和 ymax。这只允许我创建两个正方形。

目前我使用的代码:

df <- data.frame(x = rnorm(10), y = rnorm(10))

ggplot(df) +
 geom_point(aes(x, y)) +
 geom_ribbon(aes(x = x, ymin = min(y), ymax = 0), fill = "red", alpha = .5) +
 geom_ribbon(aes(x = x, ymin = min(0), ymax = max(y)), fill = "blue", alpha = .5)

这是我想要得到的结果:

ggplot example

感谢您的时间。


你可能在想geom_rect吧? - joran
你说得对!我已经盯着ggplot的文档页面看了好久,但我完全没看到这个。 - jeroen81
2个回答

13

如果你想让“背景”颜色一直延伸到图表边缘而不仅仅是极值点,可以采用以下变体方法:

ggplot(df) +
  geom_rect(xmin = -Inf, xmax = 0,   ymin = -Inf, ymax = 0,   fill = "red") +
  geom_rect(xmin = 0,    xmax = Inf, ymin = -Inf, ymax = 0,   fill = "blue") +
  geom_rect(xmin = 0,    xmax = Inf, ymin = 0,    ymax = Inf, fill = "green") +
  geom_rect(xmin = -Inf, xmax = 0,   ymin = 0,    ymax = Inf, fill = "yellow") +
  geom_point(aes(x, y), size = 5)

在此输入图片描述


编辑:透明度

加入 alpha=0.5 是“有效的”,但是使用 geom_rect 时,即使没有引用原始的 df 数据框,也会为每行 df (在本例中为10次)绘制一个矩形。设置 alpha=0.01 显示了有透明度,但只有预期水平的1/10。正确的方法是使用注释来绘制矩形;注释仅绘制一次几何体,而不是针对原始数据框的每行都绘制一次。

ggplot(df) +
  annotate("rect", xmin=-Inf, xmax=0, ymin=-Inf, ymax=0, fill="red", alpha=0.5) +
  annotate("rect", xmin=0, xmax=Inf, ymin=-Inf, ymax=0, fill="blue", alpha=0.5) +
  annotate("rect", xmin=0, xmax=Inf, ymin=0, ymax=Inf, fill="green", alpha=0.5) +
  annotate("rect", xmin=-Inf, xmax=0, ymin=0, ymax=Inf, fill="yellow", alpha=0.5) +
  geom_point(aes(x, y), size=5)

在此输入图片描述


谢谢,这让它看起来更好了。 - jeroen81
有没有想法如何使用alpha使两个矩形变成透明的?仅仅设置alpha = .5或fill.alpha = .5是不起作用的。我也尝试了inherent.aes = F,但也没有成功。 - jeroen81
谢谢!我通过创建一个带有X和Y值的独立数据框来解决问题,然后使用 aes(fill = "x")。但你的解决方案更好。 - jeroen81

3

在 joran 的评论后,答案如下:

ggplot(df) +
  geom_rect(aes(xmin = min(x), xmax = 0, ymin = min(y), ymax = 0), fill = "red") +
  geom_rect(aes(xmin = min(0), xmax = max(x), ymin = min(y), ymax = 0), fill = "blue") +
  geom_rect(aes(xmin = min(0), xmax = max(x), ymin = 0, ymax = max(y)), fill = "green") +
  geom_rect(aes(xmin = min(x), xmax = 0, ymin = 0, ymax = max(y)), fill = "yellow") +
  geom_point(aes(x, y), size = 5)

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