2015-11-20 45 views
2

我有4个实验组比例响应数据,以计算每个组2个不同的统计离散值。我想下图(我可以实现):řggplot geom_bar错误:供给到连续刻度

enter image description here

我获得该图用下面的代码:

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)) 

我得到

Error: Discrete value supplied to continuous scale 

所以我明白这意味着我有一个非连续变量。我试图通过使用as.numeric()和无数其他选项来转换我的统计变量,但无济于事。如果有人能够帮助我解决这个问题,并且/或者解释导致这个问题的原因,我会非常感激。

回答

4

问题是内部data.frame多余使用的cbindcbind创建矩阵。矩阵必须具有相同模式的所有值(数字,字符等)。由于至少有一个变量(本例中为两个)为字符模式,所以cbind强制Val也具有字符。 data.frame将三个字符变量转换为因子。无论哪种方式,Val是一个离散(绝对)值而不是数字,当您使用scale_y_continuous时会导致错误。

更改为dfm2 <- data.frame(Group,Statistic,Val)和错误会自行消失。

您可以检查数据类型的cbinddata.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

+0

啊!谢谢 - 现在效果很好。即使我错误地使用了cbind(),我在创建数据框后调用了dfm2 $ Val <-as.numeric(dfm2 $ Val)。 str(dfm2)显示$ Val作为数字然后;但我仍然有错误。所以这就是我困惑的原因。关于为什么as.numeric()调整不起作用的任何想法? –

+0

当我进行'as.numeric'转换并且绘制它时,我不会收到错误。但是,当您转换因子变量时,您需要先转换为字符,然后转换为数字,否则您将获得关卡的因子编号代码,而不是数据的实际值。比较'dfm2 $ Val2 = as.numeric(dfm2 $ Val)'和'dfm2 $ Val3 = as.numeric(as.character(dfm2 $ Val))''。 – eipi10

0

请尝试以下操作。

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))