R ggplot geom_bar Ошибка: дискретное значение передается в непрерывном масштабе

У меня есть пропорциональные данные ответа для 4 экспериментальных групп, с 2 разными статистическими данными, рассчитанными для каждой группы. Я хочу следующую цифру (которую я могу достичь):

введите здесь описание изображения

Я получаю эту цифру с помощью следующего кода:

Group<-c('a','b','c','d','a','b','c','d')
Statistic<-c('Mean','Mean','Mean','Mean','d','d','d','d')
Val<-c(.75,.83,.79,.69,.5,.02,.1,.3)
dfm2<-data.frame(cbind(Group,Statistic,Val)) 
ggplot(dfm2,aes(x = Group,y = Val)) +    
 geom_bar(aes(fill = Statistic),position = dodge',stat='identity')

Однако, когда я изменяю пределы оси Y (на [0,1], так как у меня есть пропорции), добавляя строку кода:

+ scale_y_continuous(limits=c(0, 1))

я получил

Ошибка: дискретное значение передается на непрерывную шкалу

Итак, я понимаю, что это означает, что у меня есть непрерывная переменная. Я пытался преобразовать свою статистическую переменную, используя as.numeric() и множество других опций, но безрезультатно. Если кто-нибудь может помочь мне в решении этой проблемы и / или объяснить, что ее вызывает, я был бы очень признателен.


person Chris Z.    schedule 20.11.2015    source источник


Ответы (2)


Проблема в ненужном использовании cbind внутри data.frame. cbind создает матрицу. Матрица должна иметь все значения одного вида (числовые, символьные и т. д.). Поскольку по крайней мере одна из переменных (в данном случае две) является символьным режимом, cbind также приводит Val к символьному. data.frame преобразует три символьные переменные в фактор. В любом случае Val является дискретным (категориальным) значением, а не числовым, что приводит к ошибке при использовании scale_y_continuous.

Измените на dfm2 <- data.frame(Group,Statistic,Val) и ошибка исчезнет.

Вы можете проверить влияние cbind и data.frame на типы данных следующим образом:

cbind(Group, Statistic, Val)

     Group Statistic Val   
[1,] "a"   "Mean"    "0.75"
[2,] "b"   "Mean"    "0.83"
...
[7,] "c"   "d"       "0.1" 
[8,] "d"   "d"       "0.3" 

dfm2<-data.frame(cbind(Group,Statistic,Val))
str(dfm2)

'data.frame':   8 obs. of  3 variables:
$ Group    : Factor w/ 4 levels "a","b","c","d": 1 2 3 4 1 2 3 4
$ Statistic: Factor w/ 2 levels "d","Mean": 2 2 2 2 1 1 1 1
$ Val      : Factor w/ 8 levels "0.02","0.1","0.3",..: 6 8 7 5 4 1 2 3

dfm2 <- data.frame(Group,Statistic,Val)
str(dfm2)

'data.frame':   8 obs. of  3 variables:
$ Group    : Factor w/ 4 levels "a","b","c","d": 1 2 3 4 1 2 3 4
$ Statistic: Factor w/ 2 levels "d","Mean": 2 2 2 2 1 1 1 1
$ Val      : num  0.75 0.83 0.79 0.69 0.5 0.02 0.1 0.3

Если вы не хотите, чтобы data.frame преобразовывал строки в множители, добавьте аргумент stringsAsFactors=FALSE.

person eipi10    schedule 20.11.2015
comment
Ах! Спасибо - теперь отлично работает. Даже когда я неправильно использовал cbind(), я вызывал dfm2$Val‹-as.numeric(dfm2$Val) после создания фрейма данных. Тогда str(dfm2) показывал $Val как числовое; но я все еще получил ошибку. Вот почему я был сбит с толку. Любые идеи о том, почему настройка as.numeric() не сработала? - person Chris Z.; 20.11.2015
comment
Я не получаю сообщение об ошибке, когда выполняю преобразование as.numeric, а затем рисую его. Однако, когда вы конвертируете факторную переменную, вам нужно сначала преобразовать ее в символьную, а затем в числовую, иначе вы получите коды факторных чисел для уровней, а не фактические значения данных. Сравните dfm2$Val2 = as.numeric(dfm2$Val) и dfm2$Val3 = as.numeric(as.character(dfm2$Val)). - person eipi10; 20.11.2015

Попробуйте следующее.

ggplot(dfm2,aes(x = Group,y = as.numeric(as.character(Val)))) +    
  geom_bar(aes(fill = Statistic),position = 'dodge',stat='identity')+
  scale_y_continuous(limits=c(0, 1))
person yc_hello    schedule 06.12.2017