Как добавить разные цветовые оттенки на фоне сюжета в R? - PullRequest
1 голос
/ 31 марта 2020

Я бы хотел затенять разные части моего сюжета разными цветами. Я пробовал следующее:

boxplot(DEMAND~INTERVAL, data = NewData, main = "Box Plot for Each 15-minute Interval", xlab = "Interval", ylab = "Demand (kW)", col="dark grey", border = "black")
rect(0,0,44,1,col = rgb(0,1,0,1/15))
rect(44,0,56,1,col = rgb(1,1,0,1/15))
rect(56,0,76,1,col = rgb(1,0,0,1/15))
rect(76,0,92,1,col = rgb(1,1,0,1/15))
rect(92,0,96,1,col = rgb(0,1,0,1/15))

Это производит следующее:

plot

Но возможно ли сделать сюжет таким, чтобы коробка и усы были показано поверх добавленных прямоугольников? Кроме того, как я могу гарантировать, что весь участок покрыт так, чтобы не было нависающих белых областей?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Поскольку вы используете базовую графику, вам нужно сначала создать пустую plot, добавить rect углы, а затем построить реальные данные.

До

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
rect(0.5,0,4,26, col = rgb(0,1,0,1/15))
rect(4,0,6.5,26, col = rgb(1,1,0,1/15))

before

После

bp <- boxplot(count ~ spray, data = InsectSprays, plot = FALSE)
xrange <- c(1L, length(bp$names)) + c(-0.5, 0.5)
yrange <- range(bp$stats)
plot(NA, type = "n", xlim = xrange, ylim = yrange,
     xaxt = "n", xlab = NA, ylab = NA)
axis(1, at = seq_along(bp$names), labels = bp$names)
rect(0.5,0,4,26, col = rgb(0,1,0,1/15))
rect(4,0,6.5,26, col = rgb(1,1,0,1/15))
boxplot(count ~ spray, data = InsectSprays, col = "lightgray", add = TRUE)

after

(Обратите внимание, что заполнение "lightgray" на втором графике нет цветовой окраски.)

В этом случае я не собираю данные дважды. Первый вызов не создает графика, но возвращает данные, которые нам нужны (при условии, что вам нужно сделать это несколько программно).

0 голосов
/ 31 марта 2020

Это будет не самое элегантное, но простое решение.

1) Чтобы охватить весь регион - не начинайте свои прямоугольники с 0, пусть они начинаются с значений x ниже 0 и y- значения ниже 0.

2) Чтобы вывести блокпосты перед графиком, вызовите блокпост снова, после добавления прямоугольников, еще раз, с add=TRUE

Вот демонстрация :

boxplot(weight ~ feed, data=chickwts)
rect(-1000, -1000, 1.5, 1000, col=adjustcolor("red", 0.1))
rect(1.5, -1000, 3.5, 1000, col=adjustcolor("orange", 0.1))
rect(3.5, -1000, 5.5, 1000, col=adjustcolor("blue", 0.1))
rect(5.5, -1000, 1000, 1000, col=adjustcolor("green", 0.1))
boxplot(weight ~ feed, data=chickwts, add=TRUE)

box1

Для более элегантного решения: начните с пустого графика, добавьте прямоугольники, затем добавьте прямоугольники в конце.

colors <- c("red", "orange", "blue", "green")

plot.new()
plot.window(xlim=c(0.5, length(unique(chickwts$feed))+0.5), ylim=range(chickwts$weight))
rect(c(-1000,1.5,3.5,5.5), -1000, c(1.5,3.5,5.5,1000), 1000, col=adjustcolor(colors, 0.1))
boxplot(weight ~ feed, data=chickwts, add=TRUE)

Что даст вам тот же результат.

...