2017-01-16 2 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" 

Я заметил, что выбор имени столбца для этого dataframe должен быть включены в паре кавычки автоматически в R. это может быть связанно с пространством или специальным имя в столбцах. поэтому я не могу просто использовать имя столбца в ggplot.

+1

do 'class (com_agg [, c (name)])'. Вы должны увидеть, что это не числовой столбец, о котором предупреждает ggplot. –

+1

Кроме того, передача символа * vector *, а не * столбца * внутри 'aes()' вызовет проблемы в более сложных графиках. 'y = ratio', хорошо; переназначение вашего фрейма данных с помощью '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) 

, прежде чем делать что-нибудь, я бы предположить, что вы можете рассмотреть возможность использования синтаксически правильно имена, следовательно `` в синтаксисе выше. Вы можете создать синтаксически правильные имена, запустив:

make.names(names(dta)) 

по вашим данным. Если вы хотите, вы можете ввести следующий синтаксис для вашего трубопровода ggplot/dplyr:

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

Это исправить бы синтаксически неправильные имена. Например, 5833 станет X5833. Я считаю, что это может сделать ваши петли немного более утомительными для написания, но, в принципе, это стоит того, чтобы избавить вас от использования `` и возможных будущих неудач с попыткой использовать константу в качестве имени столбца.

+0

Мне нужно использовать x = com_agg [, c (name)] в ggplot, потому что это в цикле for, а name - это переменная, которая передается на каждой итерации. Даже я меняю имя на X5833. Я все еще должен использовать x = com_agg [, c (name)] в цикле. поэтому я не вижу, чтобы это помогло мне. – JamesWang

+0

@JamesWang Название было побочным комментарием. Вы можете создать имя с помощью X, используя комбинацию get/paste. Главное, что переменная имеет неправильное время и должна быть преобразована в числовую, как это было предложено в начале. – Konrad

+0

@JamesWang, это по-прежнему неправильный способ использования динамических имен столбцов в 'ggplot'. Лучше всего использовать 'aes_',' aes_q' или 'aes_string' (см. Документацию на примерах). То, как вы будете работать, будет работать на простых сюжетах, но никогда не будет работать для более сложных графиков, таких как графики с фасетками или бинными данными. – Gregor

0

Спасибо за все отзывы.

Я изменил имена переменных, чтобы они соответствовали стандарту, чтобы избежать суеты выбора. во-вторых, я использовал aes_string для цикла ggplot внутри цикла, и это оказывается эффективным способом использования ggplot внутри цикла for. теперь он работает!

 Смежные вопросы

  • Нет связанных вопросов^_^