问题描述
你好 stackoverflow 社区,
我想为数据集中的所有国家/地区创建一个折线图(x = 年份,y = BMI)。 我只想使用 R base 进行可视化。 问题是 R 为每个国家单独生成可视化。我想要一个针对所有国家的可视化,并在可视化中为每个国家/地区提供单独的边距。
感谢您的帮助。
数据集:https://github.com/tanaytuncer/LifeExpectancy_BMI 代码:
path2 <- "/Users/tanaytuncer/Desktop/Quantitative Datenanalyse/BMI.csv"
data <- read.csv(path2,check.names = FALSE)
data <- data[-1:-3,]
names(data)[1] <- "country"
data <- data %>%
mutate(across(-country,parse_number)) %>%
gather("year","BMI",2:17)
df_BMI4 <- data %>%
select(country,BMI,year)
View(df_BMI4)
par(mfrow=c(50,4),mar(4,3,1))
for (i in df_BMI4$country) {
country <- subset(df_BMI4,country == i)
plot(country$year,country$BMI,type="l",main = i,add = TRUE)
}
解决方法
您的数据采用字符格式。要获得平均值和置信区间,您可以按适当的模式拆分 X
的字符串并将它们转换为数字格式。 请注意,但是您有 195 个国家/地区,这会使情节无法阅读,我将向您展示一个子集的方式。
在将您的数据改造成长格式 dl
(我在这里使用 reshape
而您使用 tidyr::gather
)之后,有一些 "No data"
值我们首先要标记为NA
。
dl <- `rownames<-`(reshape(d,idvar="country",varying=2:17,direction="long",sep="",timevar="year"),NULL)
dl$X <- ifelse(dl$X == "No data",NA,dl$X)
然后我们使用 "["
中的正则表达式 "]"
拆分 "-"
或 "\\[|\\]|-"
或 strsplit
上的字符串。这给出了我们想要 rbind
和 type.convert
从 "character"
到 "numeric"
的每三个元素的列表:我们还使用 setNames
设置专有名称。结果我们cbind
到我们长数据集的前两列。
num <- setNames(type.convert(do.call(rbind.data.frame,strsplit(dl$X," \\[|\\]|-"))),c("bmi","lo","up"))
dl <- cbind(dl[1:2],num)[order(dl$country,dl$year),]
现在我们提取一些我们需要的值,unique
个国家、年份和 range
。
cy <- unique(dl$country)
yr <- unique(dl$year)
rg <- range(dl[3:5],na.rm=T)
出于演示目的,这将国家/地区分为 195 到 35:
cy <- cy[1:(7*5)]
最后我们在 matplot
中使用 sapply
..
x11() ## opens a window
op <- par(mfrow=c(7,5),mar=c(4,4,3,1))
sapply(cy,function(x) {
matplot(dl[dl$country %in% x,3:5],type="l",lty=c(1,2,2),col=4,lwd=2,main=x,xlab="year",ylab="BMI",xaxt="n",ylim=rg)
axis(1,at=axTicks(1),labels=yr[axTicks(1)])
})
par(op)
您可能希望将其放入 png
或 pdf
中,如 this answer 所示。
结果
数据:
d <- read.csv("https://raw.githubusercontent.com/tanaytuncer/LifeExpectancy_BMI/main/BMI.csv")[-(1:3),]
names(d)[1] <- "country"
,
新版本:
par(mfrow=c(31,6),1))
for (i in unique(df_BMI4$country)) {
country <- subset(df_BMI4,country == i)
plot(country$year,country$BMI,main = i,add = TRUE)
}