You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2多分面散点图中添加geom_vline(xintercept=3.2)?

Solution for Creating Three Scatter Plots with Vertical Lines in ggplot2

Hey there! Let's break down how to create those three scatter plots with the vertical line you need. There are two common approaches depending on whether you want your plots arranged as a grid of facets or as separate, combined plots.

Approach 1: Use Faceting with Tidy Data

ggplot works best with "tidy" data (one observation per row), so first we'll reshape your wide data frame into long format. Then we can use faceting to create one plot per y variable, all sharing the same x-axis, and add the vertical line to every facet.

First, load the required packages and prepare your data:

# Load necessary packages
library(ggplot2)
library(tidyr)

# Your original data
data <- data.frame(
  x = c(1,2,3,4,5,6,7,8,9,10),
  y1 = c(-2,-7,-12,-17,-22,-27,-32,-37,-42,-47),
  y2 = c(1003,2003,3003,4003,5003,6003,7003,8003,9003,10003),
  y3 = c(-3,-6,-9,-12,-15,-18,-21,-24,-27,-30)
)

# Reshape to long format (one row per x-y pair)
tidy_data <- pivot_longer(data, cols = starts_with("y"), names_to = "y_variable", values_to = "value")

Now create the faceted plot with the vertical line:

ggplot(tidy_data, aes(x = x, y = value)) +
  geom_point(size = 2, color = "steelblue") +  # Add scatter points
  geom_vline(xintercept = 3.2, color = "red", linetype = "dashed") +  # Add vertical line to all facets
  facet_wrap(~y_variable, scales = "free_y") +  # Create a separate plot for each y variable
  labs(title = "Scatter Plots with Vertical Line at x=3.2", x = "X Variable", y = "Y Value") +
  theme_minimal()

The scales = "free_y" argument is key here—since your y variables have wildly different ranges (y1/y3 are negative, y2 is large positive), this lets each facet use its own y-axis scale so the data stays readable.

Approach 2: Create Separate Plots and Combine Them

If you prefer three distinct plots that you can arrange freely, you can create each plot individually and use the patchwork package to combine them.

First install and load patchwork (if you haven't already):

install.packages("patchwork")
library(patchwork)

Then create each plot:

# Plot for x vs y1
p1 <- ggplot(data, aes(x = x, y = y1)) +
  geom_point(color = "steelblue") +
  geom_vline(xintercept = 3.2, color = "red", linetype = "dashed") +
  labs(title = "x vs y1", x = "X", y = "y1") +
  theme_minimal()

# Plot for x vs y2
p2 <- ggplot(data, aes(x = x, y = y2)) +
  geom_point(color = "steelblue") +
  geom_vline(xintercept = 3.2, color = "red", linetype = "dashed") +
  labs(title = "x vs y2", x = "X", y = "y2") +
  theme_minimal()

# Plot for x vs y3
p3 <- ggplot(data, aes(x = x, y = y3)) +
  geom_point(color = "steelblue") +
  geom_vline(xintercept = 3.2, color = "red", linetype = "dashed") +
  labs(title = "x vs y3", x = "X", y = "y3") +
  theme_minimal()

Combine the plots (arrange in a single row here—swap nrow = 1 for ncol = 1 to stack vertically):

p1 + p2 + p3 + plot_layout(nrow = 1) +
  plot_annotation(title = "Three Scatter Plots with Vertical Line at x=3.2")

Both methods will give you exactly what you need: three scatter plots paired with x, each featuring the vertical line at x=3.2. The faceting approach is more efficient for this scenario, while the separate plots give you full control over each individual plot's appearance.

内容的提问来源于stack exchange,提问作者hehe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:40:33