2016-05-27 117 views
2

的ylim我試圖繪製類似於一個在這裏李克特量表情節:http://www.r-bloggers.com/plotting-likert-scales/下標李克特情節

使用說明在上面的鏈接,我能夠繪製。但是,我想在y軸上顯示某些文本(即下標)。

我需要將它們繪製爲a_[1x] b_[2x] c_[3x],其中我有3個不同的字符(a,b和c)分別顯示下標1x,2x和3x。

首先,我已經試過這樣:

ylim= c("a_1x","b_2x","c_3x") 

這工作得很好,但在y軸標不會出現。我真的需要繪製他們像a_[1x] b_[2x] c_[3x]

我也試過這樣:

ylim= c(expression('a'[1x]),expression('b'[2x]),expression('c'[3x])) 

但是,當我嘗試繪製它這將產生以下錯誤。

Error in diff(range(as.numeric(limits))) : 
    (list) object cannot be coerced to type 'double' 

這是生成likert圖的代碼。

likert(sgbar.likert, 
     ylim = yLabels, ## Here yLabels need to contain expression somehow? 
     xlab="Percentage", 
     main="Example Diverging Stacked Bar Chart for Likert Scale", 
     BrewerPaletteName="Blues", 
     sub="Likert Scale") 

編輯:

下面是完整的代碼,如果你們要重現該問題,並測試:

set.seed(1234) 
library(e1071) 
probs <- cbind(c(.4,.2/3,.2/3,.2/3,.4),c(.1/4,.1/4,.9,.1/4,.1/4),c(.2,.2,.2,.2,.2)) 
my.n <- 100 
my.len <- ncol(probs)*my.n 
raw <- matrix(NA,nrow=my.len,ncol=2) 
raw <- NULL 
for(i in 1:ncol(probs)){ 
raw <- rbind(raw, cbind(i,rdiscrete(my.n,probs=probs[,i],values=1:5))) 
} 

r <- data.frame(cbind(
as.numeric(row.names(tapply(raw[,2], raw[,1], mean))), 
tapply(raw[,2], raw[,1], mean), 
tapply(raw[,2], raw[,1], mean) + sqrt(tapply(raw[,2], raw[,1], var)/tapply(raw[,2], raw[,1], length)) * qnorm(1-.05/2,0,1), 
tapply(raw[,2], raw[,1], mean) - sqrt(tapply(raw[,2], raw[,1], var)/tapply(raw[,2], raw[,1], length)) * qnorm(1-.05/2,0,1) 
)) 
names(r) <- c("group","mean","ll","ul") 

gbar <- tapply(raw[,2], list(raw[,2], raw[,1]), length) 

sgbar <- data.frame(cbind(c(1:max(unique(raw[,1]))),t(gbar))) 

sgbar.likert<- sgbar[,2:6] 


require(grid) 
require(lattice) 
require(latticeExtra) 
require(HH) 
sgbar.likert<- sgbar[,2:6] 

yLabels = c("a_1x","b_2x","c_3x") # this works fine but it does not show expressions. 
#yLabels = c(expression(a[1*x]),expression(b[2*x]),expression(c[3*x])) # this causes the error above 

likert(sgbar.likert, 
     ylim = yLabels, ## Here yLabels need to contain expression somehow? 
     xlab="Percentage", 
     main="Example Diverging Stacked Bar Chart for Likert Scale", 
     BrewerPaletteName="Blues", 
     sub="Likert Scale") 

情節是這樣的:

enter image description here

回答

1

這是怎麼ggplot通常做到這一點:

library(ggplot2) 
qplot(S.ID, data = df) + scale_x_discrete(labels = c(expression(a[1*x]),expression(b[2*x]),expression(c[3*x]))) 

enter image description here

編輯:對不起,我以前沒有細看,但由於likert小區採用lattice,而不是ggplot2中,刻度標籤修改方法與我上面給出的不同。

但是,ylim不是修改標籤的正確方法。它實際上可以接受字符向量,我發現了,但它不能評估表達式。因此,您應該使用scales,這是確定如何繪製座標軸(包括限制,刻度,標籤)併爲y軸設置適當的組件的一般參數scales

yLabels = c(expression(a[1*x]),expression(b[2*x]),expression(c[3*x])) 
likert(sgbar.likert, 
     scales = list(y = list(labels = yLabels)), 
     xlab="Percentage", 
     main="Example Diverging Stacked Bar Chart for Likert Scale", 
     BrewerPaletteName="Blues", 
     sub="Likert Scale") 

enter image description here

邊注:感謝編輯的問題。它讓我更清楚地瞭解真正的問題,找到解決方案更容易。一如既往,提供可重現的例子是提出問題並獲得答案的最佳方式。

+0

感謝您的回覆,但我不確定您的建議。我應該在likert還是別的之後加上「+ scale_y_discrete(labels = c(expression(a [1 * x]),expression(b [2 * x]),expression(c [3 * x])))」當我嘗試「ylim = c(表達式(a [1 * x]),表達式(b [2 * x]),表達式(c [3 * x]))」時,它不起作用,產生相同的錯誤再次:差異錯誤(範圍(as.numeric(限制))): (列表)對象不能被強制鍵入'雙'。另外,如果我使用「ylim = c(」a_1x「,」b_2x「,」c_3x「)」,它可以正常工作,但不會顯示錶達式。 –

+0

非常感謝!你的解決方案運作良好 –

+0

我很感謝您的幫助。我想知道是否有方法顯示百分比的情節?就像這樣:https://strengejacke.files.wordpress.com/2013/07/sjplotlikert2.png –