我的原始数据
head(predictionDB)
Helpful X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22
1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
2 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0
我使用以下代码对其进行了汇总:
plotDB <- aggregate(predictionDB,
list(predictionDB$Helpful),
mean)
这是输出数据
> plotDB
Group.1 Helpful X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22
1 0 0 0.1666192 0.1857021 0.2418114 0.2258616 0.1774423 0.1874110 0.2603247 0.1777271 0.1407007 0.1540872 0.1794361 0.174879 0.1859869 0.3691256 0.2574765 0.1569353 0.2455141 0.1726004 0.1572202 0.2016520 0.2267160 0.1911136
2 1 1 0.2896282 0.3180039 0.2896282 0.3072407 0.2666341 0.3228963 0.2793542 0.2818004 0.2504892 0.2607632 0.2588063 0.316047 0.3317025 0.2896282 0.3003914 0.2656556 0.3047945 0.2999022 0.3126223 0.3131115 0.2813112 0.3131115
现在,我想创建一个在x轴上包含变量的图,以便比较所有变量X的均值(对于有用= 0和有用= 1)。
使用以下代码为我提供了每个变量都需要两个有用类的图,但x轴上根本没有标签。
问题:
barplot(t(as.matrix(plotDB[,3:nTopicsLDA])),
beside=TRUE)
其中nTopicsLDA是数字变量,在这种情况下为22。
非常感谢您!
答案 0 :(得分:1)
由于barplot
使用基础矩阵的列标题作为x轴标签,因此由于t(as.matrix(...))
返回空的colnames
,因此您的绘图不会呈现x轴标签:
colnames(t(as.matrix(plotDB[,3:nTopicsLDA])))
# NULL
考虑将宽数据框架重塑为长格式(通常是大多数数据分析操作(包括绘图)的首选结构),并使用tapply
构建绘图矩阵:
# RESHAPE WIDE TO LONG
predictionDB_long <- reshape(predictionDB, idvar = "Helpful",
varying=names(predictionDB)[-1], v.names="Value",
times = names(predictionDB)[-1], timevar = "X",
new.row.names = 1:1E5, direction="long")
# TAPPLY MEAN CALL ON TWO GROUPINGS FOR 2-D MATRIX
plot_mat <- with(predictionDB_long, tapply(Value, list(X, Helpful), mean))
# RE-ORDER COLUMNS
plot_mat <- plot_mat[paste0("X", 1:nTopicsLDA),]
这样做, plot_mat 的colnames
成为x轴标签。但是,默认情况下仅渲染一个x轴标签:
# BAR PLOT WITH ONE AXIS
barplot(plot_mat, ylim=c(0, 0.6), beside=TRUE, cex.names=0.75,
main = "Mean Helpful Bar Plot")
对于两个轴,您需要定制的解决方案,例如调用axis()
,以根据字体大小相应地调整水平和填充参数。了解如何集成row.names
。请注意 Helpful 条的二进制集之间的中间空间的容纳情况:
# BAR PLOT WITH TWO AXES
barplot(plot_mat, ylim=c(0, 0.6), beside=TRUE, cex.names=0.75,
main = "Mean Helpful Bar Plot")
axis(1, at=1:(nTopicsLDA*2 + 2), hadj=-0.5, padj=-2,
labels=c(row.names(plot_mat), "", row.names(plot_mat), ""), cex.axis=0.5)
数据
set.seed(9132019)
predictionDB <- data.frame(Helpful = sample(c(0, 1), 500, replace=TRUE),
replicate(22, sample(c(0, 1), 500, replace=TRUE))
)
nTopicsLDA <- ncol(predictionDB) - 1