我试图在这里绘制一个类似于一个的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")
情节如下:
答案 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])))
编辑:很抱歉我之前没有仔细查看,但由于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")
SIDE NOTE:感谢您编辑问题。它让我对真正的问题有了更清晰的认识,并且更容易找到解决方案。与往常一样,提供可重复的示例是提出问题并获得答案的最佳方式。