我有一个数据框,其中一个变量(让我们称之为Q1)有几个级别:“不使用”,“30分钟”,“1小时”,“2小时”,“3小时以上”。< / p>
如何绘制条形图(),其中条形按因子级别排列?我尝试使用sort(),但这并不能解决问题。
编辑:根据要求,提供一些样本数据:
Q1
1 hour
1 hour
30 min
2 hours
3+ hours
3+ hours
3+ hours
3+ hours
2 hours
1 hour
2 hours
1 hour
30 min
我试过了:
barplot(table(sort(Q1)), main = "Q1 Answer Distribution", ylim = c(0, 250), cex.axis=0.9)
但它没有给我我需要的东西。
答案 0 :(得分:4)
一种可能性是创建Q1的factor
版本,您可以按所需顺序指定levels
:
df$Q1_fac <- factor(df$Q1, levels = c("30 min", "1 hour", "2 hours", "3+ hours"))
tt <- table(df$Q1_fac)
tt
# Q1_fac
# 30 min 1 hour 2 hours 3+ hours
# 2 4 3 4
barplot(tt)
答案 1 :(得分:3)
如Henrik所述,您需要将数据放入一个因素中(至少这是实现这一目标的最简单方法)。请考虑以下示例以及一些虚假数据...
#generate 1000 random uniform integers between 1 and 5
data <- floor(runif(1000, 1,6))
#make data a factor with given labels
fdata <- factor(data,
labels = c("No use",
"30 min",
"1 hour",
"2 hours",
"3+ hours"))
这可以在带有图的基础r中完成(当未指定y时不需要条形图)
#in base R, just use plot - when y is missing, barplot is produced
plot(fdata)
你也可以在ggplot2中绘图
#in ggplot2
require(ggplot2)
#make a dataframe
df <- data.frame(id = seq(1:length(fdata)),
fdata = fdata)
#plot via geom_bar
ggplot(df, aes(fdata)) + geom_bar()
从原始示例开始,除了指定级别之外,您还需要设置ordered=TRUE
,如下所示。否则,“不使用”仍将显示在列表的末尾。
#get data into a factor (provided data plus "No use")
q1 <- c("No use"
,"1 hour"
,"1 hour"
,"30 min"
,"2 hours"
,"3+ hours"
,"3+ hours"
,"3+ hours"
,"3+ hours"
,"2 hours"
,"1 hour"
,"2 hours"
,"1 hour"
,"30 min")
q1f = factor(q1,
levels = c("No use",
"30 min",
"1 hour",
"2 hours",
"3+ hours"),
ordered=TRUE)
然后你可以应用上面显示的绘图逻辑......