在Likert的ylim中的下标

时间:2016-05-27 05:37:11

标签: r plot substring

我试图在这里绘制一个类似于一个的Likert比例图: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 个答案:

答案 0 :(得分: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轴设置适当的组件。

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

SIDE NOTE:感谢您编辑问题。它让我对真正的问题有了更清晰的认识,并且更容易找到解决方案。与往常一样,提供可重复的示例是提出问题并获得答案的最佳方式。