Подтвердить что ты не робот

Добавить цвет в boxplot - ошибка "Непрерывное значение, заданное для дискретного масштаба"

Возможно, очень простое решение моей проблемы, но я не смог найти удовлетворительный ответ в Интернете.

Используя следующую команду, я смог создать следующий граф boxplot и наложить его на отдельные точки данных:

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age))

Есть несколько вещей, которые я хотел бы добавить/изменить:

1. Измените цвет линии и/или заливку каждого квадрата (в зависимости от "Возраст" ), используя 6 разных цветов слева направо:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

Я пробовал

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

но это приводит к ошибке "Continuous value supplied to discrete scale".

2. Измените цвет каждой точки данных (в зависимости от "Возраст" ), используя 6 разных цветов слева направо:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

Я пробовал:

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

но также приводит к ошибке:

Непрерывное значение, подаваемое в дискретный масштаб

3. Измените текст в легенде на "0 месяц", "1 месяц", "3 месяца", "6 месяцев", "9 месяцев", "12 месяцев"

4b9b3361

Ответ 1

Во-первых, предоставление выборочных данных поможет. Поскольку вы этого не сделали, вот некоторые из них:

MYdata <- data.frame(Age = rep(c(0,1,3,6,9,12), each=20),
                    Richness = rnorm(120, 10000, 2500))

Части 1 и 2 связаны с одной и той же проблемой. Age - непрерывная переменная, но вы пытаетесь использовать ее в дискретном масштабе (указав цвет для определенных значений возраста). В общем случае масштаб отображает переменную на визуальную; для непрерывного возраста есть соответствующий цвет для любого возможного значения возраста, а не только те, которые появляются в ваших данных. Тем не менее, вы можете одновременно рассматривать возраст как категориальную переменную (фактор) для некоторой эстетики. Для третьей части вашего вопроса, в описании масштаба, вы можете определить конкретные метки, соответствующие конкретным перерывам в шкале. Соединяя это все вместе (и добавляя что-то, чтобы дать вам ось x, помеченную больше как то, что у вас есть в примере):

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(fill=factor(Age))) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) +
  scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

enter image description here

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

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(colour=factor(Age)), fill=NA) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

enter image description here

Наконец, подумайте, действительно ли вам нужно по-разному окрасить каждый возраст, так как они уже четко определены по оси x.