R:擦除 ggplot2 上的线条 - 绘制半矩形

R: Erasing Lines on ggplot2 - drawing half rectangles

我正在使用 R 编程语言。

我生成了一些随机数据并绘制了下图:

library(ggplot2)

var_1 = rnorm(1000,20,20)
var_2 = rnorm(1000,20,20)

my_data = data.frame(var_1, var_2)

ggplot(data=my_data, aes(x=var_1, y=var_2)) + geom_point() 

我现在想在此图上制作以下图案:

我尝试使用以下代码执行此操作,但这是我能得到的最接近的代码:

a1 = ggplot(data=my_data, aes(x=var_1, y=var_2)) + 
  geom_point()+ 
  geom_hline(yintercept=0, color = "red") + 
  geom_vline(xintercept=0, color = "red")

a2 = a1 + geom_point() + 
  geom_hline(yintercept=50, color = "red") + 
  geom_vline(xintercept=50, color = "red")

我的问题:有人可以告诉我一个“直接”的方法来在这个图表上制作这个图案吗?有什么方法可以“擦除”这些多余的行吗?

假设我有一个如下所示的数据框(“my_points”):

my_points = data.frame(var_1_point_1 = 0, var_1_point_2 = 50, var_2_point_1 = 0, var_2_point_2 = 50)

可不可以用“my_data”做图,“参考”“my_points”中的点做线?例如,像这样:

a1 = ggplot(data=my_data, aes(x=var_1, y=var_2)) + 
      geom_point()+ 
      geom_hline(yintercept my_points[1,2], color = "red") + 
      geom_vline(xintercept=my_points[1,1], color = "red")

谢谢!

您需要使用 geom_segment 而不是 geom_hlinegeom_vline,因为您需要为每个细分指定 xendyend .

library(tidyverse)

var_1 = rnorm(1000,20,20)
var_2 = rnorm(1000,20,20)

my_data = data.frame(var_1, var_2)

ggplot(data=my_data, aes(x=var_1, y=var_2)) + 
  geom_point() +
  geom_segment(aes(x = -50, xend = 0, y = 0, yend = 0), color = "red") +
  geom_segment(aes(x = 0, xend = 0, y = 0, yend = -50), color = "red") +
  geom_segment(aes(x = -50, xend = 50, y = 50, yend = 50), color = "red") + 
  geom_segment(aes(x = 50, xend = 50, y = 50, yend = -50), color = "red")

reprex package (v2.0.1)

创建于 2022-03-21

更新

由于 OP 希望使用额外的数据帧,这里是更新后的代码:

library(ggplot2)

var_1 = rnorm(1000,20,20)
var_2 = rnorm(1000,20,20)

my_data = data.frame(var_1, var_2)

mypoint <- data.frame(var_1_point_1 = c(-50, 0), 
                      var_1_point_2 = c(0, -50), 
                      var_2_point_1 = c(-50, 50), 
                      var_2_point_2 = c(50, -50))

ggplot(data=my_data, aes(x=var_1, y=var_2)) + 
  geom_point() +
  geom_step(data = mypoint, aes(var_1_point_1, var_1_point_2), color = "red") +
  geom_step(data = mypoint, aes(var_2_point_1, var_2_point_2), color = "red")

reprex package (v2.0.1)

于 2022-03-22 创建

人们往往会忘记 geom_linerange - 在香草 ggplot 中遗憾的是只适用于垂直线。但是还有ggstance::geom_linerangeh。这些将允许您传递带有 x/y 坐标的数据框,并且您将“只”需要两个 geom 图层用于垂直线和水平线(如果您的线总是从绘图的边缘开始)。当然,您可以对 geom_segment 应用相同的想法,然后不需要另一个包。

library(ggplot2)
library(ggstance)

## changed data frame my points:
x <- y <- c(0, 50)
my_points <- data.frame(x, y)

ggplot() +
  geom_point(aes(x = var_1, y = var_2), data = my_data) +
  geom_linerange(aes(x = x, ymin = -Inf, ymax = y), data = my_points, color = "red", size = 2) +
  geom_linerangeh(aes(xmin = -Inf, xmax = x, y = y), data = my_points, color = "red", size = 2)

另一种选择是制作您自己的统计数据并将其与 geom_segment:

一起使用
library(ggplot2)

var_1 <- rnorm(1000, 20, 20)
var_2 <- rnorm(1000, 20, 20)

my_data <- data.frame(var_1, var_2)

## changed data frame my points:
x <- y <- c(0, 50)
my_points <- data.frame(x, y)

StatEdge <- ggproto("StatEdge", Stat, compute_group = function(data, scales) {
  x <- c(rep(-Inf, nrow(data)), data$x)
  y <- c(data$y, rep(-Inf, nrow(data)))
  xend <- rep(data$x, nrow(data))
  yend <- rep(data$y, nrow(data))
  data.frame(x, xend, y, yend)
})

## now you can use the new stat for your geom
ggplot() +
  geom_point(aes(x = var_1, y = var_2), data = my_data) +
  geom_segment(data = my_points, aes(x, y), stat = "edge", size = 2, color = "red")

reprex package (v2.0.1)

创建于 2022-03-21