【问题标题】:R base line plot, visualize all countries seperatly with mfrowR 基线图,使用 mfrow 分别可视化所有国家
【发布时间】:2020-12-31 11:53:59
【问题描述】:

你好 stackoverflow 社区,

我想为数据集中的所有国家/地区创建一个折线图(x = 年份,y = BMI)。 我只想使用 R 基础进行可视化。 问题是 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, 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)
} 

【问题讨论】:

  • 谢谢本。您是指原始数据还是经过处理的数据?操作数据集的变量 BMI 被转换为数字。我想可视化每个国家从 2000 年到 2015 年的 BMI。你知道我该如何解决我的问题吗?
  • @tanaytuncer 请看下面我的回答,告诉我你的想法。
  • 我相信@jay.sf 的答案有你需要的一切。

标签: r base


【解决方案1】:

您的数据是字符格式。要获得平均值和置信范围,您可以以适当的模式拆分 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 中使用正则表达式"\\[|\\]|-" 拆分"[""]""-" 上的字符串。这给出了我们想要从"character""numeric"rbindtype.convert 的每三个元素的列表:我们还使用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)]

最后我们在sapply中使用matplot..

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 所示。

结果


数据:

d <- read.csv("https://raw.githubusercontent.com/tanaytuncer/LifeExpectancy_BMI/main/BMI.csv")[-(1:3), ]
names(d)[1] <- "country"

【讨论】:

    【解决方案2】:

    新版本:

    par(mfrow=c(31,6), mar=c(4, 3, 3, 1))
    for (i in unique(df_BMI4$country)) {
      country <- subset(df_BMI4, country == i)
      plot(country$year, country$BMI, type="l", main = i, add = TRUE)
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多