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
相关产品推荐
相关产品推荐

