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

R语言叠加出租车上车点图时调用par(new=TRUE)报错:无绘图时调用

解决ggplot2叠加两个出租车数据图层的问题

嘿,这个问题我太熟了!你踩了ggplot2和R基础绘图系统不兼容的坑——par(new=TRUE)是给基础plot()这类函数用的参数,和ggplot2的网格绘图逻辑完全不搭,直接混用肯定会出问题。而且你之前的思路是分开创建两个ggplot对象再试图叠加,这也不符合ggplot的图层设计逻辑。

错误根源拆解

par(new=TRUE)的作用是在基础绘图的已有画布上叠加新图,但ggplot2是独立的图层化绘图系统,它的叠加逻辑是通过+号把图层加到同一个ggplot对象里,根本不需要用基础绘图的参数。你之前的代码里既没先画出基础图就调用par(new=TRUE),又混用了两个绘图系统,自然会报calling par(new=TRUE) with no plot的错误。

正确解决方案:两种实现方式

方式一:直接在同一个ggplot中添加两个图层

不用分开创建两个ggplot对象,直接在空的ggplot基础上,分别添加黄色和绿色出租车的geom_point图层:

library(bigrquery)
library(readr)
library(ggplot2)

project <- "grab-analysis" # 记得替换成你的项目ID

# 黄色出租车数据查询
taxiQuery <- "SELECT ROUND(pickup_latitude, 4) as lat, ROUND(pickup_longitude, 4) as long, COUNT(*) as num_pickups 
              FROM `bigquery-public-data.new_york.tlc_yellow_trips_2016` 
              WHERE (pickup_latitude BETWEEN 40.61 AND 40.91) AND (pickup_longitude BETWEEN -74.06 AND -73.77 ) 
              GROUP BY lat, long"

# 绿色出租车数据查询
taxiQuery1 <- "SELECT ROUND(pickup_latitude, 4) as lat, ROUND(pickup_longitude, 4) as long, COUNT(*) as num_pickups 
               FROM `bigquery-public-data.new_york.tlc_green_trips_2016` 
               WHERE (pickup_latitude BETWEEN 40.61 AND 40.91) AND (pickup_longitude BETWEEN -74.06 AND -73.77 ) 
               GROUP BY lat, long"

# 从BigQuery获取数据
taxi_df <- query_exec(taxiQuery, project = project, max_pages = Inf, use_legacy_sql = FALSE)
taxi_df1 <- query_exec(taxiQuery1, project = project, max_pages = Inf, use_legacy_sql = FALSE)

# 创建最终绘图:同一个ggplot对象叠加两个图层
final_plot <- ggplot() +
  # 黄色出租车点(白色)
  geom_point(data = taxi_df, aes(x = long, y = lat, alpha = as.factor(num_pickups)),
             size = 0.4, color = "white") +
  # 绿色出租车点(绿色)
  geom_point(data = taxi_df1, aes(x = long, y = lat, alpha = as.factor(num_pickups)),
             size = 0.4, color = "green") +
  # 设置透明度刻度(隐藏图例)
  scale_alpha_discrete(range = c(0.1, 1), guide = FALSE) +
  # 自定义黑色背景主题
  theme(panel.background = element_rect(fill="black", color="black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text = element_blank(),
        axis.line = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank(),
        panel.border = element_blank(),
        plot.background = element_rect(fill="black", color="black"))

# 显示绘图
final_plot

方式二:合并数据集后绘图(更推荐,易维护)

把两个数据集合并,添加一个标记出租车类型的列,再通过颜色映射来区分,代码更简洁:

library(bigrquery)
library(readr)
library(ggplot2)
library(dplyr) # 需要用dplyr的合并函数

project <- "grab-analysis"

# 获取数据并添加类型标记
taxi_df <- query_exec(taxiQuery, project = project, max_pages = Inf, use_legacy_sql = FALSE) %>%
  mutate(taxi_type = "yellow")
taxi_df1 <- query_exec(taxiQuery1, project = project, max_pages = Inf, use_legacy_sql = FALSE) %>%
  mutate(taxi_type = "green")

# 合并两个数据集
combined_df <- bind_rows(taxi_df, taxi_df1)

# 绘制合并后的图
final_plot <- ggplot(data = combined_df, aes(x = long, y = lat, alpha = as.factor(num_pickups), color = taxi_type)) +
  geom_point(size = 0.4) +
  # 自定义颜色:黄色出租车用白色,绿色出租车用绿色
  scale_color_manual(values = c("yellow" = "white", "green" = "green")) +
  scale_alpha_discrete(range = c(0.1, 1), guide = FALSE) +
  # 黑色背景主题
  theme(panel.background = element_rect(fill="black", color="black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text = element_blank(),
        axis.line = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank(),
        panel.border = element_blank(),
        plot.background = element_rect(fill="black", color="black"))

final_plot

小提醒

以后用ggplot2的时候,记住它的核心是图层叠加,所有元素都通过+号加到同一个ggplot对象里,别再和基础绘图的par()、plot()混用啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:35:47