我有一个简单的代码片段来生成条形图,但条形图最终会“溢出”图像。谷歌和无数的R论坛没有帮助,所以这是我最后的努力:
pdf(file="output.pdf", height=5, width=8)
par(las=1)
bar_colors <- c("royalblue4", "gray")
subjects <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)",
"Pol. Sc.\n(40.4%)", "Psychology\n(69.8%)")
aVals <- c(52.36, 52.00, 55.43, 56.08, 62.89)
bVals <- c(53.57, 52.93, 56.07, 58.86, 63.87)
height <- rbind(aVals, bVals)
barplot(height, beside=T, axisnames=T, col=bar_colors, ylim=c(50,65),
xlab="Disciplines (% of women)", ylab = "Classification accuracy (%)",
names.arg=subjects)
legend("topleft", c("bVals", "bVals"), cex=1, fill=bar_colors)
# to produce pdf output
dev.off()
无论我做什么,条形图都会在x轴下方溢出(如此处所示的截图)。任何帮助都非常感谢。哦,另一点:我对R很新,所以如果有一些非常基本的错误,请原谅我。
答案 0 :(得分:1)
一旦我注意到ylim=c(50,65)
的添加会导致条形溢出,找到修复相对容易。在致电xpd = FALSE
时添加barplot()
。
参考。 https://stat.ethz.ch/pipermail/r-help/2005-February/066308.html
答案 1 :(得分:1)
所呈现的图表并未使用所提供的代码绘制,但它已接近。改变xpd是一个解决方案,但我想建议另一个。不要使用条形图。条形图应该从0开始。它们专门用于计数数据。它们对条形图中的所有值应用特殊含义而不是外部条带,并根据条形图的位置使值的评级不同。 R在最初做你想做的事情失败的原因是因为它试图做正确的事并从0开始。
下面的图表使用了大量墨水,同时使aVals和bVals的比较更加容易。有些人可能不喜欢连接点的线,因为x轴是分类的,但如果你的主要目标是在Vals中进行比较并且变量非常明确,那么这是可以的,因为它更好地强调了这一点。此外,对于这样一个简单的图形,现在一个图例是多余的,可以直接标记线条。
(顺便说一句,我认为最好分别为每个学科绘制男性和女性aVals和bVals。)
par(las=1, bty = 'n')
point_colors <- c("royalblue4", "gray")
subjects <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)",
"Pol. Sc.\n(40.4%)", "Psychology\n(69.8%)")
aVals <- c(52.36, 52.00, 55.43, 56.08, 62.89)
bVals <- c(53.57, 52.93, 56.07, 58.86, 63.87)
n <- length(aVals)
plot(1:n, aVals, ylim = c(50, 65), type = 'l', col=point_colors[1], xlab="Disciplines (% of women)", ylab = "Classification accuracy (%)", xaxt = 'n', panel.first = grid(nx = NA, ny = NULL))
lines(1:n, bVals, col = point_colors[2])
axis(1, 1:5, subjects, cex.axis = 0.85, tcl = -0.1)
text(c(3.25, 3.5), c(54, 59), c('aVals', 'bVals'))
您可以从那里构建以进一步可视化数据。你已经明确地对待了这些学科,但是你有信息使它们成为数字变量。你突出了部门中女性的比例。为什么不让x-graph符合那个尺度?它可能会在数据中显示不同的内容,并使线条连接可能更有意义。试试这个。
par(las=1, bty = 'n')
point_colors <- c("royalblue4", "gray")
subjects <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)",
"Pol. Sc.\n(40.4%)", "Psychology\n(69.8%)")
xpos <- c(17.2, 19.6, 29.4, 40.4, 69.8)
aVals <- c(52.36, 52.00, 55.43, 56.08, 62.89)
bVals <- c(53.57, 52.93, 56.07, 58.86, 63.87)
n <- length(aVals)
plot(xpos, aVals, ylim = c(50, 65), type = 'l', col=point_colors[1], xlab="Disciplines (% of women)", ylab = "Classification accuracy (%)", xaxt = 'n', panel.first = grid(nx = NA, ny = NULL))
lines(xpos, bVals, col = point_colors[2])
axis(1, xpos, subjects, cex.axis = 0.85, tcl = -0.1)
text(c(3.25, 3.5), c(54, 59), c('aVals', 'bVals'))
好吧,不可否认,我们已经失去了物理学,但这可以通过多种方式处理。您可以将标签移动到%值以下,并允许它们滑动一点或使用箭头指向该点。我会把它留给你。这似乎表明了一种或多或少的线性关系。 (虽然我怀疑实际上是这种情况,因为比例通常不会那样)。无论如何,我唯一要做的就是走出barplot盒子是一个好主意。
(你也可能想谷歌“炸药情节”并看到他们不喜欢的很多原因)