Барплот с 2 переменными, 2 оси Y - PullRequest
4 голосов
/ 24 марта 2012

У меня есть следующие данные

test<-data.frame(group=1:10, var.a=rnorm(n=10,mean=500,sd=20), var.b=runif(10))

Я бы хотел столбик с осью 2 y (один для var.a, один для var.2).Каждая группа (ось x, 1:10) должна иметь 2 столбца рядом друг с другом, один для var.a и один для var.b.

Я не могу использовать одну ось y из-за разницыВеличина var.a и var.b

Возможно ли это с базой R?

Спасибо

1 Ответ

7 голосов
/ 24 марта 2012

Чтобы использовать пакет graphics в R, можно создать новые переменные в виде значений в var.a и var.b, преобразованных в пропорции максимальных значений в соответствующей переменной:

test <- data.frame(group = 1:10, var.a = rnorm(n = 10, mean = 500, sd = 20),
  var.b = runif(10))

funProp <- function(testCol) {
    test[, testCol]/max(test[, testCol])
}

test$var.a.prop <- funProp("var.a")
test$var.b.prop <- funProp("var.b")

Затем нарисуйте график, используя barplot() без осей:

barplot(t(as.matrix(test[, c("var.a.prop", "var.b.prop")])), beside = TRUE,
  yaxt = "n", names.arg = test$group)

Затем добавьте оси слева и справа, используя исходные диапазоны значений для меток (аргумент labels) и пропорциональное значение.диапазоны для размещения надписей на осях (аргумент at) (эта часть не симпатичная, но она выполняет свою работу):

axis(2, at = seq(0, max(test$var.a.prop), length.out = 10),
  labels = round(seq(0, max(test$var.a), length.out = 10)))

axis(4, at = seq(0, max(test$var.b.prop), length.out = 10),
  labels = round(seq(0, max(test$var.b), length.out = 10), 2))

(извините за отсутствие изображения)

РЕДАКТИРОВАТЬ:

Чтобы получить немного осей pretty er,

myLeftAxisLabs <- pretty(seq(0, max(test$var.a), length.out = 10))
myRightAxisLabs <- pretty(seq(0, max(test$var.b), length.out = 10))

myLeftAxisAt <- myLeftAxisLabs/max(test$var.a)
myRightAxisAt <- myRightAxisLabs/max(test$var.b)

barplot(t(as.matrix(test[, c("var.a.prop", "var.b.prop")])),
  beside = TRUE, yaxt = "n", names.arg = test$group,
  ylim=c(0, max(c(myLeftAxisAt, myRightAxisAt))))

axis(2, at = myLeftAxisAt, labels = myLeftAxisLabs)

axis(4, at = myRightAxisAt, labels = myRightAxisLabs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...