Построение диаграммы на гистограмме в R - PullRequest
2 голосов
/ 05 апреля 2020

Я пытаюсь наложить гистограмму на составную полосу, но она всегда сдвигается вправо, так как она начинает строить с нуля. Ниже приведен пример того, что я пытаюсь сделать (без использования ggplot, возможно, мне следует добавить).

set.seed(1)

dat <- rnorm(1000, sd = 10)
h <- hist(dat)
cnt <- h$counts
breaks <- h$breaks

mat <- matrix(NA, nrow = 3, ncol = length(cnt))
for(i in 1:length(cnt)){
  sample <- sample(1:3, size = cnt[i], replace = TRUE)
  for(j in 1:3){
    mat[j, i] <- sum(sample == j)
  }
}

barplot(mat, add = TRUE, width = unique(diff(breaks)), space = 0, 
        col = c("blue", "green", "orange"))

Вывод этого кода выглядит следующим образом:

enter image description here

Я пытался использовать в столбце матрицы имена столбцов, которые указывают позицию, но безрезультатно. В графике, который я хочу создать, гистограмма будет полностью переполнена, так как она должна быть точно в том же месте, что и барплот. Во-первых, причина его построения заключается в том, что я хочу ось, которую дает мне график гистограммы. Любые идеи о том, как это сделать, очень ценятся.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Вы можете комбинировать средние значения бара barplot вывода консоли и разрывы hist для создания axis тиков; вычтите половину ширины барплота из середины бара. Использование mtext дает лучший контроль над метками осей.

h <- hist(dat, plot=FALSE)
# [...]

.width <- unique(diff(breaks))
b <- barplot(mat, width=.width, space=0, 
        col=c("blue", "green", "orange"))
axis(1, b-.width/2, labels=FALSE)
mtext(h$breaks[-length(h$breaks)], 1, 1, at=b-.width/2)

enter image description here

Редактировать

.width <- unique(diff(breaks))
b <- barplot(mat, width=.width, space=0, 
             col=c("blue", "green", "orange"))
ats <- seq(0, par()$usr[2], 5)
mod <- (ats + 5) %% 20 == 0
labs <- h$breaks
axis(1, ats[mod], labels=FALSE)
mtext(labs[mod], 1, 1, at=ats[mod])

enter image description here

0 голосов
/ 05 апреля 2020

Я бы просто установил ручную ось х на барплот с желаемыми метками в желаемой позиции, например:

barplot(mat, width = unique(diff(breaks)),space = 0,  
        col = c("blue", "green", "orange"))
axis(1,at=c(15,35,55,75),labels = c(-20,0,20,40))


enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...