ggplot r error提供给连续刻度的离散值

时间:2017-01-16 16:58:07

标签: r dataframe ggplot2 type-conversion

我附上了一份清单。

    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”,因为这将在稍后进入for循环。

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中的列名。

2 个答案:

答案 0 :(得分: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)

在做任何事情之前,我建议您考虑使用语法正确的名称,因此在上面的语法中使用 `` 。您可以通过运行以下命令来创建语法正确的名称:

make.names(names(dta))

关于您的数据。如果您愿意,可以在ggplot / dplyr管道中引入以下语法:

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

这将修复语法错误的名称。例如,5833将成为X5833。我认为这可能会使你的循环写得稍微繁琐,但原则上它值得做,因为它会让你使用 `` 以及尝试使用常量作为列名的潜在未来意外

答案 1 :(得分:0)

感谢所有回复。

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