【问题标题】:Data.table not returning correct plotsData.table 没有返回正确的图
【发布时间】:2017-04-21 07:32:28
【问题描述】:

开始学习data.table包,想尝试绘图。

library(data.table)
DT <- data.table(iris)

DT[, plot(Sepal.Length, Sepal.Width, main = Species), by = Species]

返回的结果与示例不同

DT1 <- DT[Species == "setosa"]
DT1[, plot(Sepal.Length, Sepal.Width, main = Species)]

第二个显示所有观察结果,而第一个不显示。

有没有我还没学过的完美逻辑解释?还是我的图形有问题?

【问题讨论】:

标签: r plot data.table


【解决方案1】:

问题和解决方法已在Saving plots in a data.table list column 中报告。

似乎该问题与基础 plot() 有关,因为 ggplot2 正在按预期工作,例如,

library(data.table)
DT[, print(ggplot(.SD, aes(Sepal.Length, Sepal.Width, color = Species)) +
             geom_point()), by = Species]

例如,创建一系列三个图,这些图显示在 RStudio 的 Plots 窗格中。第一个看起来像:

但是,以plot() 为基数

par(mfrow=c(1,3))
DT[, plot(Sepal.Length, Sepal.Width, main = Species), by = Species]

一些数据点被剪掉了:

正如 Frank in his comment 所述,一种解决方法是确保变量按值传递,例如,通过添加 0。因此,此解决方法将创建一个包含所有数据点的基础图:

par(mfrow=c(1,3))
DT[, plot(Sepal.Length + 0, Sepal.Width + 0, main = Species), by = Species]

请注意,0 必须添加到两个变量中。

编辑如果使用 非数字数据(因此添加 0 不可行),Frank suggested使用另一种方法按值传递数据

DT[, with(copy(.SD), plot(Sepal.Length, Sepal.Width, main = Species)), by = Species]

【讨论】:

  • 如果有人使用非数字数据(所以 +0 不可行),也许DT[, with(copy(.SD), plot(Sepal.Length, Sepal.Width, main = Species)), by = Species]
【解决方案2】:

在第一部分中,您尝试绘制每个物种级别的两个变量。尝试更改 par 以查看您要达到的目标:

par(mfrow=c(1,3))
DT[, plot(Sepal.Length, Sepal.Width, main = Species), by = Species]

在第二种情况下,您绘制 iris 但未指定条件变量,重复主列(我认为!)

【讨论】:

  • 我曾尝试使用 mfrow(c(2, 2)) 进行绘图,但我不明白为什么这些绘图“不正确”。如果我想按平均值计算组,那不是问题。为什么在用均值替换绘图时会引起问题?
  • 抱歉,没听懂你的问题。这确实看起来很奇怪,我不知道为什么会这样。如果 versicolor/virginica 的子集没有足够奇怪的问题,所以它本身不是第一个因素水平。
  • 噗,复杂的东西,想不通。似乎 plot 覆盖了 DT 中的 by= 命令,无论您做什么,都只会绘制完整的数据集 (DT[,plot(Sepal.Length,Sepal.Width,main=Species,xlim=c(4.5,8),ylim=c(2,3.4)),by=Species])。一种选择是首先输出所需的列并绘制结果。祝你好运!
  • 上述方法有效,但不是可选选项。将查看作者是否签入并有解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多