R 基线图,使用 mfrow

问题描述

你好 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 上的字符串。这给出了我们想要 rbindtype.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)

您可能希望将其放入 pngpdf 中,如 this answer 所示。

结果

enter image description here


数据:

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)
} 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...