2

我有一个简单的代码片段来生成条形图,但条形最终会“溢出”图像。谷歌和无数的 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 很陌生,所以如果有一些非常基本的错误,请原谅我。

这是输出(从屏幕截图中截取)

4

2 回答 2

3

一旦我注意到是添加ylim=c(50,65)导致条形溢出,找到修复相对容易。xpd = FALSE调用时添加barplot()

参考。https://stat.ethz.ch/pipermail/r-help/2005-February/066308.html

于 2013-09-19T20:22:28.680 回答
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'))

在此处输入图像描述

好的,诚然我们已经失去了物理学,但这可以通过多种方式来处理。您可以将标签移动到 % 值下方并允许它们滑动一点或使用箭头指向该点。我会把它留给你。这似乎表明了或多或少的线性关系。(尽管我怀疑实际情况是否如此,因为比例通常不会那样表现)。无论如何,我想要说明的唯一一点是,走出条形图框是个好主意。

(你也可能想谷歌“炸药情节”,看看他们不喜欢的很多原因)

于 2013-09-19T20:43:01.817 回答