求助:ggplot2绘制双数据散点图异常,点呈垂直直线无X轴刻度
问题原因与修复方案
核心问题
散点图出现垂直直线、X轴无数据的直接原因是:ggplot的aes(x=...)里传入了字符串常量,而非数据框的列名。当你写x = "Violent deaths in conflicts and one-sided violence (UCDP 2019)"时,ggplot会把这个字符串当成单一分类值,所有点都映射到这个值上,自然形成垂直直线,X轴也只会显示这个固定字符串。
另外代码还存在语法和列名匹配错误,一起修复如下:
完整修复后的代码
library(tidyverse) # 已包含dplyr和ggplot2,无需重复加载 # 读取冲突死亡数据 conflict_rate <- read_csv("https://raw.githubusercontent.com/owid/owid-datasets/master/datasets/Conflict%20deaths%20by%20country%20%E2%80%93%20UCDP%20(2019)/Conflict%20deaths%20by%20country%20%E2%80%93%20UCDP%20(2019).csv") # 修正列名匹配后重命名冲突死亡列(原列名多打了一个右括号) colnames(conflict_rate)[colnames(conflict_rate) == "Violent deaths in conflicts and one-sided violence (UCDP 2019)"] <- "Deaths_in_conflict" # 注意:需确保你已加载名为"data"的清廉指数数据,且包含Entity、Year列用于内连接 # jointdata <- inner_join(data, conflict_rate, by = c("Entity", "Year")) # 重命名清廉指数列 colnames(jointdata)[colnames(jointdata) == "Corruption.Perception.Index..Transparency.International..2016.."] <- "TICPI" # 绘制散点图:x使用重命名后的列名,不要加引号 ggplot(jointdata, aes(x = Deaths_in_conflict, y = TICPI)) + geom_point() + labs( title = "Violent deaths vs Corruption perception", x = "Violent deaths in conflicts and one-sided violence (UCDP 2019)", y = "Corruption Perception Index (Transparency International 2016)" )
关键修复点
- 去掉x轴参数的引号:
aes(x = Deaths_in_conflict),让ggplot识别数据框的列而非固定字符串 - 修正列名匹配错误:原冲突死亡列名是
(UCDP 2019),你之前多写了一个右括号,导致重命名失败 - 优化包加载:
tidyverse已包含dplyr和ggplot2,无需重复加载 - 修正语法问题:重命名列的代码后需换行或加分号,避免和后续代码连在一起触发语法错误
额外提醒
确保你的data对象(清廉指数数据)已正确加载,且包含Entity和Year列用于内连接。如果两类数据年份范围差异大,可能导致连接后数据量极少,可通过nrow(jointdata)检查数据行数。
内容的提问来源于stack exchange,提问作者Yinabi
相关产品推荐
相关产品推荐

