将绘图导出到 Plot.ly 时出错

Posted

技术标签:

【中文标题】将绘图导出到 Plot.ly 时出错【英文标题】:Errors when exporting plots to Plot.ly 【发布时间】:2015-03-07 20:22:06 【问题描述】:

我有这些数据(前 20 行的样本):

编码变量值 1 Z1 Week.0 0 2 Z2 Week.0 0 3 Z3 Week.0 0 4 Z4 Week.0 0 5 Z5 Week.0 0 6 Z6 Week.0 0 7 Z7 Week.0 0 8 Z8 Week.0 0 9 Z9 Week.0 0 10 Z101 Week.0 不适用 11 Z102 Week.0 不适用 12 Z1 Week.1 0 13 Z2 Week.1 0 14 Z3 Week.1 0 15 Z4 Week.1 0 16 Z5 Week.1 0 17 Z6 Week.1 0 18 Z7 Week.1 0 19 Z8 Week.1 0

我使用以下方法绘制它:

pZ <- ggplot(zmeltdata,aes(x=variable,y=value,color=Codering,group=Codering)) + 
  geom_line()+
  geom_point()+
  theme_few()+
  theme(legend.position="right")+
  scale_color_hue(name = "Treatment group:")+
  scale_y_continuous(labels = percent)+
  ylab("Germination percentage")+
  xlab("Week number")+
  labs(title = "Z. monophyllum germination data")
pZ

图表显示得很好:

然而,当我想将其导出到 Plot.ly 时,我收到以下错误:

> py <- plotly()
> response<-py$ggplotly(pZ)
Error in if (all(xcomp) && all(ycomp))  : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In trace.list[[lind[1]]]$y == trace.list[[lind[2]]]$y :
  longer object length is not a multiple of shorter object length

我已经搜索了这些错误,但解释完全让我感到困惑。 “需要 TRUE/FALSE 的缺失值。”如果您在流程中使用 IF/ELSE/TRUE/FALSE 等逻辑术语,则应该会发生这种情况,而我根本不会!即使在我得到的图表值中检查任何 NA 时:

> is.na(pZ)
       data      layers      scales     mapping       theme coordinates       facet    plot_env      labels 
      FALSE       FALSE       FALSE       FALSE       FALSE       FALSE       FALSE       FALSE       FALSE 

当您有不同长度的对象时,应该会弹出“较长的对象长度不是较短对象长度的倍数”,但我只使用 1 个具有 3 行长度完全相同的对象。当我询问这些行时,图表的值确实给了我NULL,但这应该会发生..

> nrow(zmeltdata)
[1] 143
> nrow(test)
NULL

总而言之,我很困惑,不知道如何正确处理这些错误,谁能详细说明?

感谢您的宝贵时间。

编辑:我尝试使用 1:100 的随机样本将不同的图表导出到 Plot.ly 并且效果很好,我很确定错误在我的数据中,我只是想不通如何解决它。

EDIT2:回应@Gregor:

> dput(head(zmeltdata, 20))
structure(list(Codering = structure(c(16L, 19L, 20L, 21L, 22L, 
23L, 24L, 25L, 26L, 17L, 18L, 16L, 19L, 20L, 21L, 22L, 23L, 24L, 
25L, 26L), .Label = c("B1", "C2", "C3", "C8", "M1", "M101", "M102", 
"M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "Z1", "Z101", 
"Z102", "Z2", "Z3", "Z4", "Z5", "Z6", "Z7", "Z8", "Z9"), class = "factor"), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Week.0", 
    "Week.1", "Week.2", "Week.3", "Week.4", "Week.5", "Week.6", 
    "Week.7", "Week.8", "Week.9", "Week.10", "Week.11", "Week.12"
    ), class = "factor"), value = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    NA, NA, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Codering", 
"variable", "value"), row.names = c(NA, 20L), class = "data.frame")

还有尾巴:

> dput(tail(zmeltdata, 43))
structure(list(Codering = structure(c(19L, 20L, 21L, 22L, 23L, 
24L, 25L, 26L, 17L, 18L, 16L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
26L, 17L, 18L, 16L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 17L, 
18L, 16L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 17L, 18L), .Label = c("B1", 
"C2", "C3", "C8", "M1", "M101", "M102", "M2", "M3", "M4", "M5", 
"M6", "M7", "M8", "M9", "Z1", "Z101", "Z102", "Z2", "Z3", "Z4", 
"Z5", "Z6", "Z7", "Z8", "Z9"), class = "factor"), variable = structure(c(10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L), .Label = c("Week.0", "Week.1", "Week.2", "Week.3", 
"Week.4", "Week.5", "Week.6", "Week.7", "Week.8", "Week.9", "Week.10", 
"Week.11", "Week.12"), class = "factor"), value = c(0.1, 0.06, 
0.05, 0.09, 0.04, 0.08, 0.05, 0.08, 0, 0, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("Codering", 
"variable", "value"), row.names = 101:143, class = "data.frame")

我对这些一点也不感到惊讶,数据集中有相当多的 NA,但它们不应该被证明是一个问题,因为我之前使用过类似(更大)的数据集。

如果您愿意,我也有 .csv 文件供您使用:https://www.mediafire.com/?jij1vlp14a29ntt

【问题讨论】:

请以更可复制的格式分享您的数据...如果您使用dput(head(zmeltdata, 20)),它将看起来丑陋但非常有用(我们将能够复制/将其粘贴到 R 中并知道所有列类是什么)。此外,如果您的问题出在您的数据中并且您的前 100 行有效,那么您可能应该发布(或只是检查)最后 43 行数据 (dput(tail(zmeltdata, 43))) 没问题@Gregor:如果您有兴趣,我已经包含了数据文件本身。谨慎起见,病毒扫描:virustotal.com/en/file/… 【参考方案1】:

问题是关于处理 NA 的...我通过运行以下代码得到了 https://plot.ly/~marianne2/417/z-monophyllum-germination-data/:

pZ <- ggplot(na.omit(zmeltdata), aes(x=variable, y=value, color=Codering,
                                 group=Codering)) +
  geom_line() +
  geom_point() +
  # theme_few() +
  theme(legend.position="right") +
  scale_color_hue(name="Treatment group:") +
  # scale_y_continuous(labels = percent) +
  ylab("Germination percentage") +
  xlab("Week number") +
  labs(title="Z. monophyllum germination data")

py$ggplotly(pZ, kwargs=list(fileopt="overwrite", filename="test_zdata"))

请注意,我必须注释掉 theme_few()scale_y_continuous(labels = percent),因为仅加载“ggplot2”会出现以下错误:

Error: could not find function "theme_few"

Error in structure(list(call = match.call(), aesthetics = aesthetics,  : 
object 'percent' not found

分别。我猜这些是依赖问题(也许您使用的是“ggthemes”版本?)。

我不知道theme_few() 有什么魔法,但如果我不在zmeltdata 上使用na.omit(),我的pZ 情节如下所示:

Eww,“Week.10”在“Week.1”之后而不是在“Week.9”之后......所以你无论如何都不想把它发送给 plotly!所以我不能完全重现你的 ggplot 例子。但我想知道你是否真的想保留这些 NA(CSV 本身读取“NA”,我期待空白的“单元格”)。你不想对这些进行预处理吗?

请注意,当我不在 zmeltdata 上使用 na.omit() 时,我会收到以下警告消息:

Warning messages:
1: Removed 20 rows containing missing values (geom_path).
2: Removed 47 rows containing missing values (geom_point).

再次,除了纯粹的显示/绘图考虑之外,由于这看起来像科学数据,您不想用实际数字对周数进行编号,或者如果您真的想要一个字符串则填充数字? (“Week.01”、“Week.02”等) 而且看起来丢失的数据都在尾随... 10+ 周内(还)没有数据,对吧?

感谢您的报告,

玛丽安

【讨论】:

谢谢玛丽安。在我问的上一个问题中,有人建议我使用“长”数据格式而不是“宽”,我自己也不会使用。省略 NA 是有效的,并且允许我将图表导出到 Plot.ly! plot.ly/~YoeriGod/52/z-monophyllum-germination-data 谢谢你:)。

以上是关于将绘图导出到 Plot.ly 时出错的主要内容,如果未能解决你的问题,请参考以下文章

OrgChart向导通过VBA导出到Visio时出错

转换绘图视图时iOS绘图出错

jupyter实验室中的plot.ly离线模式不显示绘图

plot.ly 悬停框大小属性

将 GridPanel (EXT) 导出到 Excel 时出错

将 SQL 导出到 CSV 时出错 - 管道