我知道已经提出了类似的问题,但是没有提供的答案解决了我在R中叠加条形图的问题。
我想生成一个带有两个y值的条形图,具有相同的x值。
第二系列y值表示第一系列y值的子集。因此,我想将第一个系列1绘制为条形图,然后叠加系列2。
我想要呈现y2系列的叠加,只有y1系列的一半尺寸(设置宽度= 0.5)。 不幸的是,这会将第二个系列的所有条形向左移动。
然后,我可以围绕创建一个空格向量(spaces = c(0.9, 1.4, 1.4, 1.4)
),但我无法想出自动化它。
有人能建议一个聪明的解决方案吗?
非常感谢您提前, 沃纳
# x-values
number_aa <- c(6, 7, 8, 9, 10)
# y1-values
peptide_total <- c(62040, 57755, 50053, 45077, 39011)
# y2-values
peptide_unique <- c(56791, 54978, 47943, 43248, 37658)
# determine ymax (from y1-values)
ymax <- peptide_total[which.max(peptide_total)]
ymax
# determine xmax (from x-values)
xmax <- number_aa[which.max(number_aa)]
xmax
# assign vector of midpoint-values of first barplot (y1) to x
x <- barplot(peptide_total, names.arg = number_aa,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 1)
# set plotting to overlay (no new plot)
par(new = TRUE)
barplot(peptide_unique, col = 'black', names.arg=x,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 0.5,
axisnames = FALSE)
# ----> second bar plot is not aligned on first barplot
=============================================== =========================
===&GT;这是在@ G5W
的响应之后添加的我希望看到以下内容,了解用于为条形图设置width
和space
选项的系统。
将以下代码用于条形图2:
# creating second barplot
space_vector = c(0.9, rep(1.4, 4))
barplot(peptide_unique, col = 'black', names.arg=x,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 0.5, space = space_vector,
axisnames = FALSE)
[ 2
答案 0 :(得分:2)
对于第二个条形图,增加间距。
barplot(peptide_unique, col = 'black', names.arg=x,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 0.5, space=c(0.4,rep(1.4,4)),
axisnames = FALSE)
无论你制作了多少条,如果你坚持使用宽度= 0.5
第二栏,您可以使用spacing = space=c(0.9,rep(1.4,length(number_aa)-1))
把第二个酒吧放在第一个酒吧的中心。 (制作第一个号码
0.4得到它在左边,1.4得到它在右边。)
您可以计算出这应该有效。 barplot的文档说:
空间
每个条形之前留下的空间量(作为平均条宽的一部分)。
第一个条形图使用了默认值width = 1
和space = 0.2
。
第一个酒吧从0.2开始。中心位于0.2 + 0.5 = 0.7。
每个后续条移动1.2(0.2间距+条宽度为1.0)。
由于第二组的所有条的宽度均为0.5,因此平均值也为0.5。
您希望第二组中的每个条都位于第一组的条上。
如果您对第一个条形使用spacing = 0.9
,则其左边缘将为
spacing * bar_width = 0.9 * 0.5 = 0.45
。移动到酒吧的中心将添加
0.5 * 0.5 = 0.25因此第一个条的中心将为0.7,这对齐
与第一组的第一个条的中心。因为我们正在使用
对于第二组中的其余条形,空间= 1.4,每个条形将移动
超过spacing * bar_width + bar_width = 1.4*0.5 + 0.5 = 1.2
同意
使用第一组中每个柱移动的量。
要确认此计算,您只能生成大量垃圾数据集 使用不同数量的条并确认它们排成一行。这是代码 和你的一样,但价值没有实际意义,它们只是说明性的。 尝试将NumTypes = 10的值更改为各种值以说服自己 这是正确的。
NumTypes = 11
number_aa <- 6:(5+NumTypes)
peptide_total <- sort(rnorm(NumTypes, 51000,9000), decreasing=TRUE)
peptide_unique <- sort(rnorm(NumTypes, 47000,8000), decreasing=TRUE)
# determine ymax (from y1-values)
ymax <- peptide_total[which.max(peptide_total)]
ymax
xmax <- number_aa[which.max(number_aa)]
xmax
# assign vector of midpoint-values of first barplot (y1) to x
x <- barplot(peptide_total, names.arg = number_aa,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 1)
# set plotting to overlay (no new plot)
par(new = TRUE)
barplot(peptide_unique, col = 'black', names.arg=x,
xlim = c(0, xmax), ylim = c(0, ymax),
width = 0.5, space=c(0.9,rep(1.4,length(number_aa)-1)),
axisnames = FALSE)