2017-01-16 278 views
0

我有作为连接的列表。ggplot R错误离散值提供给连续的尺度

Site Name 5833    count ratio 
1 Boston  0 days per week 1  0.01428571 
2 Boston  1 day per week 6  0.08571429 
3 Boston  2 days per week 11  0.15714286 
4 Boston  3 days per week 5  0.07142857 
5 Seattle 0 days per week 2  0.02857143 
6 Seattle  1 day per week 6  0.08571429 
7 Seattle  2 days per week 10  0.14285714 
8 Seattle  3 days per week 8  0.11428571 

当我使用ggplot - 我必须使用名称< - “5833”,因为这将在以后投入的循环。

name <- "5833" 
ggplot(com_agg,aes(x=com_agg[,c(name)], y=ratio,fill=`Site Name`))+ 
geom_bar(stat = "identity", position = "dodge") 

我得到错误:

"Don't know how to automatically pick scale for object of type tbl_df/tbl/data.frame. 
Defaulting to continuous. Error: Discrete value supplied to continuous scale" 

我注意到列名的该数据帧的选择都将被包含在一对反引号的自动R.它可能是由于空格或特殊名称在列中。所以我不能简单地在ggplot中使用列的名称。

+1

做'class(com_agg [,c(name)])'。你应该看到它不是一个数字列,这是ggplot警告你的。 –

+1

另外,在'aes()'中传递一个* vector *而不是*列名*会导致更复杂的情节出现问题。 'y =比率',是好的;用'x = com_agg [,c(name)]'重新引用你的数据框是不好的。最好的办法是重新命名你的专栏,以便遵循标准专栏名称准则(不以数字开头)并使用'x = x5833'。 – Gregor

回答

0

即使没有正式验证变量的class,从连接的数据很明显,你逝去的字符串或因素,不看类。您可以轻松地将变量转换为数值通过运行:

com_agg$`5833` <- as.numeric(substr(com_agg$`5833`, 1, 1)) 

如果您的变量存在的复杂得多,在所提供的例子,你可以考虑看taRfix::desting或类似的功能,将允许您方便地处理这个小挑战。

我最喜欢解决这个问题将涉及到使用dplyr/ggplot管道,您可以轻松地应用您的转换,而无需创建另一个对象或修改现有对象的坐标。例如:

com_agg %>% 
    mutate(`5833` = as.numeric(substr(`5833`, 1, 1))) %>% 
    ggplot(aes(x = `5833`, y=ratio, fill =`Site Name`)) + 
     geom_bar(stat = "identity", position = "dodge") 

看来你正在使用的数据帧与check.names = FALSE创建,如:

data.frame("1" = 1, check.names = FALSE) 

做任何事情,我建议在此之前,你可以考虑使用syntatically正确名称,因此``在上面语法。您可以通过以下方式创建语法正确的名称:

make.names(names(dta)) 

对您的数据。如果你愿意,你可以介绍以下的语法来ggplot/dplyr管道:

setNames(make.names(names(.)), object = .) 

这将解决语法不正确的名称。例如5833将变为X5833。我认为这可能会让你的循环写得稍微繁琐一些,但是原则上,这是值得的,因为它可以让你免于使用``以及尝试使用常量作为列名的潜在未来事故。

+0

我必须在ggplot中使用x = com_agg [,c(name)],因为它位于for循环中,name是在每次迭代中传递的变量。即使我将名称更改为X5833,我仍然必须在循环中使用x = com_agg [,c(name)]。所以我不认为这可以帮助我。 – JamesWang

+0

@JamesWang这个名字是一个侧面评论。您可以使用get/paste组合使用X创建一个名称。关键在于你的变量是错误的,应该按照开始的建议转换为数字。 – Konrad

+0

@JamesWang仍然是在'ggplot'中使用动态列名的错误方法。更好的方法是使用'aes_','aes_q'或'aes_string'(请参阅这些示例的文档)。您拥有的方式将适用于简单的情节,但不适用于更复杂的情节,例如具有分面或分组数据的情节。 – Gregor

0

感谢所有响应。

我改变了变量名称以符合标准,以避免选择的喧嚣。其次,我在for循环中使用aes_string作为ggplot,这是在for循环中使用ggplot的有效方法。现在它工作了!

相关问题