ggplot错误:无法将类“ c(“ gg”,“ ggplot”)“强制转换为data.frame

时间:2019-04-14 14:15:04

标签: r ggplot2 error-handling

我试图运行一段非常简单的代码,以便为作业创建ggplot。我是R的新手,所以我怀疑这是一个简单的问题,但现在我只是在努力。我的教授实际上是写了这段代码,并且已经为其他与我交谈过的学生工作过。但是,我遇到一个错误,这很令人困惑。

部分问题可能是我以前曾试图将ggplot强制转换为数据帧(因为一段时间以来我并没有完全意识到ggplot的确切含义),并将其命名为gg。

自从我开始作业以来,这行代码一直崩溃 注意:这是我的教授提供的代码,可为其他人使用

ggplot(filter(gapminder, gapminder$year==1987, group=1)) + geom_point(aes(gdpPercap, lifeExp, color=continent, size=pop)) + xlab("GDP per capita") + ylab("Life expectancy at birth")

我尝试使用以下方法将ggplot强制转换为数据框:

gg = as.data.frame(ggplot)

显然这没有用或没有帮助,但是从文件中删除此代码后,它可能仍会影响前一行代码?

我至少希望有某种情节,但是却出现以下错误:

  

as.data.frame.default(x [[i]]中的错误,可选= TRUE,   stringsAsFactors = stringsAsFactors):不能强制类“ c(“ gg”,   “ ggplot”)”添加到data.frame

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

ggplot将数据框作为其输入,并创建一个绘图对象,其中包含许多与生成该数据的所有参数相对应的片段。尽管从ggplot中提取数据在技术上是可行的,但它有点复杂,可能不在介绍性会议中。 (有关示例,请参见底部。)

根据我所见过的其他ggplot教程(例如其创建者的this one),更典型的做法是先显示数据帧的输入,并显示如何过滤数据变化情节。

这是一个应该起作用的过程。如果对您不起作用,请分享您收到的所有特定错误消息。

  1. 重新启动R。如果您使用的是RStudio,请单击“会话”->“重新启动R”。
  2. 加载库。该示例至少使用ggplot2和gapminder,也可能使用其他示例。

library(ggplot2)
library(gapminder)
library(dplyr)   # I think this is the source of the "filter" function used here

  1. 查看数据框。这是gapminder数据,具有1,704行。数据中的每个国家/地区每年都有一行,例如1952、1957等。

> 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
  1. 我们可以只过滤1957年的数据。(我不确定group = 1部分的用途–也许您的问题中没有提到更早的步骤?)

# Note: equivalent to `filter(gapminder, year == 1957)`
> filter(gapminder, gapminder$year == 1957)
# A tibble: 142 x 6
   country     continent  year lifeExp      pop gdpPercap
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
 1 Afghanistan Asia       1957    30.3  9240934      821.
 2 Albania     Europe     1957    59.3  1476505     1942.
 3 Algeria     Africa     1957    45.7 10270856     3014.
 4 Angola      Africa     1957    32.0  4561361     3828.
 5 Argentina   Americas   1957    64.4 19610538     6857.
 6 Australia   Oceania    1957    70.3  9712569    10950.
 7 Austria     Europe     1957    67.5  6965860     8843.
 8 Bahrain     Asia       1957    53.8   138655    11636.
 9 Bangladesh  Asia       1957    39.3 51365468      662.
10 Belgium     Europe     1957    69.2  8989111     9715.
# … with 132 more rows
  1. 将经过过滤的数据发送到ggplot中。 ggplot函数的第一项代表输入数据。 (我在这里省略了“ group = 1”,因为我不知道它的定义位置。该部分可能实际上属于aes(...)部分吗?group = 1有时在我们希望ggplot提供的地方使用一种统计信息,我们希望将整个数据集视为一个组,例如,如果要所有国家/地区的平均GDP而不是按洲划分的平均值...)

ggplot(filter(gapminder, gapminder$year==1987)) + 
  geom_point(aes(gdpPercap, lifeExp, color=continent, size=pop)) + 
  xlab("GDP per capita") + 
  ylab("Life expectancy at birth")

这是我得到的输出。有打ic吗?

enter image description here


从ggplot对象中提取数据。

这是相同的情节,分配给名为gg的对象:

gg <- ggplot(filter(gapminder, gapminder$year==1987)) + 
        geom_point(aes(gdpPercap, lifeExp, color=continent, size=pop)) + 
        xlab("GDP per capita") + 
        ylab("Life expectancy at birth")

该gg对象包含许多组件。在RStudio中,您可以检查它们并以交互方式提取组件。其中之一是源数据:

enter image description here

> gg[["data"]]
# A tibble: 142 x 6
   country     continent  year lifeExp       pop gdpPercap
   <fct>       <fct>     <int>   <dbl>     <int>     <dbl>
 1 Afghanistan Asia       1987    40.8  13867957      852.
 2 Albania     Europe     1987    72     3075321     3739.
 3 Algeria     Africa     1987    65.8  23254956     5681.
 4 Angola      Africa     1987    39.9   7874230     2430.
 5 Argentina   Americas   1987    70.8  31620918     9140.
 6 Australia   Oceania    1987    76.3  16257249    21889.
 7 Austria     Europe     1987    74.9   7578903    23688.
 8 Bahrain     Asia       1987    70.8    454612    18524.
 9 Bangladesh  Asia       1987    52.8 103764241      752.
10 Belgium     Europe     1987    75.4   9870200    22526.
# … with 132 more rows