【问题标题】:Using geom_boxplot yields different result than base boxplot()使用 geom_boxplot 产生与基本 boxplot() 不同的结果
【发布时间】:2021-05-18 05:53:07
【问题描述】:

我正在使用 gapminder 数据集对数据框进行一些基本的数据分析。 我想创建一个仅包含阿根廷和新西兰的数据子集,以便比较它们的值。

install.packages("gapminder")
library(gapminder)
data("gapminder")

    > gapminder
# A tibble: 1,704 x 6
   country     continent  year lifeExp      pop gdpPercap
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.
 2 Afghanistan Asia       1957    30.3  9240934      821.
 3 Afghanistan Asia       1962    32.0 10267083      853.
 4 Afghanistan Asia       1967    34.0 11537966      836.
 5 Afghanistan Asia       1972    36.1 13079460      740.
 6 Afghanistan Asia       1977    38.4 14880372      786.
 7 Afghanistan Asia       1982    39.9 12881816      978.
 8 Afghanistan Asia       1987    40.8 13867957      852.
 9 Afghanistan Asia       1992    41.7 16317921      649.
10 Afghanistan Asia       1997    41.8 22227415      635.
# ... with 1,694 more rows

我正在对我想要的信息进行子集化:

df <- subset(gapminder, country =="Argentina" | country == "New Zealand")

> df
# A tibble: 24 x 6
   country   continent  year lifeExp      pop gdpPercap
   <fct>     <fct>     <int>   <dbl>    <int>     <dbl>
 1 Argentina Americas   1952    62.5 17876956     5911.
 2 Argentina Americas   1957    64.4 19610538     6857.
 3 Argentina Americas   1962    65.1 21283783     7133.
 4 Argentina Americas   1967    65.6 22934225     8053.
 5 Argentina Americas   1972    67.1 24779799     9443.
 6 Argentina Americas   1977    68.5 26983828    10079.
 7 Argentina Americas   1982    69.9 29341374     8998.
 8 Argentina Americas   1987    70.8 31620918     9140.
 9 Argentina Americas   1992    71.9 33958947     9308.
10 Argentina Americas   1997    73.3 36203463    10967.
# ... with 14 more rows

如您所见(或者看起来就是这样),这很有效

现在我想创建一个简单的箱线图来快速分析一些值,但是当我使用 boxplot() 和 geom_boxplot 进行绘制时,我得到了两个不同的结果:

boxplot(lifeExp ~ country)

这是我想要的,但 x 轴也考虑了我没有选择的所有其他国家。显然他们的数据是空的,但它使情节不可读。

相反,如果我在 ggplot 上使用相同的数据和所有内容,那么它可以完美运行:

ggplot(data = df, mapping = aes(x=country, y=lifeExp)) + geom_boxplot()

在定义子集时我做错了什么吗?使用 boxplot() 给我的印象是子集保留了所有内容,但将我不想为 NULL 的内容设置为值。

【问题讨论】:

  • 如果country 是一个因素,它的水平在子集后仍然存在。但只有级别,没有与它们对应的行,因此,该图显示了空格但没有绘制数据。试试df$country &lt;- droplevels(df$country)
  • 工作就像一个魅力,谢谢!

标签: r


【解决方案1】:

从问题中发布的代码开始。

library(gapminder)
data("gapminder")

df <- subset(gapminder, country =="Argentina" | country == "New Zealand")
boxplot(lifeExp ~ country, df)

该图显示了所有国家/地区的空间,因为country 是一个因素,子集保持其原始水平。用str,可以看出df是什么:

str(df)
#tibble [24 × 6] (S3: tbl_df/tbl/data.frame)
# $ country  : Factor w/ 142 levels "Afghanistan",..: 5 5 5 5 5 5 5 5 5 5 ...
# $ continent: Factor w/ 5 levels "Africa","Americas",..: 2 2 2 2 2 2 2 2 2 2 ...
# $ year     : int [1:24] 1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
# $ lifeExp  : num [1:24] 62.5 64.4 65.1 65.6 67.1 ...
# $ pop      : int [1:24] 17876956 19610538 21283783 22934225 24779799 26983828 29341374 31620918 33958947 36203463 ...
# $ gdpPercap: num [1:24] 5911 6857 7133 8053 9443 ...

因子country 有 142 个级别。
解决办法是去掉额外的关卡。

df2 <- df
df2$country <- droplevels(df2$country)
boxplot(lifeExp ~ country, df2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多