我正在使用 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")
謝謝!
uj5u.com熱心網友回復:
您需要使用geom_segment而不是geom_hline或,geom_vline因為您需要為每個段指定xend和yend。
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 包于 2022-03-21 創建(v2.0.1)
更新
由于 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 包于 2022-03-22 創建(v2.0.1)
uj5u.com熱心網友回復:
人們往往會忘記geom_linerange- 在香草 ggplot 中可悲的是僅適用于垂直線。但也有ggstance::geom_linerangeh。這些將允許您使用 x/y 坐標傳遞資料框,并且您將“僅”需要兩個幾何圖層用于垂直線和水平線(如果您的線始終從繪圖的邊緣開始)。當然,您可以對 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)

uj5u.com熱心網友回復:
另一種選擇是制作自己的統計資料并將其與 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 包于 2022-03-21 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446300.html
