Вообще, такая задача встречается крайне редко, потому что гистограммы печатаются отлично и без того, при помощи специальной функции hist()
. Более того, если зачем-то нужно именно напечатать ее при помощи plot()
, то можно записать гистограмму в объект, а потом напечатать объект при помощи plot()
:
hist.x <- hist(x)
plot(hist.x)
Однако мне пришлось решить не совсем тривиальную задачу. Надо было напечатать в черно-белом варианте две просвечивающие сквозь друг друга гистограммы, назовем их A и B, с доволно узкими бинами. Будь бины широкими, разнонаправленная штриховка «читалась» бы легко, и то в глазах бы рябило, но с узкими все выглядело совсем плохо, хотя, конечно, при большом желании, читалось.
Мне же надо было сделать так, чтобы даже те, кто не имеет большого желания, поняли, что тут надо увидеть. Тогда я подумал, что было бы неплохо сделать одну из гистограмм (B) черной, оставив другую (A) заштрихованной, однако оставалась одна проблема: с определенного момента столбики B оказывались систематически выше, чем столбики A, в результате чего столбики A были бы совершенно не видны.
Тогда я подумал, что можно напечатать B поверх A, а после этого напечатать поверх них еще одну гистограмму, C, со штриховкой белого цвета, тогда будет казаться, что A просвечивает сквозь B тонкими белыми линиями.
Оставалось решить только одну проблему: A и B генерировались стандартной функцией hist()
, а откуда брать C, было ясно только в общих чертах. Теретически, надо было собрать объект «гистограмма» при помощи веревочной петли и палки, а потом подсунуть его функции plot()
для печати. По сути, гистограмма -- это определенной формы объект класса list
, в котором в виде числовых векторов хранятся данные о границах (breaks
) и центрах (mids
) бинов, их высотах (counts
) и кое-какая еще информация, уже не так нужная для того конкретного рисунка, который я собирался напечатать, так что задача не представлялась неразрешимой. Постепенно, после нескольких проб и ошибок, это смутное понимание оформилось в скрипт (имена объектов изменены):
# Недолго думая я использовал первую попытку печати гистограмм,
# чтобы создать объекты hist.A и hist.B:
hist.A <- hist(A$x, xlim=c(0,50), breaks=-.5:100.5, angle=45, density=22)
hist.B <- hist(B$x, breaks=-.5:152.5, angle=-45, density=22, add=TRUE)
counts <- NULL
# Мне надо было нарисовать увеличенно только часть гистограммы,
# поэтому я взял по 50 бинов от каждой (понятно, что можно было
# взять обе целиком, ту, в которой бинов было меньше, дополнить
# нулями в counts).
for(i in 1:50){
if(hist.A$counts[i] < hist.B$counts[i]){
counts <- c(counts, hist.A$counts[i])}
else{
counts <- c(counts, hist.B$counts[i])}
}
}
breaks <- -.5:50.5
mids <- 0:50
equidist <- TRUE
# Теперь собираем гистограмму:
hist.C <- list(
breaks,
counts,
mids,
equidist
)
# Добавляем имена элементов объекта:
names(hist.C) <- c(
"breaks",
"counts",
"mids",
"equidist"
)
# Добавляем специфическое имя класса ("histogram"):
attributes(hist.C$class) <- "histogram"
Оставалось только напечатать все это.
hist(A$x, xlim=c(0,30), breaks=-.5:100.5, angle=45, density=22, main="", xlab="Legend for x-axis")
hist(B$x, breaks=-.5:152.5, col=1, add=TRUE)
plot(hist.C, col="white", density=22, add=TRUE)
Там еще легенду пришлось вручную напечатать, но это такие танцы были с rect()
и text()
, что лучше о них не рассказывать.