首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:$操作符对原子向量- ggtern无效

错误:$操作符对原子向量- ggtern无效
EN

Stack Overflow用户
提问于 2020-03-09 22:41:31
回答 2查看 2.5K关注 0票数 2

免责声明: R.

你好!我试图用ggtern包绘制水化学样品的三元图。试图运行以下代码会导致标题错误。

代码语言:javascript
复制
require(ggtern)

datos = read.csv("Li, B, Cl.csv", header = T, sep = ";", stringsAsFactors = FALSE)
names(datos) <- c("Muestra", "Li", "B", "Cl")

x11()
plot <- ggtern(data = datos, mapping = aes(x = as.numeric(datos[["Li"]]), y = as.numeric(datos[["Cl"]]), z = as.numeric(datos[["B"]]))) + geom_point()
plot

据我所知,有一些低级函数需要一个原子向量,但我给ggtern作为输入,data.frame (通过str()检查)。

一旦执行,脚本就不会画任何东西。我的数据格式如下,但分号分隔:

Muestra Li B Cl XYA3030 2.321334755 3.017842551 94.66082269 XEP3609 9.436334248 45.43581846 45.12784729 XEP3606_1 10.12604478 62.68726944 27.18668578 XEP3606_2 5.18367492 34.94305194 59.87327314 XEP3611 5.859786577 18.8098607 75.33035272 XEP3613 13.60173875 49.1191375 37.27912375 XEP3612 13.11960754 27.07316925 59.80722321 XEP3608 6.473636887 15.58523589 77.94112722 XEP3543 16.93515603 46.59573787 36.4691061

这是注释中建议的"dput(datos)“输出。

代码语言:javascript
复制
> dput(datos)

structure(list(Muestra = c("XYA3030", "XEP3609", "XEP3606_1", 
"XEP3606_2", "XEP3611", "XEP3613", "XEP3612", "XEP3608", "XEP3543"
), Li = c(2.321334755, 9.436334248, 10.12604478, 5.18367492, 
5.859786577, 13.60173875, 13.11960754, 6.473636887, 16.93515603
), B = c(3.017842551, 45.43581846, 62.68726944, 34.94305194, 
18.8098607, 49.1191375, 27.07316925, 15.58523589, 46.59573787
), Cl = c(94.66082269, 45.12784729, 27.18668578, 59.87327314, 
75.33035272, 37.27912375, 59.80722321, 77.94112722, 36.4691061
)), class = "data.frame", row.names = c(NA, -9L))

更新:尝试了我能想出的最简单的代码,但仍然没有成功。我错过了一些基本的东西吗?

代码语言:javascript
复制
library(ggtern)
datos = read.csv("Li_B_Cl.csv", header = T, sep = ";", stringsAsFactors = FALSE)
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()

更新2:清除RStudio会话和包,重新安装ggtern和ggplot2,然后运行简单的代码。不走运。下面是错误后的回溯:

代码语言:javascript
复制
> datos = read.csv("Li_B_Cl.csv", header = TRUE, sep = ";", stringsAsFactors = FALSE)
> ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()
Error: $ operator is invalid for atomic vectors
> traceback()
17: transform_position(data, panel_params$x$rescale, panel_params$y$rescale)
16: f(...)
15: self$super()$super()$transform(data, scale_details)
14: f(..., self = self)
13: self$transform(ex, scale_details)
12: .get.tern.extremes(self, list(x.range = self$limits$x, y.range = self$limits$y))
11: f(..., self = self)
10: self$coord$setup_panel_params(scale_x, scale_y, params = self$coord_params)
9: (function (scale_x, scale_y) 
   {
       self$coord$setup_panel_params(scale_x, scale_y, params = self$coord_params)
   })(dots[[1L]][[1L]], dots[[2L]][[1L]])
8: mapply(FUN = f, ..., SIMPLIFY = FALSE)
7: Map(setup_panel_params, scales_x, scales_y)
6: f(..., self = self)
5: layout$setup_panel_params()
4: ggplot_build.ggplot(x)
3: ggplot_build(x)
2: print.ggplot(x)
1: (function (x, ...) 
   UseMethod("print"))(x)
EN

回答 2

Stack Overflow用户

发布于 2020-03-09 23:22:42

更改为aes中的名称为我修复了它:

代码语言:javascript
复制
library(ggtern)
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()

通常,aes使用名称(或符号),意思是无引号。有时,这是不可取的,例如,您要么不提前知道名称,要么因为另一个原因而想通过编程方式这样做。在有变量名称字符串的情况下,也可以这样做:

代码语言:javascript
复制
ggtern(data = datos, mapping = aes_string(x = "Li", y = "Cl", z = "B")) + geom_point()

(或者var1 <- "Li",然后是aes_string(x=var1, ...))。

还有其他使用quos之类的rlang-ways来做事情,不一定与您的问题相关。

另一件要考虑的事情是,通常你指的是变量,而不是向量。在您的代码中,您有x = as.numeric(datos[["Li"]]),它试图传递一个值的向量。这似乎是有道理的,虽然这是行不通的。允许ggplot2 (和ggtern,通过继承)管理数据的一个最好的原因是做一些技巧,否则需要更多的外部/手动跟踪。例如,您可以让一个层只处理数据的一个子集:

代码语言:javascript
复制
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point() +
  geom_point(color = "red", data = ~ subset(., grepl("XYA", Muestra)))
# the "." means "data as it exists so far" ^^^

(将一个“红色”点涂成红色,而不必自己去处理)。当您传递给ggplot(data=...)ggplot(data=...)的数据是预先过滤的和/或在管道的末尾时,这尤其有用,否则您必须以层的形式重新创建数据。所以..。使用名称/符号,不要试图使用向量。

票数 2
EN

Stack Overflow用户

发布于 2020-03-12 20:10:11

使用install.packages(url, repos=NULL, type="source")和惊喜手动重新安装由@r2evans (ggplot2-3.2.1,ggtern-3.1.0)指示的软件包版本!啊,真灵。我正在运行R3.6.3,如果相关的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60609292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档