Рисование прямоугольников на boxplot (ggplot2 в R) - PullRequest
0 голосов
/ 01 июля 2019

На примере данных mtcars я сгенерировал коробочную диаграмму и хотел бы добавить прямоугольники.Вот мой полный код.

 library(ggplot2)
 d=data.frame(x1=c(1,3,1,5,4), x2=c(2,4,3,6,6), y1=c(10,10,20,14,30), y2=c(15,20,25,18,35), t=c('a','a','a','b','b'))
 ggplot(mtcars, aes(x = as.factor(mtcars$carb), y = mpg)) + geom_boxplot() + geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)

Однако, это не работает из-за эстетической проблемы.Я не понимаю почему, потому что каждая из двух вышеуказанных частей работает отдельно, поэтому:

 #part 1 (works)
 ggplot(mtcars, aes(x = as.factor(mtcars$carb), y = mpg)) + geom_boxplot()

 #part 2 (works)
 ggplot() + geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)

Буду признателен за любые предложения.Спасибо.

1 Ответ

1 голос
/ 01 июля 2019

Вот пример того, как это может работать. Важно то, что ggplot ожидает, что оси X всех слоев будут либо непрерывными, либо дискретными, а не смесью. (И то же самое для осей Y.)

В вашем примере ось прямоугольника x находится в дискретном (или порядковом) масштабе, как если бы у вас было одно место для «апельсина», а другое для «ананаса». Но прямоугольник определяется в непрерывном масштабе, например 1, 2, 3. ggplot обычно требует, чтобы вы выбрали один или другой тип; При необходимости вы можете привести одно в другое, но вам нужно определить, как это сделать. то есть "2" слева или справа от "ананаса"?

Таким образом, чтобы это работало, вы не можете подать слой geom_plot в качестве коэффициента для оси x, по крайней мере, без преобразования его в числовое значение. Здесь я просто оставляю его как исходное число, с которого он начинался, и добавляю термин group = carb, чтобы мы получили коробочный график для каждого значения углеводов, а не для всех их в общей сложности в одной группе.

ggplot(mtcars) + 
  geom_boxplot(aes(x = carb, y = mpg, group = carb)) +
  geom_rect(data=d, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)

enter image description here

...